mirror of
				https://github.com/boostorg/smart_ptr.git
				synced 2025-11-03 01:01:54 +01:00 
			
		
		
		
	Compare commits
	
		
			232 Commits
		
	
	
		
			feature/ow
			...
			feature/gh
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					1dcc441ca1 | ||
| 
						 | 
					cdf118b15b | ||
| 
						 | 
					ab75e1f892 | ||
| 
						 | 
					dcfb560de3 | ||
| 
						 | 
					362fb1d677 | ||
| 
						 | 
					79dac0e691 | ||
| 
						 | 
					d08d035bdf | ||
| 
						 | 
					709e446968 | ||
| 
						 | 
					0b0924ff82 | ||
| 
						 | 
					e7433ba545 | ||
| 
						 | 
					785a17aaaf | ||
| 
						 | 
					576d31f206 | ||
| 
						 | 
					1b89a64e9b | ||
| 
						 | 
					840e2ff1a8 | ||
| 
						 | 
					622e2c3f83 | ||
| 
						 | 
					0630607f39 | ||
| 
						 | 
					316f4cef77 | ||
| 
						 | 
					9e866b8a95 | ||
| 
						 | 
					cd01b87478 | ||
| 
						 | 
					b3a4c39456 | ||
| 
						 | 
					5cdd3585db | ||
| 
						 | 
					916c8a7d7c | ||
| 
						 | 
					beaf20e7b5 | ||
| 
						 | 
					5e6b3a9702 | ||
| 
						 | 
					63589908b5 | ||
| 
						 | 
					9466e73cbe | ||
| 
						 | 
					b12e342c52 | ||
| 
						 | 
					7f880bc205 | ||
| 
						 | 
					90fd5a1fc9 | ||
| 
						 | 
					0bedddbf16 | ||
| 
						 | 
					173cf9ad7b | ||
| 
						 | 
					9db2b96843 | ||
| 
						 | 
					9b309184f8 | ||
| 
						 | 
					7c87ae7985 | ||
| 
						 | 
					f2abcf1654 | ||
| 
						 | 
					1361171bac | ||
| 
						 | 
					c5023afe04 | ||
| 
						 | 
					7cfc326207 | ||
| 
						 | 
					6b7effc83d | ||
| 
						 | 
					89b4fa2552 | ||
| 
						 | 
					f991bdc8b3 | ||
| 
						 | 
					f57b455020 | ||
| 
						 | 
					8b22f5cb4f | ||
| 
						 | 
					1c988756d5 | ||
| 
						 | 
					890b661909 | ||
| 
						 | 
					ab13ffa91d | ||
| 
						 | 
					950ef1c130 | ||
| 
						 | 
					fc43a2b9d1 | ||
| 
						 | 
					df366326e1 | ||
| 
						 | 
					d77c27986e | ||
| 
						 | 
					dbceed6210 | ||
| 
						 | 
					9ed43780e4 | ||
| 
						 | 
					9026b9c556 | ||
| 
						 | 
					c4fed8ca7f | ||
| 
						 | 
					f866c6a9ae | ||
| 
						 | 
					87a4dc144f | ||
| 
						 | 
					e6529af03f | ||
| 
						 | 
					b521582d46 | ||
| 
						 | 
					ca64f5c015 | ||
| 
						 | 
					9a1d7008eb | ||
| 
						 | 
					8a03c71a28 | ||
| 
						 | 
					222323dc49 | ||
| 
						 | 
					62fd6baa48 | ||
| 
						 | 
					96ef19e72d | ||
| 
						 | 
					78057574cf | ||
| 
						 | 
					03e1bb314b | ||
| 
						 | 
					505ed6753d | ||
| 
						 | 
					82bee8581d | ||
| 
						 | 
					b4174f66fa | ||
| 
						 | 
					bf31a25fa5 | ||
| 
						 | 
					06da5cd574 | ||
| 
						 | 
					c0c6244297 | ||
| 
						 | 
					b0200dd829 | ||
| 
						 | 
					7f7e3748cf | ||
| 
						 | 
					682b285a21 | ||
| 
						 | 
					94d31304f3 | ||
| 
						 | 
					aa1a9ef2d7 | ||
| 
						 | 
					63ac28d26f | ||
| 
						 | 
					72a019944c | ||
| 
						 | 
					12733a052b | ||
| 
						 | 
					e5472d59d1 | ||
| 
						 | 
					d58213cfcb | ||
| 
						 | 
					38d54034d7 | ||
| 
						 | 
					8863958e8d | ||
| 
						 | 
					123040290c | ||
| 
						 | 
					abb0071ca6 | ||
| 
						 | 
					000c7ae5ac | ||
| 
						 | 
					f11b931cfd | ||
| 
						 | 
					5d8304d2cc | ||
| 
						 | 
					044d1f2cb9 | ||
| 
						 | 
					dccecc2500 | ||
| 
						 | 
					0aa32dc692 | ||
| 
						 | 
					b4a0629b63 | ||
| 
						 | 
					38b737c490 | ||
| 
						 | 
					314267a5f7 | ||
| 
						 | 
					ce308f21e8 | ||
| 
						 | 
					cd0b99380e | ||
| 
						 | 
					0e6dd82e8e | ||
| 
						 | 
					569b07b91c | ||
| 
						 | 
					bd0419c290 | ||
| 
						 | 
					26cf7ff744 | ||
| 
						 | 
					c132c339c7 | ||
| 
						 | 
					4a3432759d | ||
| 
						 | 
					3832411d31 | ||
| 
						 | 
					66e6f9b2ef | ||
| 
						 | 
					d2c2407585 | ||
| 
						 | 
					694e6822ac | ||
| 
						 | 
					fd94706918 | ||
| 
						 | 
					c5e1280b77 | ||
| 
						 | 
					d66b173710 | ||
| 
						 | 
					d908c4d288 | ||
| 
						 | 
					41a36f89ec | ||
| 
						 | 
					c1e7bd1a51 | ||
| 
						 | 
					1dddd9f306 | ||
| 
						 | 
					e9c54b2430 | ||
| 
						 | 
					17e299f11e | ||
| 
						 | 
					71902a7bdb | ||
| 
						 | 
					e9790f99f7 | ||
| 
						 | 
					d4c605e6ff | ||
| 
						 | 
					f5152b0904 | ||
| 
						 | 
					7caada352c | ||
| 
						 | 
					11e56a4ad9 | ||
| 
						 | 
					c33504189a | ||
| 
						 | 
					960741cb2e | ||
| 
						 | 
					c8ef3e2276 | ||
| 
						 | 
					72c25383d5 | ||
| 
						 | 
					6b826f1139 | ||
| 
						 | 
					591d0e0728 | ||
| 
						 | 
					e86015f9f6 | ||
| 
						 | 
					4f9487d0f3 | ||
| 
						 | 
					0925dcce4e | ||
| 
						 | 
					6bc7ec7e6b | ||
| 
						 | 
					1650077eee | ||
| 
						 | 
					635dfe46ee | ||
| 
						 | 
					fc0eeeffa6 | ||
| 
						 | 
					4df3174d4a | ||
| 
						 | 
					1a51e0f02c | ||
| 
						 | 
					c4ae5e0c42 | ||
| 
						 | 
					85b0ab073c | ||
| 
						 | 
					ac9154d1e5 | ||
| 
						 | 
					788313fda2 | ||
| 
						 | 
					3ef8cfd02f | ||
| 
						 | 
					cd2aac8442 | ||
| 
						 | 
					3ca07d82a7 | ||
| 
						 | 
					f8303629f1 | ||
| 
						 | 
					ef0e40bcda | ||
| 
						 | 
					4af91d46f1 | ||
| 
						 | 
					42dfdc9e51 | ||
| 
						 | 
					763c7f56cd | ||
| 
						 | 
					029f089a4a | ||
| 
						 | 
					66d11714bd | ||
| 
						 | 
					ac0381f0b8 | ||
| 
						 | 
					13be03abf8 | ||
| 
						 | 
					5e7596ef06 | ||
| 
						 | 
					ef1651449f | ||
| 
						 | 
					b34786c4d4 | ||
| 
						 | 
					aacfb25c82 | ||
| 
						 | 
					c7349834be | ||
| 
						 | 
					414b0a65d9 | ||
| 
						 | 
					bcb2566e74 | ||
| 
						 | 
					7070f9b3f8 | ||
| 
						 | 
					78fd14f412 | ||
| 
						 | 
					861622d329 | ||
| 
						 | 
					366c60ad3b | ||
| 
						 | 
					331c50132b | ||
| 
						 | 
					97c9204a95 | ||
| 
						 | 
					c577d68b02 | ||
| 
						 | 
					2ce29622f5 | ||
| 
						 | 
					7e9c54ffa2 | ||
| 
						 | 
					ca8d5216fc | ||
| 
						 | 
					79e46f1719 | ||
| 
						 | 
					e6b5dc5ada | ||
| 
						 | 
					dd57aa5b70 | ||
| 
						 | 
					e4637b8500 | ||
| 
						 | 
					a0d4ec3915 | ||
| 
						 | 
					59b5b17e81 | ||
| 
						 | 
					f2ab3b21f0 | ||
| 
						 | 
					e04196b6a1 | ||
| 
						 | 
					95eaa2d7c3 | ||
| 
						 | 
					2e31d0d633 | ||
| 
						 | 
					b8cb132ab4 | ||
| 
						 | 
					f4d7116241 | ||
| 
						 | 
					f2cc84a23c | ||
| 
						 | 
					f12a33813d | ||
| 
						 | 
					cfde4f7407 | ||
| 
						 | 
					b8d340b495 | ||
| 
						 | 
					6716193d9c | ||
| 
						 | 
					8f40bff2f6 | ||
| 
						 | 
					1ef8f4e72d | ||
| 
						 | 
					f651a49d96 | ||
| 
						 | 
					598314b8e1 | ||
| 
						 | 
					72221d1da0 | ||
| 
						 | 
					2cbeb5b185 | ||
| 
						 | 
					67e657c228 | ||
| 
						 | 
					eba3cf92e7 | ||
| 
						 | 
					8340a13539 | ||
| 
						 | 
					098d0f4ce3 | ||
| 
						 | 
					fec5fb97c8 | ||
| 
						 | 
					b52d7548b3 | ||
| 
						 | 
					594c7485a5 | ||
| 
						 | 
					d751041fb9 | ||
| 
						 | 
					d41546ddce | ||
| 
						 | 
					f3424e74e8 | ||
| 
						 | 
					0eee7efd54 | ||
| 
						 | 
					dc2a127369 | ||
| 
						 | 
					42575a0e51 | ||
| 
						 | 
					64b2eac868 | ||
| 
						 | 
					856ed108e8 | ||
| 
						 | 
					678a544d27 | ||
| 
						 | 
					f1b06df6f4 | ||
| 
						 | 
					620620df3d | ||
| 
						 | 
					0bd61c1089 | ||
| 
						 | 
					d1295a9974 | ||
| 
						 | 
					6e8c15c02f | ||
| 
						 | 
					7c0dcd338a | ||
| 
						 | 
					8d79ceaf8a | ||
| 
						 | 
					d35cf29b99 | ||
| 
						 | 
					72ca834ae8 | ||
| 
						 | 
					8afe162910 | ||
| 
						 | 
					5d31c1c443 | ||
| 
						 | 
					3db4ad9a15 | ||
| 
						 | 
					d0655ab145 | ||
| 
						 | 
					7c01e640f7 | ||
| 
						 | 
					00db1e02c6 | ||
| 
						 | 
					914b93430a | ||
| 
						 | 
					15ffd7852b | ||
| 
						 | 
					c66c4f5ed1 | ||
| 
						 | 
					7e9d8c39a3 | ||
| 
						 | 
					a0d08b17e0 | ||
| 
						 | 
					108a86cdbd | ||
| 
						 | 
					d08bdc86e5 | ||
| 
						 | 
					f8dcf5f6f4 | 
							
								
								
									
										422
									
								
								.drone.jsonnet
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										422
									
								
								.drone.jsonnet
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,422 @@
 | 
			
		||||
# Copyright 2022 Peter Dimov
 | 
			
		||||
# Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
# https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
local library = "smart_ptr";
 | 
			
		||||
 | 
			
		||||
local triggers =
 | 
			
		||||
{
 | 
			
		||||
    branch: [ "master", "develop", "feature/*" ]
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
local ubsan = { UBSAN: '1', UBSAN_OPTIONS: 'print_stacktrace=1' };
 | 
			
		||||
local asan = { ASAN: '1' };
 | 
			
		||||
 | 
			
		||||
local linux_pipeline(name, image, environment, packages = "", sources = [], arch = "amd64") =
 | 
			
		||||
{
 | 
			
		||||
    name: name,
 | 
			
		||||
    kind: "pipeline",
 | 
			
		||||
    type: "docker",
 | 
			
		||||
    trigger: triggers,
 | 
			
		||||
    platform:
 | 
			
		||||
    {
 | 
			
		||||
        os: "linux",
 | 
			
		||||
        arch: arch
 | 
			
		||||
    },
 | 
			
		||||
    steps:
 | 
			
		||||
    [
 | 
			
		||||
        {
 | 
			
		||||
            name: "everything",
 | 
			
		||||
            image: image,
 | 
			
		||||
            environment: environment,
 | 
			
		||||
            commands:
 | 
			
		||||
            [
 | 
			
		||||
                'set -e',
 | 
			
		||||
                'uname -a',
 | 
			
		||||
                'echo $DRONE_STAGE_MACHINE',
 | 
			
		||||
                'wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -',
 | 
			
		||||
            ] +
 | 
			
		||||
            (if sources != [] then [ ('apt-add-repository "' + source + '"') for source in sources ] else []) +
 | 
			
		||||
            (if packages != "" then [ 'apt-get update', 'apt-get -y install ' + packages ] else []) +
 | 
			
		||||
            [
 | 
			
		||||
                'export LIBRARY=' + library,
 | 
			
		||||
                './.drone/drone.sh',
 | 
			
		||||
            ]
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
local macos_pipeline(name, environment, xcode_version = "12.2", osx_version = "catalina", arch = "amd64") =
 | 
			
		||||
{
 | 
			
		||||
    name: name,
 | 
			
		||||
    kind: "pipeline",
 | 
			
		||||
    type: "exec",
 | 
			
		||||
    trigger: triggers,
 | 
			
		||||
    platform: {
 | 
			
		||||
        "os": "darwin",
 | 
			
		||||
        "arch": arch
 | 
			
		||||
    },
 | 
			
		||||
    node: {
 | 
			
		||||
        "os": osx_version
 | 
			
		||||
    },
 | 
			
		||||
    steps: [
 | 
			
		||||
        {
 | 
			
		||||
            name: "everything",
 | 
			
		||||
            environment: environment + { "DEVELOPER_DIR": "/Applications/Xcode-" + xcode_version + ".app/Contents/Developer" },
 | 
			
		||||
            commands:
 | 
			
		||||
            [
 | 
			
		||||
                'export LIBRARY=' + library,
 | 
			
		||||
                './.drone/drone.sh',
 | 
			
		||||
            ]
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
local windows_pipeline(name, image, environment, arch = "amd64") =
 | 
			
		||||
{
 | 
			
		||||
    name: name,
 | 
			
		||||
    kind: "pipeline",
 | 
			
		||||
    type: "docker",
 | 
			
		||||
    trigger: triggers,
 | 
			
		||||
    platform:
 | 
			
		||||
    {
 | 
			
		||||
        os: "windows",
 | 
			
		||||
        arch: arch
 | 
			
		||||
    },
 | 
			
		||||
    "steps":
 | 
			
		||||
    [
 | 
			
		||||
        {
 | 
			
		||||
            name: "everything",
 | 
			
		||||
            image: image,
 | 
			
		||||
            environment: environment,
 | 
			
		||||
            commands:
 | 
			
		||||
            [
 | 
			
		||||
                'cmd /C .drone\\\\drone.bat ' + library,
 | 
			
		||||
            ]
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
[
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 14.04 GCC 4.8*",
 | 
			
		||||
        "cppalliance/droneubuntu1404:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '11' },
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 14.04 GCC 4.9",
 | 
			
		||||
        "cppalliance/droneubuntu1404:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-4.9', CXXSTD: '11' },
 | 
			
		||||
        "g++-4.9",
 | 
			
		||||
        [ "ppa:ubuntu-toolchain-r/test" ],
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 16.04 GCC 5*",
 | 
			
		||||
        "cppalliance/droneubuntu1604:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '11,14' },
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 18.04 GCC 6",
 | 
			
		||||
        "cppalliance/droneubuntu1804:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-6', CXXSTD: '11,14' },
 | 
			
		||||
        "g++-6",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 18.04 GCC 7* 32/64",
 | 
			
		||||
        "cppalliance/droneubuntu1804:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '11,14,17', ADDRMD: '32,64' },
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 18.04 GCC 8 32/64",
 | 
			
		||||
        "cppalliance/droneubuntu1804:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-8', CXXSTD: '11,14,17', ADDRMD: '32,64' },
 | 
			
		||||
        "g++-8-multilib",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 GCC 9* 32/64",
 | 
			
		||||
        "cppalliance/droneubuntu2004:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '11,14,17,2a', ADDRMD: '32,64' },
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 GCC 9* ARM64",
 | 
			
		||||
        "cppalliance/droneubuntu2004:multiarch",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '11,14,17,2a' },
 | 
			
		||||
        arch="arm64",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 GCC 9* S390x",
 | 
			
		||||
        "cppalliance/droneubuntu2004:multiarch",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '11,14,17,2a' },
 | 
			
		||||
        arch="s390x",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 GCC 10 32/64",
 | 
			
		||||
        "cppalliance/droneubuntu2004:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-10', CXXSTD: '11,14,17,20', ADDRMD: '32,64' },
 | 
			
		||||
        "g++-10-multilib",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 22.04 GCC 11* 32/64",
 | 
			
		||||
        "cppalliance/droneubuntu2204:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '11,14,17,2a', ADDRMD: '32,64' },
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 22.04 GCC 12 32/64",
 | 
			
		||||
        "cppalliance/droneubuntu2204:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '11,14,17,20,2b', ADDRMD: '32,64' },
 | 
			
		||||
        "g++-12-multilib",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 24.04 GCC 13 32 ASAN",
 | 
			
		||||
        "cppalliance/droneubuntu2404:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-13', CXXSTD: '11,14,17,20,2b', ADDRMD: '32' } + asan,
 | 
			
		||||
        "g++-13-multilib",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 24.04 GCC 13 32 UBSAN",
 | 
			
		||||
        "cppalliance/droneubuntu2404:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-13', CXXSTD: '11,14,17,20,2b', ADDRMD: '32' } + ubsan,
 | 
			
		||||
        "g++-13-multilib",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 24.04 GCC 13 64 UBSAN",
 | 
			
		||||
        "cppalliance/droneubuntu2404:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-13', CXXSTD: '11,14,17,20,2b', ADDRMD: '64' } + ubsan,
 | 
			
		||||
        "g++-13-multilib",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 24.04 GCC 14 UBSAN",
 | 
			
		||||
        "cppalliance/droneubuntu2404:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-14', CXXSTD: '11,14,17,20,2b' } + ubsan,
 | 
			
		||||
        "g++-14-multilib",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 24.04 GCC 14 ASAN",
 | 
			
		||||
        "cppalliance/droneubuntu2404:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-14', CXXSTD: '11,14,17,20,2b' } + asan,
 | 
			
		||||
        "g++-14-multilib",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 16.04 Clang 3.5",
 | 
			
		||||
        "cppalliance/droneubuntu1604:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-3.5', CXXSTD: '11' },
 | 
			
		||||
        "clang-3.5",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 16.04 Clang 3.6",
 | 
			
		||||
        "cppalliance/droneubuntu1604:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-3.6', CXXSTD: '11,14' },
 | 
			
		||||
        "clang-3.6",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 16.04 Clang 3.7",
 | 
			
		||||
        "cppalliance/droneubuntu1604:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-3.7', CXXSTD: '11,14' },
 | 
			
		||||
        "clang-3.7",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 16.04 Clang 3.8",
 | 
			
		||||
        "cppalliance/droneubuntu1604:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-3.8', CXXSTD: '11,14' },
 | 
			
		||||
        "clang-3.8",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 18.04 Clang 3.9",
 | 
			
		||||
        "cppalliance/droneubuntu1804:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-3.9', CXXSTD: '11,14' },
 | 
			
		||||
        "clang-3.9",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 18.04 Clang 4.0",
 | 
			
		||||
        "cppalliance/droneubuntu1804:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-4.0', CXXSTD: '11,14' },
 | 
			
		||||
        "clang-4.0",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 18.04 Clang 5.0",
 | 
			
		||||
        "cppalliance/droneubuntu1804:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-5.0', CXXSTD: '11,14' },
 | 
			
		||||
        "clang-5.0",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 Clang 6.0",
 | 
			
		||||
        "cppalliance/droneubuntu2004:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-6.0', CXXSTD: '11,14,17' },
 | 
			
		||||
        "clang-6.0",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 Clang 7",
 | 
			
		||||
        "cppalliance/droneubuntu2004:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-7', CXXSTD: '11,14,17' },
 | 
			
		||||
        "clang-7",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 Clang 8",
 | 
			
		||||
        "cppalliance/droneubuntu2004:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-8', CXXSTD: '11,14,17' },
 | 
			
		||||
        "clang-8",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 Clang 9",
 | 
			
		||||
        "cppalliance/droneubuntu2004:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-9', CXXSTD: '11,14,17,2a' },
 | 
			
		||||
        "clang-9",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 Clang 10",
 | 
			
		||||
        "cppalliance/droneubuntu2004:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-10', CXXSTD: '11,14,17,2a' },
 | 
			
		||||
        "clang-10",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 Clang 11",
 | 
			
		||||
        "cppalliance/droneubuntu2004:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-11', CXXSTD: '11,14,17,2a' },
 | 
			
		||||
        "clang-11",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 Clang 12",
 | 
			
		||||
        "cppalliance/droneubuntu2004:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-12', CXXSTD: '11,14,17,20' },
 | 
			
		||||
        "clang-12",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 22.04 Clang 13",
 | 
			
		||||
        "cppalliance/droneubuntu2204:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-13', CXXSTD: '11,14,17,20,2b' },
 | 
			
		||||
        "clang-13",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 22.04 Clang 14",
 | 
			
		||||
        "cppalliance/droneubuntu2204:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-14', CXXSTD: '11,14,17,20,2b' },
 | 
			
		||||
        "clang-14",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 22.04 Clang 15",
 | 
			
		||||
        "cppalliance/droneubuntu2204:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-15', CXXSTD: '11,14,17,20,2b' },
 | 
			
		||||
        "clang-15",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 24.04 Clang 16",
 | 
			
		||||
        "cppalliance/droneubuntu2404:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-16', CXXSTD: '11,14,17,20,2b' },
 | 
			
		||||
        "clang-16",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 24.04 Clang 17 UBSAN",
 | 
			
		||||
        "cppalliance/droneubuntu2404:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-17', CXXSTD: '11,14,17,20,2b' } + ubsan,
 | 
			
		||||
        "clang-17",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 24.04 Clang 17 ASAN",
 | 
			
		||||
        "cppalliance/droneubuntu2404:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-17', CXXSTD: '11,14,17,20,2b' } + asan,
 | 
			
		||||
        "clang-17",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 24.04 Clang 18 UBSAN",
 | 
			
		||||
        "cppalliance/droneubuntu2404:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-18', CXXSTD: '11,14,17,20,2b' } + ubsan,
 | 
			
		||||
        "clang-18",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 24.04 Clang 18 ASAN",
 | 
			
		||||
        "cppalliance/droneubuntu2404:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-18', CXXSTD: '11,14,17,20,2b' } + asan,
 | 
			
		||||
        "clang-18",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 24.10 Clang 19",
 | 
			
		||||
        "cppalliance/droneubuntu2410:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-19', CXXSTD: '11,14,17,20,2b' },
 | 
			
		||||
        "clang-19",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    macos_pipeline(
 | 
			
		||||
        "MacOS 10.15 Xcode 12.2 UBSAN",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '11,14,1z' } + ubsan,
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    macos_pipeline(
 | 
			
		||||
        "MacOS 10.15 Xcode 12.2 ASAN",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '11,14,1z' } + asan,
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    macos_pipeline(
 | 
			
		||||
        "MacOS 12.4 Xcode 13.4.1 UBSAN",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '11,14,17,20,2b' } + ubsan,
 | 
			
		||||
        xcode_version = "13.4.1", osx_version = "monterey", arch = "arm64",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    macos_pipeline(
 | 
			
		||||
        "MacOS 12.4 Xcode 13.4.1 ASAN",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '11,14,17,20,2b' } + asan,
 | 
			
		||||
        xcode_version = "13.4.1", osx_version = "monterey", arch = "arm64",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    windows_pipeline(
 | 
			
		||||
        "Windows VS2015 msvc-14.0",
 | 
			
		||||
        "cppalliance/dronevs2015",
 | 
			
		||||
        { TOOLSET: 'msvc-14.0', CXXSTD: '14,latest', B2_DONT_EMBED_MANIFEST: '1' },
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    windows_pipeline(
 | 
			
		||||
        "Windows VS2017 msvc-14.1",
 | 
			
		||||
        "cppalliance/dronevs2017",
 | 
			
		||||
        { TOOLSET: 'msvc-14.1', CXXSTD: '14,17,latest' },
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    windows_pipeline(
 | 
			
		||||
        "Windows VS2019 msvc-14.2",
 | 
			
		||||
        "cppalliance/dronevs2019",
 | 
			
		||||
        { TOOLSET: 'msvc-14.2', CXXSTD: '14,17,20,latest' },
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    windows_pipeline(
 | 
			
		||||
        "Windows VS2022 msvc-14.3",
 | 
			
		||||
        "cppalliance/dronevs2022:1",
 | 
			
		||||
        { TOOLSET: 'msvc-14.3', CXXSTD: '14,17,20,latest' },
 | 
			
		||||
    ),
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										23
									
								
								.drone/drone.bat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								.drone/drone.bat
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
@REM Copyright 2022 Peter Dimov
 | 
			
		||||
@REM Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
@REM https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
@ECHO ON
 | 
			
		||||
 | 
			
		||||
set LIBRARY=%1
 | 
			
		||||
set DRONE_BUILD_DIR=%CD%
 | 
			
		||||
 | 
			
		||||
set BOOST_BRANCH=develop
 | 
			
		||||
if "%DRONE_BRANCH%" == "master" set BOOST_BRANCH=master
 | 
			
		||||
cd ..
 | 
			
		||||
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
 | 
			
		||||
cd boost-root
 | 
			
		||||
git submodule update --init tools/boostdep
 | 
			
		||||
xcopy /s /e /q %DRONE_BUILD_DIR% libs\%LIBRARY%\
 | 
			
		||||
python tools/boostdep/depinst/depinst.py %LIBRARY%
 | 
			
		||||
cmd /c bootstrap
 | 
			
		||||
b2 -d0 headers
 | 
			
		||||
 | 
			
		||||
if not "%CXXSTD%" == "" set CXXSTD=cxxstd=%CXXSTD%
 | 
			
		||||
if not "%ADDRMD%" == "" set ADDRMD=address-model=%ADDRMD%
 | 
			
		||||
b2 -j3 libs/%LIBRARY%/test toolset=%TOOLSET% %CXXSTD% %ADDRMD% variant=debug,release embed-manifest-via=linker
 | 
			
		||||
							
								
								
									
										25
									
								
								.drone/drone.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										25
									
								
								.drone/drone.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
# Copyright 2022 Peter Dimov
 | 
			
		||||
# Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
# https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
set -ex
 | 
			
		||||
export PATH=~/.local/bin:/usr/local/bin:$PATH
 | 
			
		||||
 | 
			
		||||
DRONE_BUILD_DIR=$(pwd)
 | 
			
		||||
 | 
			
		||||
BOOST_BRANCH=develop
 | 
			
		||||
if [ "$DRONE_BRANCH" = "master" ]; then BOOST_BRANCH=master; fi
 | 
			
		||||
 | 
			
		||||
cd ..
 | 
			
		||||
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
 | 
			
		||||
cd boost-root
 | 
			
		||||
git submodule update --init tools/boostdep
 | 
			
		||||
cp -r $DRONE_BUILD_DIR/* libs/$LIBRARY
 | 
			
		||||
python tools/boostdep/depinst/depinst.py $LIBRARY
 | 
			
		||||
./bootstrap.sh
 | 
			
		||||
./b2 -d0 headers
 | 
			
		||||
 | 
			
		||||
echo "using $TOOLSET : : $COMPILER ;" > ~/user-config.jam
 | 
			
		||||
./b2 -j3 libs/$LIBRARY/test toolset=$TOOLSET cxxstd=$CXXSTD variant=debug,release ${ADDRMD:+address-model=$ADDRMD} ${UBSAN:+undefined-sanitizer=norecover debug-symbols=on} ${ASAN:+address-sanitizer=norecover debug-symbols=on} ${LINKFLAGS:+linkflags=$LINKFLAGS}
 | 
			
		||||
							
								
								
									
										662
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										662
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,662 @@
 | 
			
		||||
name: CI
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  pull_request:
 | 
			
		||||
  push:
 | 
			
		||||
    branches:
 | 
			
		||||
      - master
 | 
			
		||||
      - develop
 | 
			
		||||
      - feature/**
 | 
			
		||||
 | 
			
		||||
env:
 | 
			
		||||
  UBSAN_OPTIONS: print_stacktrace=1
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  posix:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        include:
 | 
			
		||||
          - toolset: gcc-4.8
 | 
			
		||||
            cxxstd: "11"
 | 
			
		||||
            container: ubuntu:18.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: g++-4.8-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-5
 | 
			
		||||
            cxxstd: "11,14,1z"
 | 
			
		||||
            container: ubuntu:18.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: g++-5-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-6
 | 
			
		||||
            cxxstd: "11,14,1z"
 | 
			
		||||
            container: ubuntu:18.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: g++-6-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-7
 | 
			
		||||
            cxxstd: "11,14,17"
 | 
			
		||||
            container: ubuntu:18.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: g++-7-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-8
 | 
			
		||||
            cxxstd: "11,14,17,2a"
 | 
			
		||||
            container: ubuntu:20.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: g++-8-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-9
 | 
			
		||||
            cxxstd: "11,14,17,2a"
 | 
			
		||||
            container: ubuntu:20.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: g++-9-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-10
 | 
			
		||||
            cxxstd: "11,14,17,2a"
 | 
			
		||||
            container: ubuntu:20.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: g++-10-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-11
 | 
			
		||||
            cxxstd: "11,14,17,20"
 | 
			
		||||
            os: ubuntu-22.04
 | 
			
		||||
            install: g++-11-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-12
 | 
			
		||||
            cxxstd: "11,14,17,20,2b"
 | 
			
		||||
            os: ubuntu-22.04
 | 
			
		||||
            install: g++-12-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-13
 | 
			
		||||
            cxxstd: "11,14,17,20,2b"
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            container: ubuntu:24.04
 | 
			
		||||
            install: g++-13-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-14
 | 
			
		||||
            cxxstd: "11,14,17,20,23,2c"
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            container: ubuntu:24.04
 | 
			
		||||
            install: g++-14-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-15
 | 
			
		||||
            cxxstd: "11,14,17,20,23,2c"
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            container: ubuntu:25.04
 | 
			
		||||
            install: g++-15-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-3.9
 | 
			
		||||
            cxxstd: "11,14"
 | 
			
		||||
            container: ubuntu:18.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-3.9
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-4.0
 | 
			
		||||
            cxxstd: "11,14"
 | 
			
		||||
            container: ubuntu:18.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-4.0
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-5.0
 | 
			
		||||
            cxxstd: "11,14,1z"
 | 
			
		||||
            container: ubuntu:18.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-5.0
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-6.0
 | 
			
		||||
            cxxstd: "11,14,17"
 | 
			
		||||
            container: ubuntu:20.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-6.0
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-7
 | 
			
		||||
            cxxstd: "11,14,17"
 | 
			
		||||
            container: ubuntu:20.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-7
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-8
 | 
			
		||||
            cxxstd: "11,14,17"
 | 
			
		||||
            container: ubuntu:20.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-8
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-9
 | 
			
		||||
            cxxstd: "11,14,17,2a"
 | 
			
		||||
            container: ubuntu:20.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-9
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-10
 | 
			
		||||
            cxxstd: "11,14,17,2a"
 | 
			
		||||
            container: ubuntu:20.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-10
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-11
 | 
			
		||||
            cxxstd: "11,14,17,2a"
 | 
			
		||||
            container: ubuntu:20.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-11
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-12
 | 
			
		||||
            cxxstd: "11,14,17,20"
 | 
			
		||||
            container: ubuntu:20.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-12
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-13
 | 
			
		||||
            cxxstd: "11,14,17,20,2b"
 | 
			
		||||
            container: ubuntu:22.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-13
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-14
 | 
			
		||||
            cxxstd: "11,14,17,20,2b"
 | 
			
		||||
            container: ubuntu:22.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-14
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-15
 | 
			
		||||
            cxxstd: "11,14,17,20,2b"
 | 
			
		||||
            container: ubuntu:22.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-15
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-16
 | 
			
		||||
            cxxstd: "11,14,17,20,2b"
 | 
			
		||||
            container: ubuntu:24.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-16
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-17
 | 
			
		||||
            cxxstd: "11,14,17,20,2b"
 | 
			
		||||
            container: ubuntu:24.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-17
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-18
 | 
			
		||||
            cxxstd: "11,14,17,20,2b"
 | 
			
		||||
            container: ubuntu:24.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-18
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-19
 | 
			
		||||
            cxxstd: "11,14,17,20,23,2c"
 | 
			
		||||
            container: ubuntu:24.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-19
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-20
 | 
			
		||||
            cxxstd: "11,14,17,20,23,2c"
 | 
			
		||||
            container: ubuntu:25.04
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            install: clang-20
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            cxxstd: "11,14,17,20,2b"
 | 
			
		||||
            os: macos-13
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            cxxstd: "11,14,17,20,2b"
 | 
			
		||||
            os: macos-14
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            cxxstd: "11,14,17,20,2b"
 | 
			
		||||
            os: macos-15
 | 
			
		||||
 | 
			
		||||
    runs-on: ${{matrix.os}}
 | 
			
		||||
 | 
			
		||||
    container:
 | 
			
		||||
      image: ${{matrix.container}}
 | 
			
		||||
      volumes:
 | 
			
		||||
        - /node20217:/node20217:rw,rshared
 | 
			
		||||
        - ${{ startsWith(matrix.container, 'ubuntu:1') && '/node20217:/__e/node20:ro,rshared' || ' ' }}
 | 
			
		||||
 | 
			
		||||
    defaults:
 | 
			
		||||
      run:
 | 
			
		||||
        shell: bash
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Setup container environment
 | 
			
		||||
        if: matrix.container
 | 
			
		||||
        run: |
 | 
			
		||||
          apt-get update
 | 
			
		||||
          apt-get -y install sudo python3 git g++ curl xz-utils
 | 
			
		||||
 | 
			
		||||
      - name: Install nodejs20glibc2.17
 | 
			
		||||
        if: ${{ startsWith( matrix.container, 'ubuntu:1' ) }}
 | 
			
		||||
        run: |
 | 
			
		||||
          curl -LO https://archives.boost.io/misc/node/node-v20.9.0-linux-x64-glibc-217.tar.xz
 | 
			
		||||
          tar -xf node-v20.9.0-linux-x64-glibc-217.tar.xz --strip-components 1 -C /node20217
 | 
			
		||||
          ldd /__e/node20/bin/node
 | 
			
		||||
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Install packages
 | 
			
		||||
        if: matrix.install
 | 
			
		||||
        run: |
 | 
			
		||||
          sudo apt-get update
 | 
			
		||||
          sudo apt-get -y install ${{matrix.install}}
 | 
			
		||||
 | 
			
		||||
      - name: Setup Boost
 | 
			
		||||
        run: |
 | 
			
		||||
          echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
 | 
			
		||||
          LIBRARY=${GITHUB_REPOSITORY#*/}
 | 
			
		||||
          echo LIBRARY: $LIBRARY
 | 
			
		||||
          echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
 | 
			
		||||
          echo GITHUB_BASE_REF: $GITHUB_BASE_REF
 | 
			
		||||
          echo GITHUB_REF: $GITHUB_REF
 | 
			
		||||
          REF=${GITHUB_BASE_REF:-$GITHUB_REF}
 | 
			
		||||
          REF=${REF#refs/heads/}
 | 
			
		||||
          echo REF: $REF
 | 
			
		||||
          BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
 | 
			
		||||
          echo BOOST_BRANCH: $BOOST_BRANCH
 | 
			
		||||
          cd ..
 | 
			
		||||
          git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
 | 
			
		||||
          cd boost-root
 | 
			
		||||
          cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
 | 
			
		||||
          git submodule update --init tools/boostdep
 | 
			
		||||
          python3 tools/boostdep/depinst/depinst.py --git_args "--jobs 3" $LIBRARY
 | 
			
		||||
          ./bootstrap.sh
 | 
			
		||||
          ./b2 -d0 headers
 | 
			
		||||
 | 
			
		||||
      - name: Create user-config.jam
 | 
			
		||||
        if: matrix.compiler
 | 
			
		||||
        run: |
 | 
			
		||||
          echo "using ${{matrix.toolset}} : : ${{matrix.compiler}} ;" > ~/user-config.jam
 | 
			
		||||
 | 
			
		||||
      - name: Run tests
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root
 | 
			
		||||
          ./b2 -j3 libs/$LIBRARY/test toolset=${{matrix.toolset}} cxxstd=${{matrix.cxxstd}} ${ADDRMD:+address-model=$ADDRMD} variant=debug,release
 | 
			
		||||
 | 
			
		||||
  windows:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        include:
 | 
			
		||||
          - toolset: msvc-14.3
 | 
			
		||||
            cxxstd: "14,17,20,latest"
 | 
			
		||||
            addrmd: 32,64
 | 
			
		||||
            os: windows-2022
 | 
			
		||||
          - toolset: clang-win
 | 
			
		||||
            cxxstd: "14,17,20,latest"
 | 
			
		||||
            addrmd: 32,64
 | 
			
		||||
            os: windows-2022
 | 
			
		||||
          - toolset: gcc
 | 
			
		||||
            cxxstd: "11,14,17,2a"
 | 
			
		||||
            addrmd: 64
 | 
			
		||||
            os: windows-2022
 | 
			
		||||
 | 
			
		||||
    runs-on: ${{matrix.os}}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Setup Boost
 | 
			
		||||
        shell: cmd
 | 
			
		||||
        run: |
 | 
			
		||||
          echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
 | 
			
		||||
          for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
 | 
			
		||||
          echo LIBRARY: %LIBRARY%
 | 
			
		||||
          echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
 | 
			
		||||
          echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
 | 
			
		||||
          echo GITHUB_REF: %GITHUB_REF%
 | 
			
		||||
          if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
 | 
			
		||||
          set BOOST_BRANCH=develop
 | 
			
		||||
          for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
 | 
			
		||||
          echo BOOST_BRANCH: %BOOST_BRANCH%
 | 
			
		||||
          cd ..
 | 
			
		||||
          git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
 | 
			
		||||
          cd boost-root
 | 
			
		||||
          xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
 | 
			
		||||
          git submodule update --init tools/boostdep
 | 
			
		||||
          python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" %LIBRARY%
 | 
			
		||||
          cmd /c bootstrap
 | 
			
		||||
          b2 -d0 headers
 | 
			
		||||
 | 
			
		||||
      - name: Run tests
 | 
			
		||||
        shell: cmd
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root
 | 
			
		||||
          b2 -j3 libs/%LIBRARY%/test toolset=${{matrix.toolset}} cxxstd=${{matrix.cxxstd}} address-model=${{matrix.addrmd}} variant=debug,release embed-manifest-via=linker
 | 
			
		||||
 | 
			
		||||
  posix-cmake-subdir:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        include:
 | 
			
		||||
          - os: ubuntu-22.04
 | 
			
		||||
          - os: ubuntu-24.04
 | 
			
		||||
          - os: macos-13
 | 
			
		||||
          - os: macos-14
 | 
			
		||||
          - os: macos-15
 | 
			
		||||
 | 
			
		||||
    runs-on: ${{matrix.os}}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Install packages
 | 
			
		||||
        if: matrix.install
 | 
			
		||||
        run: sudo apt-get -y install ${{matrix.install}}
 | 
			
		||||
 | 
			
		||||
      - name: Setup Boost
 | 
			
		||||
        run: |
 | 
			
		||||
          echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
 | 
			
		||||
          LIBRARY=${GITHUB_REPOSITORY#*/}
 | 
			
		||||
          echo LIBRARY: $LIBRARY
 | 
			
		||||
          echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
 | 
			
		||||
          echo GITHUB_BASE_REF: $GITHUB_BASE_REF
 | 
			
		||||
          echo GITHUB_REF: $GITHUB_REF
 | 
			
		||||
          REF=${GITHUB_BASE_REF:-$GITHUB_REF}
 | 
			
		||||
          REF=${REF#refs/heads/}
 | 
			
		||||
          echo REF: $REF
 | 
			
		||||
          BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
 | 
			
		||||
          echo BOOST_BRANCH: $BOOST_BRANCH
 | 
			
		||||
          cd ..
 | 
			
		||||
          git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
 | 
			
		||||
          cd boost-root
 | 
			
		||||
          cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
 | 
			
		||||
          git submodule update --init tools/boostdep
 | 
			
		||||
          python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" $LIBRARY
 | 
			
		||||
 | 
			
		||||
      - name: Use library with add_subdirectory
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root/libs/$LIBRARY/test/cmake_subdir_test
 | 
			
		||||
          mkdir __build__ && cd __build__
 | 
			
		||||
          cmake ..
 | 
			
		||||
          cmake --build .
 | 
			
		||||
          ctest --output-on-failure --no-tests=error
 | 
			
		||||
 | 
			
		||||
  posix-cmake-install:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        include:
 | 
			
		||||
          - os: ubuntu-22.04
 | 
			
		||||
          - os: ubuntu-24.04
 | 
			
		||||
          - os: macos-13
 | 
			
		||||
          - os: macos-14
 | 
			
		||||
          - os: macos-15
 | 
			
		||||
 | 
			
		||||
    runs-on: ${{matrix.os}}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Install packages
 | 
			
		||||
        if: matrix.install
 | 
			
		||||
        run: sudo apt-get -y install ${{matrix.install}}
 | 
			
		||||
 | 
			
		||||
      - name: Setup Boost
 | 
			
		||||
        run: |
 | 
			
		||||
          echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
 | 
			
		||||
          LIBRARY=${GITHUB_REPOSITORY#*/}
 | 
			
		||||
          echo LIBRARY: $LIBRARY
 | 
			
		||||
          echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
 | 
			
		||||
          echo GITHUB_BASE_REF: $GITHUB_BASE_REF
 | 
			
		||||
          echo GITHUB_REF: $GITHUB_REF
 | 
			
		||||
          REF=${GITHUB_BASE_REF:-$GITHUB_REF}
 | 
			
		||||
          REF=${REF#refs/heads/}
 | 
			
		||||
          echo REF: $REF
 | 
			
		||||
          BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
 | 
			
		||||
          echo BOOST_BRANCH: $BOOST_BRANCH
 | 
			
		||||
          cd ..
 | 
			
		||||
          git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
 | 
			
		||||
          cd boost-root
 | 
			
		||||
          cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
 | 
			
		||||
          git submodule update --init tools/boostdep
 | 
			
		||||
          python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" $LIBRARY
 | 
			
		||||
 | 
			
		||||
      - name: Configure
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root
 | 
			
		||||
          mkdir __build__ && cd __build__
 | 
			
		||||
          cmake -DBOOST_INCLUDE_LIBRARIES=$LIBRARY -DCMAKE_INSTALL_PREFIX=~/.local ..
 | 
			
		||||
 | 
			
		||||
      - name: Install
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root/__build__
 | 
			
		||||
          cmake --build . --target install
 | 
			
		||||
 | 
			
		||||
      - name: Use the installed library
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root/libs/$LIBRARY/test/cmake_install_test && mkdir __build__ && cd __build__
 | 
			
		||||
          cmake -DCMAKE_INSTALL_PREFIX=~/.local ..
 | 
			
		||||
          cmake --build .
 | 
			
		||||
          ctest --output-on-failure --no-tests=error
 | 
			
		||||
 | 
			
		||||
  posix-cmake-test:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        include:
 | 
			
		||||
          - os: ubuntu-22.04
 | 
			
		||||
          - os: ubuntu-24.04
 | 
			
		||||
          - os: macos-13
 | 
			
		||||
          - os: macos-14
 | 
			
		||||
          - os: macos-15
 | 
			
		||||
 | 
			
		||||
    runs-on: ${{matrix.os}}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Install packages
 | 
			
		||||
        if: matrix.install
 | 
			
		||||
        run: sudo apt-get -y install ${{matrix.install}}
 | 
			
		||||
 | 
			
		||||
      - name: Setup Boost
 | 
			
		||||
        run: |
 | 
			
		||||
          echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
 | 
			
		||||
          LIBRARY=${GITHUB_REPOSITORY#*/}
 | 
			
		||||
          echo LIBRARY: $LIBRARY
 | 
			
		||||
          echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
 | 
			
		||||
          echo GITHUB_BASE_REF: $GITHUB_BASE_REF
 | 
			
		||||
          echo GITHUB_REF: $GITHUB_REF
 | 
			
		||||
          REF=${GITHUB_BASE_REF:-$GITHUB_REF}
 | 
			
		||||
          REF=${REF#refs/heads/}
 | 
			
		||||
          echo REF: $REF
 | 
			
		||||
          BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
 | 
			
		||||
          echo BOOST_BRANCH: $BOOST_BRANCH
 | 
			
		||||
          cd ..
 | 
			
		||||
          git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
 | 
			
		||||
          cd boost-root
 | 
			
		||||
          cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
 | 
			
		||||
          git submodule update --init tools/boostdep
 | 
			
		||||
          python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" $LIBRARY
 | 
			
		||||
 | 
			
		||||
      - name: Configure
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root
 | 
			
		||||
          mkdir __build__ && cd __build__
 | 
			
		||||
          cmake -DBOOST_INCLUDE_LIBRARIES=$LIBRARY -DBUILD_TESTING=ON ..
 | 
			
		||||
 | 
			
		||||
      - name: Build tests
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root/__build__
 | 
			
		||||
          cmake --build . --target tests
 | 
			
		||||
 | 
			
		||||
      - name: Run tests
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root/__build__
 | 
			
		||||
          ctest --output-on-failure --no-tests=error
 | 
			
		||||
 | 
			
		||||
  windows-cmake-subdir:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        include:
 | 
			
		||||
          - os: windows-latest
 | 
			
		||||
 | 
			
		||||
    runs-on: ${{matrix.os}}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Setup Boost
 | 
			
		||||
        shell: cmd
 | 
			
		||||
        run: |
 | 
			
		||||
          echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
 | 
			
		||||
          for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
 | 
			
		||||
          echo LIBRARY: %LIBRARY%
 | 
			
		||||
          echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
 | 
			
		||||
          echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
 | 
			
		||||
          echo GITHUB_REF: %GITHUB_REF%
 | 
			
		||||
          if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
 | 
			
		||||
          set BOOST_BRANCH=develop
 | 
			
		||||
          for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
 | 
			
		||||
          echo BOOST_BRANCH: %BOOST_BRANCH%
 | 
			
		||||
          cd ..
 | 
			
		||||
          git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
 | 
			
		||||
          cd boost-root
 | 
			
		||||
          xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
 | 
			
		||||
          git submodule update --init tools/boostdep
 | 
			
		||||
          python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" %LIBRARY%
 | 
			
		||||
 | 
			
		||||
      - name: Use library with add_subdirectory (Debug)
 | 
			
		||||
        shell: cmd
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root/libs/%LIBRARY%/test/cmake_subdir_test
 | 
			
		||||
          mkdir __build__ && cd __build__
 | 
			
		||||
          cmake ..
 | 
			
		||||
          cmake --build . --config Debug
 | 
			
		||||
          ctest --output-on-failure --no-tests=error -C Debug
 | 
			
		||||
 | 
			
		||||
      - name: Use library with add_subdirectory (Release)
 | 
			
		||||
        shell: cmd
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root/libs/%LIBRARY%/test/cmake_subdir_test/__build__
 | 
			
		||||
          cmake --build . --config Release
 | 
			
		||||
          ctest --output-on-failure --no-tests=error -C Release
 | 
			
		||||
 | 
			
		||||
  windows-cmake-install:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        include:
 | 
			
		||||
          - os: windows-latest
 | 
			
		||||
 | 
			
		||||
    runs-on: ${{matrix.os}}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Setup Boost
 | 
			
		||||
        shell: cmd
 | 
			
		||||
        run: |
 | 
			
		||||
          echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
 | 
			
		||||
          for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
 | 
			
		||||
          echo LIBRARY: %LIBRARY%
 | 
			
		||||
          echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
 | 
			
		||||
          echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
 | 
			
		||||
          echo GITHUB_REF: %GITHUB_REF%
 | 
			
		||||
          if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
 | 
			
		||||
          set BOOST_BRANCH=develop
 | 
			
		||||
          for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
 | 
			
		||||
          echo BOOST_BRANCH: %BOOST_BRANCH%
 | 
			
		||||
          cd ..
 | 
			
		||||
          git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
 | 
			
		||||
          cd boost-root
 | 
			
		||||
          xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
 | 
			
		||||
          git submodule update --init tools/boostdep
 | 
			
		||||
          python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" %LIBRARY%
 | 
			
		||||
 | 
			
		||||
      - name: Configure
 | 
			
		||||
        shell: cmd
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root
 | 
			
		||||
          mkdir __build__ && cd __build__
 | 
			
		||||
          cmake -DBOOST_INCLUDE_LIBRARIES=%LIBRARY% -DCMAKE_INSTALL_PREFIX=C:/cmake-prefix ..
 | 
			
		||||
 | 
			
		||||
      - name: Install (Debug)
 | 
			
		||||
        shell: cmd
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root/__build__
 | 
			
		||||
          cmake --build . --target install --config Debug
 | 
			
		||||
 | 
			
		||||
      - name: Install (Release)
 | 
			
		||||
        shell: cmd
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root/__build__
 | 
			
		||||
          cmake --build . --target install --config Release
 | 
			
		||||
 | 
			
		||||
      - name: Use the installed library (Debug)
 | 
			
		||||
        shell: cmd
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root/libs/%LIBRARY%/test/cmake_install_test && mkdir __build__ && cd __build__
 | 
			
		||||
          cmake -DCMAKE_INSTALL_PREFIX=C:/cmake-prefix ..
 | 
			
		||||
          cmake --build . --config Debug
 | 
			
		||||
          ctest --output-on-failure --no-tests=error -C Debug
 | 
			
		||||
 | 
			
		||||
      - name: Use the installed library (Release)
 | 
			
		||||
        shell: cmd
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root/libs/%LIBRARY%/test/cmake_install_test/__build__
 | 
			
		||||
          cmake --build . --config Release
 | 
			
		||||
          ctest --output-on-failure --no-tests=error -C Release
 | 
			
		||||
 | 
			
		||||
  windows-cmake-test:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        include:
 | 
			
		||||
          - os: windows-latest
 | 
			
		||||
 | 
			
		||||
    runs-on: ${{matrix.os}}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Setup Boost
 | 
			
		||||
        shell: cmd
 | 
			
		||||
        run: |
 | 
			
		||||
          echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
 | 
			
		||||
          for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
 | 
			
		||||
          echo LIBRARY: %LIBRARY%
 | 
			
		||||
          echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
 | 
			
		||||
          echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
 | 
			
		||||
          echo GITHUB_REF: %GITHUB_REF%
 | 
			
		||||
          if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
 | 
			
		||||
          set BOOST_BRANCH=develop
 | 
			
		||||
          for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
 | 
			
		||||
          echo BOOST_BRANCH: %BOOST_BRANCH%
 | 
			
		||||
          cd ..
 | 
			
		||||
          git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
 | 
			
		||||
          cd boost-root
 | 
			
		||||
          xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
 | 
			
		||||
          git submodule update --init tools/boostdep
 | 
			
		||||
          python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" %LIBRARY%
 | 
			
		||||
 | 
			
		||||
      - name: Configure
 | 
			
		||||
        shell: cmd
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root
 | 
			
		||||
          mkdir __build__ && cd __build__
 | 
			
		||||
          cmake -DBOOST_INCLUDE_LIBRARIES=%LIBRARY% -DBUILD_TESTING=ON ..
 | 
			
		||||
 | 
			
		||||
      - name: Build tests (Debug)
 | 
			
		||||
        shell: cmd
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root/__build__
 | 
			
		||||
          cmake --build . --target tests --config Debug
 | 
			
		||||
 | 
			
		||||
      - name: Run tests (Debug)
 | 
			
		||||
        shell: cmd
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root/__build__
 | 
			
		||||
          ctest --output-on-failure --no-tests=error -C Debug
 | 
			
		||||
 | 
			
		||||
      - name: Build tests (Release)
 | 
			
		||||
        shell: cmd
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root/__build__
 | 
			
		||||
          cmake --build . --target tests --config Release
 | 
			
		||||
 | 
			
		||||
      - name: Run tests (Release)
 | 
			
		||||
        shell: cmd
 | 
			
		||||
        run: |
 | 
			
		||||
          cd ../boost-root/__build__
 | 
			
		||||
          ctest --output-on-failure --no-tests=error -C Release
 | 
			
		||||
							
								
								
									
										308
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										308
									
								
								.travis.yml
									
									
									
									
									
								
							@@ -22,28 +22,48 @@ matrix:
 | 
			
		||||
    - env: BOGUS_JOB=true
 | 
			
		||||
 | 
			
		||||
  include:
 | 
			
		||||
    - os: linux
 | 
			
		||||
      dist: trusty
 | 
			
		||||
      compiler: g++
 | 
			
		||||
      env: TOOLSET=gcc CXXSTD=03,11
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      dist: xenial
 | 
			
		||||
      compiler: g++
 | 
			
		||||
      env: TOOLSET=gcc CXXSTD=03,11,14
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      dist: bionic
 | 
			
		||||
      compiler: g++
 | 
			
		||||
      env: TOOLSET=gcc CXXSTD=03,11,14,17
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      dist: focal
 | 
			
		||||
      compiler: g++
 | 
			
		||||
      env: TOOLSET=gcc CXXSTD=03,11,14,17
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      arch: arm64
 | 
			
		||||
      compiler: g++
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++ CXXSTD=03,11,14
 | 
			
		||||
      env: TOOLSET=gcc CXXSTD=03,11,14
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      arch: ppc64le
 | 
			
		||||
      compiler: g++
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++ CXXSTD=03,11,14
 | 
			
		||||
      env: TOOLSET=gcc CXXSTD=03,11,14
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      arch: s390x
 | 
			
		||||
      compiler: g++
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++ CXXSTD=03,11,14
 | 
			
		||||
      env: TOOLSET=gcc CXXSTD=03,11,14
 | 
			
		||||
 | 
			
		||||
    - os: freebsd
 | 
			
		||||
      compiler: clang++
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,17,2a
 | 
			
		||||
      env: TOOLSET=clang CXXSTD=03,11,14,17,2a
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: g++-4.4
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-4.4 CXXSTD=98,0x
 | 
			
		||||
      env: TOOLSET=gcc CXXSTD=98,0x
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
@@ -53,7 +73,7 @@ matrix:
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: g++-4.6
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-4.6 CXXSTD=03,0x
 | 
			
		||||
      env: TOOLSET=gcc CXXSTD=03,0x
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
@@ -61,109 +81,10 @@ matrix:
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: g++-4.7
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=03,11
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-4.7
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: g++-4.8
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=03,11
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-4.8
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: g++-4.9
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=03,11
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-4.9
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: g++-5
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=03,11,14,1z
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-5
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: g++-6
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=03,11,14,1z
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-6
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: g++-7
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=03,11,14,17
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-7
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: g++-8
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-8 CXXSTD=03,11,14
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-8
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: g++-8
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-8 CXXSTD=17,2a
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-8
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: g++-9
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-9 CXXSTD=03,11,14
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-9
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: g++-9
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-9 CXXSTD=17,2a
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-9
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      dist: bionic
 | 
			
		||||
      compiler: g++-10
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-10 CXXSTD=03,11,14
 | 
			
		||||
      env: UBSAN=1 TOOLSET=gcc CXXSTD=03,11,14 UBSAN_OPTIONS=print_stacktrace=1 LINKFLAGS=-fuse-ld=gold
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
@@ -174,7 +95,7 @@ matrix:
 | 
			
		||||
    - os: linux
 | 
			
		||||
      dist: bionic
 | 
			
		||||
      compiler: g++-10
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-10 CXXSTD=17,2a
 | 
			
		||||
      env: UBSAN=1 TOOLSET=gcc CXXSTD=17,2a UBSAN_OPTIONS=print_stacktrace=1 LINKFLAGS=-fuse-ld=gold
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
@@ -182,20 +103,10 @@ matrix:
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: g++-7
 | 
			
		||||
      env: UBSAN=1 TOOLSET=gcc COMPILER=g++-7 CXXSTD=03,11,14,17 UBSAN_OPTIONS=print_stacktrace=1 LINKFLAGS=-fuse-ld=gold
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-7
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      dist: trusty
 | 
			
		||||
      compiler: /usr/bin/clang++
 | 
			
		||||
      env: TOOLSET=clang COMPILER=/usr/bin/clang++ CXXSTD=03,11
 | 
			
		||||
      env: TOOLSET=clang COMMENT=clang-3.3 CXXSTD=03,11
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
@@ -204,160 +115,24 @@ matrix:
 | 
			
		||||
    - os: linux
 | 
			
		||||
      dist: trusty
 | 
			
		||||
      compiler: /usr/bin/clang++
 | 
			
		||||
      env: TOOLSET=clang COMPILER=/usr/bin/clang++ CXXSTD=03,11
 | 
			
		||||
      env: TOOLSET=clang COMMENT=clang-3.4 CXXSTD=03,11
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-3.4
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: clang++-3.5
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-3.5 CXXSTD=03,11
 | 
			
		||||
      compiler: clang++-11
 | 
			
		||||
      env: UBSAN=1 TOOLSET=clang CXXSTD=03,11,14,17,2a UBSAN_OPTIONS=print_stacktrace=1
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-3.5
 | 
			
		||||
            - clang-11
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: clang++-3.6
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=03,11,14,1z
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-3.6
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: clang++-3.7
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=03,11,14,1z
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-3.7
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: clang++-3.8
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=03,11,14,1z
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-3.8
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: clang++-3.9
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=03,11,14,1z
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-3.9
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: clang++-4.0
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=03,11,14,1z
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-4.0
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: clang++-5.0
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-5.0 CXXSTD=03,11,14,1z
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-5.0
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: clang++-6.0
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-6.0 CXXSTD=03,11,14,17,2a
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-6.0
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: clang++-7
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-7 CXXSTD=03,11,14,17,2a
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-7
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
            - llvm-toolchain-xenial-7
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: clang++-8
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-8 CXXSTD=03,11,14,17,2a
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-8
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
            - llvm-toolchain-xenial-8
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      dist: xenial
 | 
			
		||||
      compiler: clang++-9
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-9 CXXSTD=03,11,14,17,2a
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-9
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
            - sourceline: 'deb https://apt.llvm.org/xenial/ llvm-toolchain-xenial-9 main'
 | 
			
		||||
            - sourceline: 'deb https://apt.llvm.org/xenial/ llvm-toolchain-xenial-11 main'
 | 
			
		||||
              key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      dist: xenial
 | 
			
		||||
      compiler: clang++-10
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-10 CXXSTD=03,11,14,17,2a
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-10
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
            - sourceline: 'deb https://apt.llvm.org/xenial/ llvm-toolchain-xenial-10 main'
 | 
			
		||||
              key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: clang++-8
 | 
			
		||||
      env: UBSAN=1 TOOLSET=clang COMPILER=clang++-8 CXXSTD=03,11,14,17,2a UBSAN_OPTIONS=print_stacktrace=1
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-8
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
            - llvm-toolchain-xenial-8
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      dist: trusty
 | 
			
		||||
      compiler: clang++-libc++
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-libc++ CXXSTD=03,11,14,1z
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - libc++-dev
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      dist: trusty
 | 
			
		||||
      compiler: clang++-libc++
 | 
			
		||||
@@ -367,9 +142,14 @@ matrix:
 | 
			
		||||
          packages:
 | 
			
		||||
            - libc++-dev
 | 
			
		||||
 | 
			
		||||
    - os: osx
 | 
			
		||||
      compiler: clang++
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z
 | 
			
		||||
    - os: linux
 | 
			
		||||
      dist: bionic
 | 
			
		||||
      compiler: clang++-libc++
 | 
			
		||||
      env: UBSAN=1 TOOLSET=clang COMPILER=clang++-libc++ CXXSTD=03,11,14,17,2a UBSAN_OPTIONS=print_stacktrace=1
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - libc++-dev
 | 
			
		||||
 | 
			
		||||
    - os: osx
 | 
			
		||||
      compiler: clang++
 | 
			
		||||
@@ -380,6 +160,7 @@ matrix:
 | 
			
		||||
      script:
 | 
			
		||||
        - mkdir __build__ && cd __build__
 | 
			
		||||
        - cmake -DBOOST_ENABLE_CMAKE=1 -DBoost_VERBOSE=1 -DBOOST_INCLUDE_LIBRARIES=smart_ptr -DBUILD_TESTING=ON ..
 | 
			
		||||
        - cmake --build . --target tests -- -k
 | 
			
		||||
        - ctest --output-on-failure -R boost_smart_ptr
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
@@ -394,6 +175,7 @@ matrix:
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: CMAKE_INSTALL_TEST=1
 | 
			
		||||
      script:
 | 
			
		||||
        - pip install --user cmake
 | 
			
		||||
        - mkdir __build__ && cd __build__
 | 
			
		||||
        - cmake -DBOOST_ENABLE_CMAKE=1 -DBoost_VERBOSE=1 -DBOOST_INCLUDE_LIBRARIES=smart_ptr -DBUILD_TESTING=OFF -DCMAKE_INSTALL_PREFIX=~/.local ..
 | 
			
		||||
        - cmake --build . --target install
 | 
			
		||||
@@ -433,7 +215,7 @@ install:
 | 
			
		||||
 | 
			
		||||
script:
 | 
			
		||||
  - |-
 | 
			
		||||
    echo "using $TOOLSET : : $COMPILER ;" > ~/user-config.jam
 | 
			
		||||
    echo "using $TOOLSET : : $TRAVIS_COMPILER ;" > ~/user-config.jam
 | 
			
		||||
  - ./b2 -j3 libs/smart_ptr/test toolset=$TOOLSET cxxstd=$CXXSTD variant=debug,release ${UBSAN:+cxxflags=-fsanitize=undefined cxxflags=-fno-sanitize-recover=undefined linkflags=-fsanitize=undefined debug-symbols=on} ${LINKFLAGS:+linkflags=$LINKFLAGS}
 | 
			
		||||
 | 
			
		||||
notifications:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,9 @@
 | 
			
		||||
# Copyright 2018-2020 Peter Dimov
 | 
			
		||||
# Generated by `boostdep --cmake smart_ptr`
 | 
			
		||||
# Copyright 2020, 2021 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
 | 
			
		||||
# https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
cmake_minimum_required(VERSION 3.5...3.16)
 | 
			
		||||
cmake_minimum_required(VERSION 3.8...3.20)
 | 
			
		||||
 | 
			
		||||
project(boost_smart_ptr VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
 | 
			
		||||
 | 
			
		||||
@@ -16,20 +17,12 @@ target_link_libraries(boost_smart_ptr
 | 
			
		||||
    Boost::assert
 | 
			
		||||
    Boost::config
 | 
			
		||||
    Boost::core
 | 
			
		||||
    Boost::move
 | 
			
		||||
    Boost::static_assert
 | 
			
		||||
    Boost::throw_exception
 | 
			
		||||
    Boost::type_traits
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
if(BOOST_SUPERPROJECT_VERSION)
 | 
			
		||||
target_compile_features(boost_smart_ptr INTERFACE cxx_std_11)
 | 
			
		||||
 | 
			
		||||
  include(BoostInstall)
 | 
			
		||||
  boost_install(TARGETS boost_smart_ptr HEADER_DIRECTORY include/)
 | 
			
		||||
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
if(BUILD_TESTING)
 | 
			
		||||
if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")
 | 
			
		||||
 | 
			
		||||
  add_subdirectory(test)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										64
									
								
								appveyor.yml
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								appveyor.yml
									
									
									
									
									
								
							@@ -15,38 +15,48 @@ branches:
 | 
			
		||||
environment:
 | 
			
		||||
  matrix:
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
 | 
			
		||||
      TOOLSET: msvc-9.0,msvc-10.0,msvc-11.0
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
 | 
			
		||||
      TOOLSET: msvc-12.0,msvc-14.0
 | 
			
		||||
      TOOLSET: msvc-14.0
 | 
			
		||||
      ADDRMD: 32,64
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
 | 
			
		||||
      TOOLSET: msvc-14.1
 | 
			
		||||
      CXXSTD: 14,17
 | 
			
		||||
      ADDRMD: 32,64
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
 | 
			
		||||
      TOOLSET: clang-win
 | 
			
		||||
      CXXSTD: 14,17
 | 
			
		||||
      ADDRMD: 64
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
 | 
			
		||||
      TOOLSET: msvc-14.2
 | 
			
		||||
      CXXSTD: 14,17
 | 
			
		||||
      CXXSTD: 14
 | 
			
		||||
      ADDRMD: 32,64
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
 | 
			
		||||
      TOOLSET: msvc-14.2
 | 
			
		||||
      CXXSTD: 17
 | 
			
		||||
      ADDRMD: 32,64
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
 | 
			
		||||
      TOOLSET: msvc-14.2
 | 
			
		||||
      CXXSTD: 20
 | 
			
		||||
      ADDRMD: 32,64
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
 | 
			
		||||
      TOOLSET: msvc-14.2
 | 
			
		||||
      CXXSTD: latest
 | 
			
		||||
      ADDRMD: 32,64
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
 | 
			
		||||
      TOOLSET: clang-win
 | 
			
		||||
      CXXSTD: 14,17,latest
 | 
			
		||||
      ADDRMD: 64
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
 | 
			
		||||
      ADDPATH: C:\cygwin\bin;
 | 
			
		||||
      TOOLSET: gcc
 | 
			
		||||
      CXXSTD: 03,11,14,1z
 | 
			
		||||
      CXXSTD: 11,14,1z
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
 | 
			
		||||
      ADDPATH: C:\cygwin64\bin;
 | 
			
		||||
      TOOLSET: gcc
 | 
			
		||||
      CXXSTD: 03,11,14,1z
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
 | 
			
		||||
      ADDPATH: C:\mingw\bin;
 | 
			
		||||
      CXXSTD: 11,14,1z
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022
 | 
			
		||||
      ADDPATH: C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin;
 | 
			
		||||
      TOOLSET: gcc
 | 
			
		||||
      CXXSTD: 03,11,14,1z
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
 | 
			
		||||
      ADDPATH: C:\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev1\mingw64\bin;
 | 
			
		||||
      CXXSTD: 11,14,17
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022
 | 
			
		||||
      ADDPATH: C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;
 | 
			
		||||
      TOOLSET: gcc
 | 
			
		||||
      CXXSTD: 03,11,14,1z
 | 
			
		||||
      CXXSTD: 11,14,17
 | 
			
		||||
 | 
			
		||||
install:
 | 
			
		||||
  - set BOOST_BRANCH=develop
 | 
			
		||||
@@ -54,25 +64,9 @@ install:
 | 
			
		||||
  - cd ..
 | 
			
		||||
  - git clone -b %BOOST_BRANCH% --depth 1 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/container_hash
 | 
			
		||||
  - git submodule init libs/core
 | 
			
		||||
  - git submodule init libs/move
 | 
			
		||||
  - git submodule init libs/predef
 | 
			
		||||
  - git submodule init libs/static_assert
 | 
			
		||||
  - git submodule init libs/throw_exception
 | 
			
		||||
  - git submodule init libs/type_traits
 | 
			
		||||
  - git submodule init libs/detail
 | 
			
		||||
  - git submodule init libs/integer
 | 
			
		||||
  - git submodule init tools/build
 | 
			
		||||
  - git submodule init libs/headers
 | 
			
		||||
  - git submodule init tools/boost_install
 | 
			
		||||
  - git submodule init libs/bind
 | 
			
		||||
  - git submodule update --jobs 3
 | 
			
		||||
  - xcopy /s /e /q %APPVEYOR_BUILD_FOLDER% libs\smart_ptr\
 | 
			
		||||
  - git submodule update --init tools/boostdep
 | 
			
		||||
  - python tools/boostdep/depinst/depinst.py smart_ptr
 | 
			
		||||
  - cmd /c bootstrap
 | 
			
		||||
  - b2 -d0 headers
 | 
			
		||||
 | 
			
		||||
@@ -82,4 +76,4 @@ test_script:
 | 
			
		||||
  - PATH=%ADDPATH%%PATH%
 | 
			
		||||
  - if not "%CXXSTD%" == "" set CXXSTD=cxxstd=%CXXSTD%
 | 
			
		||||
  - if not "%ADDRMD%" == "" set ADDRMD=address-model=%ADDRMD%
 | 
			
		||||
  - b2 -j3 libs/smart_ptr/test toolset=%TOOLSET% %CXXSTD% %ADDRMD% variant=debug,release
 | 
			
		||||
  - b2 -j3 libs/smart_ptr/test toolset=%TOOLSET% %CXXSTD% %ADDRMD% variant=debug,release embed-manifest-via=linker
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								build.jam
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								build.jam
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
# Copyright 2023-2024 René Ferdinand Rivera Morell
 | 
			
		||||
# Copyright 2024 Peter Dimov
 | 
			
		||||
# Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
# https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
require-b2 5.2 ;
 | 
			
		||||
 | 
			
		||||
constant boost_dependencies :
 | 
			
		||||
    /boost/assert//boost_assert
 | 
			
		||||
    /boost/config//boost_config
 | 
			
		||||
    /boost/core//boost_core
 | 
			
		||||
    /boost/throw_exception//boost_throw_exception
 | 
			
		||||
    ;
 | 
			
		||||
 | 
			
		||||
project /boost/smart_ptr ;
 | 
			
		||||
 | 
			
		||||
explicit
 | 
			
		||||
    [ alias boost_smart_ptr : : : : <include>include <library>$(boost_dependencies) ]
 | 
			
		||||
    [ alias all : boost_smart_ptr test ]
 | 
			
		||||
    ;
 | 
			
		||||
 | 
			
		||||
call-if : boost-library smart_ptr
 | 
			
		||||
    ;
 | 
			
		||||
@@ -14,6 +14,8 @@ Greg Colvin, Beman Dawes, Peter Dimov, Glen Fernandes
 | 
			
		||||
:idprefix:
 | 
			
		||||
:listing-caption: Code Example
 | 
			
		||||
:docinfo: private-footer
 | 
			
		||||
:source-highlighter: rouge
 | 
			
		||||
:source-language: c++
 | 
			
		||||
 | 
			
		||||
:leveloffset: +1
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
////
 | 
			
		||||
Copyright 2019 Glen Joseph Fernandes (glenjofe@gmail.com)
 | 
			
		||||
Copyright 2019-2021 Glen Joseph Fernandes (glenjofe@gmail.com)
 | 
			
		||||
 | 
			
		||||
Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
 | 
			
		||||
@@ -85,6 +85,11 @@ namespace boost {
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
    std::unique_ptr<remove_extent_t<T>[], alloc_noinit_deleter<T, A>>
 | 
			
		||||
      allocate_unique_noinit(const A& a);
 | 
			
		||||
 | 
			
		||||
  template<class T, class U, class A>
 | 
			
		||||
    allocator_pointer_t<allocator_rebind_t<A, remove_cv_t<remove_extent_t<T>>>>
 | 
			
		||||
      get_allocator_pointer(const std::unique_ptr<T,
 | 
			
		||||
        alloc_deleter<U, A>>& p) noexcept;
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
@@ -269,6 +274,18 @@ Returns:: A `std::unique_ptr` to a sequence of `extent_v<T>`
 | 
			
		||||
default-initialized objects of type `remove_extent_t<T>`.
 | 
			
		||||
Example:: `auto p = allocate_unique_noinit<double[1024]>(a);`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class U, class A>
 | 
			
		||||
  allocator_pointer_t<allocator_rebind_t<A, remove_cv_t<remove_extent_t<T>>>>
 | 
			
		||||
    get_allocator_pointer(const std::unique_ptr<T,
 | 
			
		||||
      alloc_deleter<U, A>>& p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: The allocator pointer to the allocation.
 | 
			
		||||
Example:: `auto r = boost::get_allocator_ptr(p);`
 | 
			
		||||
 | 
			
		||||
## Deleter
 | 
			
		||||
 | 
			
		||||
Class template `alloc_deleter` is the deleter used by the `allocate_unique`
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
////
 | 
			
		||||
Copyright 2019, 2020 Peter Dimov
 | 
			
		||||
Copyright 2019-2025 Peter Dimov
 | 
			
		||||
 | 
			
		||||
Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
 | 
			
		||||
@@ -13,6 +13,24 @@ http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
:toc-title:
 | 
			
		||||
:idprefix: changelog_
 | 
			
		||||
 | 
			
		||||
## Changes in 1.88.0
 | 
			
		||||
 | 
			
		||||
* Fix `operator<<` for wide streams (accidentally broken in 1.87.0)
 | 
			
		||||
 | 
			
		||||
## Changes in 1.87.0
 | 
			
		||||
 | 
			
		||||
* {cpp}03 is no longer supported, a {cpp}11 compiler is required.
 | 
			
		||||
  This includes GCC 4.8 or later, and MSVC 14.0 or later.
 | 
			
		||||
* The functionality enabled by the macros `BOOST_SP_ENABLE_DEBUG_HOOKS`,
 | 
			
		||||
  `BOOST_SP_USE_STD_ALLOCATOR`, `BOOST_SP_USE_QUICK_ALLOCATOR`,
 | 
			
		||||
  `BOOST_AC_USE_SPINLOCK`, `BOOST_AC_USE_PTHREADS`, `BOOST_SP_USE_SPINLOCK`,
 | 
			
		||||
  and `BOOST_SP_USE_PTHREADS` has been deprecated and support for it
 | 
			
		||||
  will be removed in a future release.
 | 
			
		||||
 | 
			
		||||
## Changes in 1.79.0
 | 
			
		||||
 | 
			
		||||
* Added `get_allocator_pointer`
 | 
			
		||||
 | 
			
		||||
## Changes in 1.74.0
 | 
			
		||||
 | 
			
		||||
* Added `owner_equals` to `shared_ptr`, `weak_ptr`, `local_shared_ptr`
 | 
			
		||||
 
 | 
			
		||||
@@ -30,8 +30,8 @@ requests from users.
 | 
			
		||||
 | 
			
		||||
This library also provides additional overloads of `make_unique` for
 | 
			
		||||
default-initialization, when users do not need or want to incur the expense
 | 
			
		||||
of value-initialization. The {cpp} standard does not yet provide this
 | 
			
		||||
feature with `std::make_unique`.
 | 
			
		||||
of value-initialization. The {cpp}20 standard now provides this feature with
 | 
			
		||||
`std::make_unique_for_overwrite`.
 | 
			
		||||
 | 
			
		||||
## Synopsis
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -210,7 +210,8 @@ T* get() const noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: The stored pointer.
 | 
			
		||||
Returns::
 | 
			
		||||
  The stored pointer.
 | 
			
		||||
 | 
			
		||||
### unique
 | 
			
		||||
 | 
			
		||||
@@ -220,8 +221,8 @@ bool unique() const noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `true` if no other `shared_array` is sharing ownership of the
 | 
			
		||||
stored pointer, `false` otherwise.
 | 
			
		||||
Returns::
 | 
			
		||||
  `true` if no other `shared_array` is sharing ownership of the stored pointer, `false` otherwise.
 | 
			
		||||
 | 
			
		||||
### use_count
 | 
			
		||||
 | 
			
		||||
@@ -253,7 +254,8 @@ void swap(shared_array<T>& b) noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Exchanges the contents of the two smart pointers.
 | 
			
		||||
Effects::
 | 
			
		||||
  Exchanges the contents of the two smart pointers.
 | 
			
		||||
 | 
			
		||||
## Free Functions
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
#include <boost/detail/lightweight_mutex.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/lightweight_mutex.hpp>
 | 
			
		||||
#include <cstdlib>
 | 
			
		||||
#include <map>
 | 
			
		||||
#include <deque>
 | 
			
		||||
 
 | 
			
		||||
@@ -73,15 +73,11 @@ void * operator new(size_t n) throw(bad_alloc)
 | 
			
		||||
    return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_BORLANDC) || (BOOST_BORLANDC > 0x551)
 | 
			
		||||
 | 
			
		||||
void * operator new(size_t n, nothrow_t const &) throw()
 | 
			
		||||
{
 | 
			
		||||
    return allocate(n, allocated_scalar);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void * operator new[](size_t n) throw(bad_alloc)
 | 
			
		||||
{
 | 
			
		||||
    void * p = allocate(n, allocated_array);
 | 
			
		||||
@@ -95,15 +91,11 @@ void * operator new[](size_t n) throw(bad_alloc)
 | 
			
		||||
    return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_BORLANDC) || (BOOST_BORLANDC > 0x551)
 | 
			
		||||
 | 
			
		||||
void * operator new[](size_t n, nothrow_t const &) throw()
 | 
			
		||||
{
 | 
			
		||||
    return allocate(n, allocated_array);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// debug hooks
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
@@ -205,15 +197,11 @@ void operator delete(void * p) throw()
 | 
			
		||||
    free(pm);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_BORLANDC) || (BOOST_BORLANDC > 0x551)
 | 
			
		||||
 | 
			
		||||
void operator delete(void * p, nothrow_t const &) throw()
 | 
			
		||||
{
 | 
			
		||||
    ::operator delete(p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void operator delete[](void * p) throw()
 | 
			
		||||
{
 | 
			
		||||
    if(p == 0) return;
 | 
			
		||||
@@ -231,13 +219,9 @@ void operator delete[](void * p) throw()
 | 
			
		||||
    free(pm);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_BORLANDC) || (BOOST_BORLANDC > 0x551)
 | 
			
		||||
 | 
			
		||||
void operator delete[](void * p, nothrow_t const &) throw()
 | 
			
		||||
{
 | 
			
		||||
    ::operator delete[](p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,3 @@
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC)
 | 
			
		||||
#pragma warning(disable: 4786)  // identifier truncated in debug info
 | 
			
		||||
#pragma warning(disable: 4710)  // function not inlined
 | 
			
		||||
#pragma warning(disable: 4711)  // function selected for automatic inline expansion
 | 
			
		||||
#pragma warning(disable: 4514)  // unreferenced inline removed
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  shared_ptr_mt_test.cpp - tests shared_ptr with multiple threads
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
@@ -18,14 +9,14 @@
 | 
			
		||||
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
#include <boost/bind.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/lightweight_thread.hpp>
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
#include <ctime>
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/lightweight_thread.hpp>
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
int const n = 1024 * 1024;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,3 @@
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC)
 | 
			
		||||
#pragma warning(disable: 4786)  // identifier truncated in debug info
 | 
			
		||||
#pragma warning(disable: 4710)  // function not inlined
 | 
			
		||||
#pragma warning(disable: 4711)  // function selected for automatic inline expansion
 | 
			
		||||
#pragma warning(disable: 4514)  // unreferenced inline removed
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  shared_ptr_timing_test.cpp - use to evaluate the impact of thread safety
 | 
			
		||||
//
 | 
			
		||||
 
 | 
			
		||||
@@ -13,8 +13,8 @@
 | 
			
		||||
#include <boost/thread/shared_mutex.hpp>
 | 
			
		||||
#include <boost/thread/locks.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/lightweight_mutex.hpp>
 | 
			
		||||
#include <boost/detail/lightweight_thread.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/lightweight_mutex.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/lightweight_thread.hpp>
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <numeric>
 | 
			
		||||
 
 | 
			
		||||
@@ -18,9 +18,9 @@
 | 
			
		||||
#include <boost/thread/locks.hpp>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/lightweight_mutex.hpp>
 | 
			
		||||
#include <boost/detail/lightweight_test.hpp>
 | 
			
		||||
#include <boost/detail/lightweight_thread.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/lightweight_mutex.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/lightweight_thread.hpp>
 | 
			
		||||
#include <boost/core/lightweight_test.hpp>
 | 
			
		||||
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
#include <ctime>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,3 @@
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC)
 | 
			
		||||
#pragma warning(disable: 4786)  // identifier truncated in debug info
 | 
			
		||||
#pragma warning(disable: 4710)  // function not inlined
 | 
			
		||||
#pragma warning(disable: 4711)  // function selected for automatic inline expansion
 | 
			
		||||
#pragma warning(disable: 4514)  // unreferenced inline removed
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  weak_ptr_mt_test.cpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
@@ -19,15 +10,15 @@
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
#include <boost/weak_ptr.hpp>
 | 
			
		||||
#include <boost/bind.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/lightweight_thread.hpp>
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
#include <ctime>
 | 
			
		||||
#include <cstdlib>
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/lightweight_thread.hpp>
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
int const n = 16384;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,3 @@
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC)
 | 
			
		||||
#pragma warning(disable: 4786)  // identifier truncated in debug info
 | 
			
		||||
#pragma warning(disable: 4710)  // function not inlined
 | 
			
		||||
#pragma warning(disable: 4711)  // function selected for automatic inline expansion
 | 
			
		||||
#pragma warning(disable: 4514)  // unreferenced inline removed
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  weak_ptr_timing_test.cpp
 | 
			
		||||
//
 | 
			
		||||
@@ -20,6 +11,7 @@
 | 
			
		||||
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
#include <boost/weak_ptr.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,13 @@
 | 
			
		||||
#ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
// Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
#include <boost/config/header_deprecated.hpp>
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count.hpp - thread/SMP safe reference counter
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
//  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
 | 
			
		||||
BOOST_HEADER_DEPRECATED("<boost/smart_ptr/detail/atomic_count.hpp>")
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/atomic_count.hpp>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +1,13 @@
 | 
			
		||||
#ifndef BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
 | 
			
		||||
#define BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
// Copyright (c) 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
#include <boost/config/header_deprecated.hpp>
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/lightweight_mutex.hpp - lightweight mutex
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
//  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
 | 
			
		||||
//
 | 
			
		||||
BOOST_HEADER_DEPRECATED("<boost/smart_ptr/detail/lightweight_mutex.hpp>")
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/lightweight_mutex.hpp>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,25 +1,14 @@
 | 
			
		||||
#ifndef BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED
 | 
			
		||||
#define BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
// Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
// Copyright (c) 2008, 2018 Peter Dimov
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
#include <boost/config/header_deprecated.hpp>
 | 
			
		||||
 | 
			
		||||
//  boost/detail/lightweight_thread.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright (c) 2008, 2018 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
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  typedef /*...*/ lw_thread_t; // as pthread_t
 | 
			
		||||
//  template<class F> int lw_thread_create( lw_thread_t & th, F f );
 | 
			
		||||
//  void lw_thread_join( lw_thread_t th );
 | 
			
		||||
BOOST_HEADER_DEPRECATED("<boost/smart_ptr/detail/lightweight_thread.hpp>")
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/lightweight_thread.hpp>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,22 +1,14 @@
 | 
			
		||||
#ifndef BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
// Copyright (c) 2003 David Abrahams
 | 
			
		||||
// Copyright (c) 2003 Peter Dimov
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
#include <boost/config/header_deprecated.hpp>
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/quick_allocator.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2003 David Abrahams
 | 
			
		||||
//  Copyright (c) 2003 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
 | 
			
		||||
//
 | 
			
		||||
BOOST_HEADER_DEPRECATED("<boost/smart_ptr/detail/quick_allocator.hpp>")
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/quick_allocator.hpp>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -10,49 +10,39 @@
 | 
			
		||||
#ifndef BOOST_POINTER_CAST_HPP
 | 
			
		||||
#define BOOST_POINTER_CAST_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <type_traits>
 | 
			
		||||
 | 
			
		||||
namespace boost { 
 | 
			
		||||
 | 
			
		||||
//static_pointer_cast overload for raw pointers
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
inline T* static_pointer_cast(U *ptr) BOOST_SP_NOEXCEPT
 | 
			
		||||
inline T* static_pointer_cast(U *ptr) noexcept
 | 
			
		||||
{  
 | 
			
		||||
   return static_cast<T*>(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//dynamic_pointer_cast overload for raw pointers
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
inline T* dynamic_pointer_cast(U *ptr) BOOST_SP_NOEXCEPT
 | 
			
		||||
inline T* dynamic_pointer_cast(U *ptr) noexcept
 | 
			
		||||
{  
 | 
			
		||||
   return dynamic_cast<T*>(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//const_pointer_cast overload for raw pointers
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
inline T* const_pointer_cast(U *ptr) BOOST_SP_NOEXCEPT
 | 
			
		||||
inline T* const_pointer_cast(U *ptr) noexcept
 | 
			
		||||
{  
 | 
			
		||||
   return const_cast<T*>(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//reinterpret_pointer_cast overload for raw pointers
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
inline T* reinterpret_pointer_cast(U *ptr) BOOST_SP_NOEXCEPT
 | 
			
		||||
inline T* reinterpret_pointer_cast(U *ptr) noexcept
 | 
			
		||||
{  
 | 
			
		||||
   return reinterpret_cast<T*>(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // 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;
 | 
			
		||||
 | 
			
		||||
@@ -63,7 +53,7 @@ using std::dynamic_pointer_cast;
 | 
			
		||||
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_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> std::shared_ptr<T> reinterpret_pointer_cast(const std::shared_ptr<U> & r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) reinterpret_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -74,7 +64,7 @@ template<class T, class U> std::shared_ptr<T> reinterpret_pointer_cast(const std
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//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_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> std::unique_ptr<T> static_pointer_cast( std::unique_ptr<U> && r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) static_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -84,11 +74,11 @@ template<class T, class U> std::unique_ptr<T> static_pointer_cast( std::unique_p
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//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_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> std::unique_ptr<T> dynamic_pointer_cast( std::unique_ptr<U> && r ) 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." );
 | 
			
		||||
    static_assert( std::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();
 | 
			
		||||
@@ -96,7 +86,7 @@ template<class T, class U> std::unique_ptr<T> dynamic_pointer_cast( std::unique_
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//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_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> std::unique_ptr<T> const_pointer_cast( std::unique_ptr<U> && r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) const_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -106,7 +96,7 @@ template<class T, class U> std::unique_ptr<T> const_pointer_cast( std::unique_pt
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//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_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> std::unique_ptr<T> reinterpret_pointer_cast( std::unique_ptr<U> && r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) reinterpret_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -117,6 +107,4 @@ template<class T, class U> std::unique_ptr<T> reinterpret_pointer_cast( std::uni
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #if !defined( BOOST_NO_CXX11_SMART_PTR )
 | 
			
		||||
 | 
			
		||||
#endif   //BOOST_POINTER_CAST_HPP
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,8 @@ Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/allocate_shared_array.hpp>
 | 
			
		||||
#include <boost/smart_ptr/local_shared_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_type_traits.hpp>
 | 
			
		||||
#include <type_traits>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
namespace detail {
 | 
			
		||||
@@ -17,16 +19,16 @@ namespace detail {
 | 
			
		||||
class BOOST_SYMBOL_VISIBLE lsp_array_base
 | 
			
		||||
    : public local_counted_base {
 | 
			
		||||
public:
 | 
			
		||||
    void set(sp_counted_base* base) BOOST_SP_NOEXCEPT {
 | 
			
		||||
    void set(sp_counted_base* base) noexcept {
 | 
			
		||||
        count_ = shared_count(base);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void local_cb_destroy() BOOST_SP_NOEXCEPT BOOST_OVERRIDE {
 | 
			
		||||
    void local_cb_destroy() noexcept override {
 | 
			
		||||
        shared_count().swap(count_);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    shared_count local_cb_get_shared_count() const
 | 
			
		||||
        BOOST_SP_NOEXCEPT BOOST_OVERRIDE {
 | 
			
		||||
        noexcept override {
 | 
			
		||||
        return count_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -39,10 +41,10 @@ class lsp_array_state
 | 
			
		||||
    : public sp_array_state<A> {
 | 
			
		||||
public:
 | 
			
		||||
    template<class U>
 | 
			
		||||
    lsp_array_state(const U& other, std::size_t size) BOOST_SP_NOEXCEPT
 | 
			
		||||
    lsp_array_state(const U& other, std::size_t size) noexcept
 | 
			
		||||
        : sp_array_state<A>(other, size) { }
 | 
			
		||||
 | 
			
		||||
    lsp_array_base& base() BOOST_SP_NOEXCEPT {
 | 
			
		||||
    lsp_array_base& base() noexcept {
 | 
			
		||||
        return base_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -55,10 +57,10 @@ class lsp_size_array_state
 | 
			
		||||
    : public sp_size_array_state<A, N> {
 | 
			
		||||
public:
 | 
			
		||||
    template<class U>
 | 
			
		||||
    lsp_size_array_state(const U& other, std::size_t size) BOOST_SP_NOEXCEPT
 | 
			
		||||
    lsp_size_array_state(const U& other, std::size_t size) noexcept
 | 
			
		||||
        : sp_size_array_state<A, N>(other, size) { }
 | 
			
		||||
 | 
			
		||||
    lsp_array_base& base() BOOST_SP_NOEXCEPT {
 | 
			
		||||
    lsp_array_base& base() noexcept {
 | 
			
		||||
        return base_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -69,7 +71,7 @@ private:
 | 
			
		||||
} /* detail */
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_unbounded_array<T>::value,
 | 
			
		||||
    local_shared_ptr<T> >::type
 | 
			
		||||
allocate_local_shared(const A& allocator, std::size_t count)
 | 
			
		||||
{
 | 
			
		||||
@@ -89,12 +91,12 @@ allocate_local_shared(const A& allocator, std::size_t count)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_bounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_bounded_array<T>::value,
 | 
			
		||||
    local_shared_ptr<T> >::type
 | 
			
		||||
allocate_local_shared(const A& allocator)
 | 
			
		||||
{
 | 
			
		||||
    enum {
 | 
			
		||||
        count = extent<T>::value
 | 
			
		||||
        count = std::extent<T>::value
 | 
			
		||||
    };
 | 
			
		||||
    typedef typename detail::sp_array_element<T>::type element;
 | 
			
		||||
    typedef typename allocator_rebind<A, element>::type other;
 | 
			
		||||
@@ -112,10 +114,10 @@ allocate_local_shared(const A& allocator)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_unbounded_array<T>::value,
 | 
			
		||||
    local_shared_ptr<T> >::type
 | 
			
		||||
allocate_local_shared(const A& allocator, std::size_t count,
 | 
			
		||||
    const typename remove_extent<T>::type& value)
 | 
			
		||||
    const typename std::remove_extent<T>::type& value)
 | 
			
		||||
{
 | 
			
		||||
    typedef typename detail::sp_array_element<T>::type element;
 | 
			
		||||
    typedef typename allocator_rebind<A, element>::type other;
 | 
			
		||||
@@ -133,13 +135,13 @@ allocate_local_shared(const A& allocator, std::size_t count,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_bounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_bounded_array<T>::value,
 | 
			
		||||
    local_shared_ptr<T> >::type
 | 
			
		||||
allocate_local_shared(const A& allocator,
 | 
			
		||||
    const typename remove_extent<T>::type& value)
 | 
			
		||||
    const typename std::remove_extent<T>::type& value)
 | 
			
		||||
{
 | 
			
		||||
    enum {
 | 
			
		||||
        count = extent<T>::value
 | 
			
		||||
        count = std::extent<T>::value
 | 
			
		||||
    };
 | 
			
		||||
    typedef typename detail::sp_array_element<T>::type element;
 | 
			
		||||
    typedef typename allocator_rebind<A, element>::type other;
 | 
			
		||||
@@ -157,7 +159,7 @@ allocate_local_shared(const A& allocator,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_unbounded_array<T>::value,
 | 
			
		||||
    local_shared_ptr<T> >::type
 | 
			
		||||
allocate_local_shared_noinit(const A& allocator, std::size_t count)
 | 
			
		||||
{
 | 
			
		||||
@@ -166,7 +168,7 @@ allocate_local_shared_noinit(const A& allocator, std::size_t count)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_bounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_bounded_array<T>::value,
 | 
			
		||||
    local_shared_ptr<T> >::type
 | 
			
		||||
allocate_local_shared_noinit(const A& allocator)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -12,22 +12,16 @@ Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
#include <boost/core/alloc_construct.hpp>
 | 
			
		||||
#include <boost/core/first_scalar.hpp>
 | 
			
		||||
#include <boost/smart_ptr/shared_ptr.hpp>
 | 
			
		||||
#include <boost/type_traits/alignment_of.hpp>
 | 
			
		||||
#include <boost/type_traits/enable_if.hpp>
 | 
			
		||||
#include <boost/type_traits/extent.hpp>
 | 
			
		||||
#include <boost/type_traits/is_bounded_array.hpp>
 | 
			
		||||
#include <boost/type_traits/is_unbounded_array.hpp>
 | 
			
		||||
#include <boost/type_traits/remove_cv.hpp>
 | 
			
		||||
#include <boost/type_traits/remove_extent.hpp>
 | 
			
		||||
#include <boost/type_traits/type_with_alignment.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_type_traits.hpp>
 | 
			
		||||
#include <type_traits>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
namespace detail {
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct sp_array_element {
 | 
			
		||||
    typedef typename boost::remove_cv<typename
 | 
			
		||||
        boost::remove_extent<T>::type>::type type;
 | 
			
		||||
    typedef typename std::remove_cv<typename
 | 
			
		||||
        std::remove_extent<T>::type>::type type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
@@ -59,8 +53,8 @@ struct sp_align_up {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
BOOST_CONSTEXPR inline std::size_t
 | 
			
		||||
sp_objects(std::size_t size) BOOST_SP_NOEXCEPT
 | 
			
		||||
constexpr inline std::size_t
 | 
			
		||||
sp_objects(std::size_t size) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return (size + sizeof(T) - 1) / sizeof(T);
 | 
			
		||||
}
 | 
			
		||||
@@ -71,15 +65,15 @@ public:
 | 
			
		||||
    typedef A type;
 | 
			
		||||
 | 
			
		||||
    template<class U>
 | 
			
		||||
    sp_array_state(const U& _allocator, std::size_t _size) BOOST_SP_NOEXCEPT
 | 
			
		||||
    sp_array_state(const U& _allocator, std::size_t _size) noexcept
 | 
			
		||||
        : allocator_(_allocator),
 | 
			
		||||
          size_(_size) { }
 | 
			
		||||
 | 
			
		||||
    A& allocator() BOOST_SP_NOEXCEPT {
 | 
			
		||||
    A& allocator() noexcept {
 | 
			
		||||
        return allocator_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::size_t size() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
    std::size_t size() const noexcept {
 | 
			
		||||
        return size_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -94,14 +88,14 @@ public:
 | 
			
		||||
    typedef A type;
 | 
			
		||||
 | 
			
		||||
    template<class U>
 | 
			
		||||
    sp_size_array_state(const U& _allocator, std::size_t) BOOST_SP_NOEXCEPT
 | 
			
		||||
    sp_size_array_state(const U& _allocator, std::size_t) noexcept
 | 
			
		||||
        : allocator_(_allocator) { }
 | 
			
		||||
 | 
			
		||||
    A& allocator() BOOST_SP_NOEXCEPT {
 | 
			
		||||
    A& allocator() noexcept {
 | 
			
		||||
        return allocator_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR std::size_t size() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
    constexpr std::size_t size() const noexcept {
 | 
			
		||||
        return N;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -112,8 +106,8 @@ private:
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
struct sp_array_alignment {
 | 
			
		||||
    enum {
 | 
			
		||||
        value = sp_max_size<boost::alignment_of<T>::value,
 | 
			
		||||
            boost::alignment_of<U>::value>::value
 | 
			
		||||
        value = sp_max_size<std::alignment_of<T>::value,
 | 
			
		||||
            std::alignment_of<U>::value>::value
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -126,7 +120,7 @@ struct sp_array_offset {
 | 
			
		||||
 | 
			
		||||
template<class U, class T>
 | 
			
		||||
inline U*
 | 
			
		||||
sp_array_start(T* base) BOOST_SP_NOEXCEPT
 | 
			
		||||
sp_array_start(T* base) noexcept
 | 
			
		||||
{
 | 
			
		||||
    enum {
 | 
			
		||||
        size = sp_array_offset<T, U>::value
 | 
			
		||||
@@ -142,12 +136,12 @@ class sp_array_creator {
 | 
			
		||||
        offset = sp_array_offset<T, element>::value
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    typedef typename boost::type_with_alignment<sp_array_alignment<T,
 | 
			
		||||
    typedef typename sp_type_with_alignment<sp_array_alignment<T,
 | 
			
		||||
        element>::value>::type type;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    template<class U>
 | 
			
		||||
    sp_array_creator(const U& other, std::size_t size) BOOST_SP_NOEXCEPT
 | 
			
		||||
    sp_array_creator(const U& other, std::size_t size) noexcept
 | 
			
		||||
        : other_(other),
 | 
			
		||||
          size_(sp_objects<type>(offset + sizeof(element) * size)) { }
 | 
			
		||||
 | 
			
		||||
@@ -191,33 +185,33 @@ public:
 | 
			
		||||
            boost::first_scalar(&list), count);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T& state() BOOST_SP_NOEXCEPT {
 | 
			
		||||
    T& state() noexcept {
 | 
			
		||||
        return state_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void dispose() BOOST_SP_NOEXCEPT BOOST_OVERRIDE {
 | 
			
		||||
    void dispose() noexcept override {
 | 
			
		||||
        boost::alloc_destroy_n(state_.allocator(),
 | 
			
		||||
            boost::first_scalar(sp_array_start<type>(this)),
 | 
			
		||||
            state_.size() * sp_array_count<type>::value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void destroy() BOOST_SP_NOEXCEPT BOOST_OVERRIDE {
 | 
			
		||||
    void destroy() noexcept override {
 | 
			
		||||
        sp_array_creator<allocator, sp_array_base> other(state_.allocator(),
 | 
			
		||||
            state_.size());
 | 
			
		||||
        this->~sp_array_base();
 | 
			
		||||
        other.destroy(this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void* get_deleter(const sp_typeinfo_&) BOOST_SP_NOEXCEPT BOOST_OVERRIDE {
 | 
			
		||||
    void* get_deleter(const sp_typeinfo_&) noexcept override {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void* get_local_deleter(const sp_typeinfo_&)
 | 
			
		||||
        BOOST_SP_NOEXCEPT BOOST_OVERRIDE {
 | 
			
		||||
        noexcept override {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void* get_untyped_deleter() BOOST_SP_NOEXCEPT BOOST_OVERRIDE {
 | 
			
		||||
    void* get_untyped_deleter() noexcept override {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -239,11 +233,11 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T* get() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
    T* get() const noexcept {
 | 
			
		||||
        return result_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() BOOST_SP_NOEXCEPT {
 | 
			
		||||
    void release() noexcept {
 | 
			
		||||
        result_ = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -258,7 +252,7 @@ private:
 | 
			
		||||
} /* detail */
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_unbounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
allocate_shared(const A& allocator, std::size_t count)
 | 
			
		||||
{
 | 
			
		||||
    typedef typename detail::sp_array_element<T>::type element;
 | 
			
		||||
@@ -275,15 +269,15 @@ allocate_shared(const A& allocator, std::size_t count)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_bounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_bounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
allocate_shared(const A& allocator)
 | 
			
		||||
{
 | 
			
		||||
    enum {
 | 
			
		||||
        count = extent<T>::value
 | 
			
		||||
        count = std::extent<T>::value
 | 
			
		||||
    };
 | 
			
		||||
    typedef typename detail::sp_array_element<T>::type element;
 | 
			
		||||
    typedef typename allocator_rebind<A, element>::type other;
 | 
			
		||||
    typedef detail::sp_size_array_state<other, extent<T>::value> state;
 | 
			
		||||
    typedef detail::sp_size_array_state<other, std::extent<T>::value> state;
 | 
			
		||||
    typedef detail::sp_array_base<state> base;
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, count);
 | 
			
		||||
    base* node = result.get();
 | 
			
		||||
@@ -295,9 +289,9 @@ allocate_shared(const A& allocator)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_unbounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
allocate_shared(const A& allocator, std::size_t count,
 | 
			
		||||
    const typename remove_extent<T>::type& value)
 | 
			
		||||
    const typename std::remove_extent<T>::type& value)
 | 
			
		||||
{
 | 
			
		||||
    typedef typename detail::sp_array_element<T>::type element;
 | 
			
		||||
    typedef typename allocator_rebind<A, element>::type other;
 | 
			
		||||
@@ -313,16 +307,16 @@ allocate_shared(const A& allocator, std::size_t count,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_bounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_bounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
allocate_shared(const A& allocator,
 | 
			
		||||
    const typename remove_extent<T>::type& value)
 | 
			
		||||
    const typename std::remove_extent<T>::type& value)
 | 
			
		||||
{
 | 
			
		||||
    enum {
 | 
			
		||||
        count = extent<T>::value
 | 
			
		||||
        count = std::extent<T>::value
 | 
			
		||||
    };
 | 
			
		||||
    typedef typename detail::sp_array_element<T>::type element;
 | 
			
		||||
    typedef typename allocator_rebind<A, element>::type other;
 | 
			
		||||
    typedef detail::sp_size_array_state<other, extent<T>::value> state;
 | 
			
		||||
    typedef detail::sp_size_array_state<other, std::extent<T>::value> state;
 | 
			
		||||
    typedef detail::sp_array_base<state> base;
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, count);
 | 
			
		||||
    base* node = result.get();
 | 
			
		||||
@@ -334,14 +328,14 @@ allocate_shared(const A& allocator,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_unbounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
allocate_shared_noinit(const A& allocator, std::size_t count)
 | 
			
		||||
{
 | 
			
		||||
    return boost::allocate_shared<T>(boost::noinit_adapt(allocator), count);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_bounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_bounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
allocate_shared_noinit(const A& allocator)
 | 
			
		||||
{
 | 
			
		||||
    return boost::allocate_shared<T>(boost::noinit_adapt(allocator));
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2019 Glen Joseph Fernandes
 | 
			
		||||
Copyright 2019-2021 Glen Joseph Fernandes
 | 
			
		||||
(glenjofe@gmail.com)
 | 
			
		||||
 | 
			
		||||
Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
@@ -8,42 +8,35 @@ Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
#ifndef BOOST_SMART_PTR_ALLOCATE_UNIQUE_HPP
 | 
			
		||||
#define BOOST_SMART_PTR_ALLOCATE_UNIQUE_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_nullptr_t.hpp>
 | 
			
		||||
#include <boost/core/allocator_access.hpp>
 | 
			
		||||
#include <boost/core/alloc_construct.hpp>
 | 
			
		||||
#include <boost/core/empty_value.hpp>
 | 
			
		||||
#include <boost/core/first_scalar.hpp>
 | 
			
		||||
#include <boost/core/noinit_adaptor.hpp>
 | 
			
		||||
#include <boost/core/pointer_traits.hpp>
 | 
			
		||||
#include <boost/type_traits/enable_if.hpp>
 | 
			
		||||
#include <boost/type_traits/extent.hpp>
 | 
			
		||||
#include <boost/type_traits/is_array.hpp>
 | 
			
		||||
#include <boost/type_traits/is_bounded_array.hpp>
 | 
			
		||||
#include <boost/type_traits/is_unbounded_array.hpp>
 | 
			
		||||
#include <boost/type_traits/remove_cv.hpp>
 | 
			
		||||
#include <boost/type_traits/remove_extent.hpp>
 | 
			
		||||
#include <boost/type_traits/type_identity.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_type_traits.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <utility>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
#include <type_traits>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
namespace detail {
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct sp_alloc_size {
 | 
			
		||||
    BOOST_STATIC_CONSTEXPR std::size_t value = 1;
 | 
			
		||||
    static constexpr std::size_t value = 1;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct sp_alloc_size<T[]> {
 | 
			
		||||
    BOOST_STATIC_CONSTEXPR std::size_t value = sp_alloc_size<T>::value;
 | 
			
		||||
    static constexpr std::size_t value = sp_alloc_size<T>::value;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, std::size_t N>
 | 
			
		||||
struct sp_alloc_size<T[N]> {
 | 
			
		||||
    BOOST_STATIC_CONSTEXPR std::size_t value = N * sp_alloc_size<T>::value;
 | 
			
		||||
    static constexpr std::size_t value = N * sp_alloc_size<T>::value;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
@@ -58,8 +51,8 @@ struct sp_alloc_result<T[N]> {
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct sp_alloc_value {
 | 
			
		||||
    typedef typename boost::remove_cv<typename
 | 
			
		||||
        boost::remove_extent<T>::type>::type type;
 | 
			
		||||
    typedef typename std::remove_cv<typename
 | 
			
		||||
        std::remove_extent<T>::type>::type type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class P>
 | 
			
		||||
@@ -67,45 +60,41 @@ class sp_alloc_ptr {
 | 
			
		||||
public:
 | 
			
		||||
    typedef T element_type;
 | 
			
		||||
 | 
			
		||||
    sp_alloc_ptr() BOOST_SP_NOEXCEPT
 | 
			
		||||
    sp_alloc_ptr() noexcept
 | 
			
		||||
        : p_() { }
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC) && BOOST_MSVC == 1600
 | 
			
		||||
    sp_alloc_ptr(T* p) BOOST_SP_NOEXCEPT
 | 
			
		||||
        : p_(const_cast<typename boost::remove_cv<T>::type*>(p)) { }
 | 
			
		||||
    sp_alloc_ptr(T* p) noexcept
 | 
			
		||||
        : p_(const_cast<typename std::remove_cv<T>::type*>(p)) { }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    sp_alloc_ptr(std::size_t, P p) BOOST_SP_NOEXCEPT
 | 
			
		||||
    sp_alloc_ptr(std::size_t, P p) noexcept
 | 
			
		||||
        : p_(p) { }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_NULLPTR)
 | 
			
		||||
    sp_alloc_ptr(detail::sp_nullptr_t) BOOST_SP_NOEXCEPT
 | 
			
		||||
    sp_alloc_ptr(std::nullptr_t) noexcept
 | 
			
		||||
        : p_() { }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    T& operator*() const {
 | 
			
		||||
        return *p_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T* operator->() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
    T* operator->() const noexcept {
 | 
			
		||||
        return boost::to_address(p_);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
 | 
			
		||||
    explicit operator bool() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
    explicit operator bool() const noexcept {
 | 
			
		||||
        return !!p_;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    bool operator!() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
    bool operator!() const noexcept {
 | 
			
		||||
        return !p_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    P ptr() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
    P ptr() const noexcept {
 | 
			
		||||
        return p_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    BOOST_STATIC_CONSTEXPR std::size_t size() BOOST_SP_NOEXCEPT {
 | 
			
		||||
    static constexpr std::size_t size() noexcept {
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -113,7 +102,7 @@ public:
 | 
			
		||||
    static sp_alloc_ptr pointer_to(T& v) {
 | 
			
		||||
        return sp_alloc_ptr(1,
 | 
			
		||||
            std::pointer_traits<P>::pointer_to(const_cast<typename
 | 
			
		||||
                boost::remove_cv<T>::type&>(v)));
 | 
			
		||||
                std::remove_cv<T>::type&>(v)));
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -126,37 +115,33 @@ class sp_alloc_ptr<T[], P> {
 | 
			
		||||
public:
 | 
			
		||||
    typedef T element_type;
 | 
			
		||||
 | 
			
		||||
    sp_alloc_ptr() BOOST_SP_NOEXCEPT
 | 
			
		||||
    sp_alloc_ptr() noexcept
 | 
			
		||||
        : p_() { }
 | 
			
		||||
 | 
			
		||||
    sp_alloc_ptr(std::size_t n, P p) BOOST_SP_NOEXCEPT
 | 
			
		||||
    sp_alloc_ptr(std::size_t n, P p) noexcept
 | 
			
		||||
        : p_(p)
 | 
			
		||||
        , n_(n) { }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_NULLPTR)
 | 
			
		||||
    sp_alloc_ptr(detail::sp_nullptr_t) BOOST_SP_NOEXCEPT
 | 
			
		||||
    sp_alloc_ptr(std::nullptr_t) noexcept
 | 
			
		||||
        : p_() { }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    T& operator[](std::size_t i) const {
 | 
			
		||||
        return p_[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
 | 
			
		||||
    explicit operator bool() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
    explicit operator bool() const noexcept {
 | 
			
		||||
        return !!p_;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    bool operator!() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
    bool operator!() const noexcept {
 | 
			
		||||
        return !p_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    P ptr() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
    P ptr() const noexcept {
 | 
			
		||||
        return p_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::size_t size() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
    std::size_t size() const noexcept {
 | 
			
		||||
        return n_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -164,7 +149,7 @@ public:
 | 
			
		||||
    static sp_alloc_ptr pointer_to(T& v) {
 | 
			
		||||
        return sp_alloc_ptr(n_,
 | 
			
		||||
            std::pointer_traits<P>::pointer_to(const_cast<typename
 | 
			
		||||
                boost::remove_cv<T>::type&>(v)));
 | 
			
		||||
                std::remove_cv<T>::type&>(v)));
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -178,36 +163,32 @@ class sp_alloc_ptr<T[N], P> {
 | 
			
		||||
public:
 | 
			
		||||
    typedef T element_type;
 | 
			
		||||
 | 
			
		||||
    sp_alloc_ptr() BOOST_SP_NOEXCEPT
 | 
			
		||||
    sp_alloc_ptr() noexcept
 | 
			
		||||
        : p_() { }
 | 
			
		||||
 | 
			
		||||
    sp_alloc_ptr(std::size_t, P p) BOOST_SP_NOEXCEPT
 | 
			
		||||
    sp_alloc_ptr(std::size_t, P p) noexcept
 | 
			
		||||
        : p_(p) { }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_NULLPTR)
 | 
			
		||||
    sp_alloc_ptr(detail::sp_nullptr_t) BOOST_SP_NOEXCEPT
 | 
			
		||||
    sp_alloc_ptr(std::nullptr_t) noexcept
 | 
			
		||||
        : p_() { }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    T& operator[](std::size_t i) const {
 | 
			
		||||
        return p_[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
 | 
			
		||||
    explicit operator bool() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
    explicit operator bool() const noexcept {
 | 
			
		||||
        return !!p_;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    bool operator!() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
    bool operator!() const noexcept {
 | 
			
		||||
        return !p_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    P ptr() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
    P ptr() const noexcept {
 | 
			
		||||
        return p_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    BOOST_STATIC_CONSTEXPR std::size_t size() BOOST_SP_NOEXCEPT {
 | 
			
		||||
    static constexpr std::size_t size() noexcept {
 | 
			
		||||
        return N;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -215,7 +196,7 @@ public:
 | 
			
		||||
    static sp_alloc_ptr pointer_to(T& v) {
 | 
			
		||||
        return sp_alloc_ptr(N,
 | 
			
		||||
            std::pointer_traits<P>::pointer_to(const_cast<typename
 | 
			
		||||
                boost::remove_cv<T>::type&>(v)));
 | 
			
		||||
                std::remove_cv<T>::type&>(v)));
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -237,19 +218,18 @@ operator!=(const sp_alloc_ptr<T, P>& lhs, const sp_alloc_ptr<T, P>& rhs)
 | 
			
		||||
    return !(lhs == rhs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_NULLPTR)
 | 
			
		||||
template<class T, class P>
 | 
			
		||||
inline bool
 | 
			
		||||
operator==(const sp_alloc_ptr<T, P>& lhs,
 | 
			
		||||
    detail::sp_nullptr_t) BOOST_SP_NOEXCEPT
 | 
			
		||||
    std::nullptr_t) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return !lhs.ptr();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class P>
 | 
			
		||||
inline bool
 | 
			
		||||
operator==(detail::sp_nullptr_t,
 | 
			
		||||
    const sp_alloc_ptr<T, P>& rhs) BOOST_SP_NOEXCEPT
 | 
			
		||||
operator==(std::nullptr_t,
 | 
			
		||||
    const sp_alloc_ptr<T, P>& rhs) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return !rhs.ptr();
 | 
			
		||||
}
 | 
			
		||||
@@ -257,24 +237,23 @@ operator==(detail::sp_nullptr_t,
 | 
			
		||||
template<class T, class P>
 | 
			
		||||
inline bool
 | 
			
		||||
operator!=(const sp_alloc_ptr<T, P>& lhs,
 | 
			
		||||
    detail::sp_nullptr_t) BOOST_SP_NOEXCEPT
 | 
			
		||||
    std::nullptr_t) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return !!lhs.ptr();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class P>
 | 
			
		||||
inline bool
 | 
			
		||||
operator!=(detail::sp_nullptr_t,
 | 
			
		||||
    const sp_alloc_ptr<T, P>& rhs) BOOST_SP_NOEXCEPT
 | 
			
		||||
operator!=(std::nullptr_t,
 | 
			
		||||
    const sp_alloc_ptr<T, P>& rhs) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return !!rhs.ptr();
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class A>
 | 
			
		||||
inline void
 | 
			
		||||
sp_alloc_clear(A& a, typename boost::allocator_pointer<A>::type p, std::size_t,
 | 
			
		||||
    boost::false_type)
 | 
			
		||||
    std::false_type)
 | 
			
		||||
{
 | 
			
		||||
    boost::alloc_destroy(a, boost::to_address(p));
 | 
			
		||||
}
 | 
			
		||||
@@ -282,7 +261,7 @@ sp_alloc_clear(A& a, typename boost::allocator_pointer<A>::type p, std::size_t,
 | 
			
		||||
template<class A>
 | 
			
		||||
inline void
 | 
			
		||||
sp_alloc_clear(A& a, typename boost::allocator_pointer<A>::type p,
 | 
			
		||||
    std::size_t n, boost::true_type)
 | 
			
		||||
    std::size_t n, std::true_type)
 | 
			
		||||
{
 | 
			
		||||
#if defined(BOOST_MSVC) && BOOST_MSVC < 1800
 | 
			
		||||
    if (!p) {
 | 
			
		||||
@@ -307,19 +286,17 @@ public:
 | 
			
		||||
    typedef detail::sp_alloc_ptr<T,
 | 
			
		||||
        typename allocator_pointer<allocator>::type> pointer;
 | 
			
		||||
 | 
			
		||||
    explicit alloc_deleter(const allocator& a) BOOST_SP_NOEXCEPT
 | 
			
		||||
    explicit alloc_deleter(const allocator& a) noexcept
 | 
			
		||||
        : base(empty_init_t(), a) { }
 | 
			
		||||
 | 
			
		||||
    void operator()(pointer p) {
 | 
			
		||||
        detail::sp_alloc_clear(base::get(), p.ptr(), p.size(), is_array<T>());
 | 
			
		||||
        detail::sp_alloc_clear(base::get(), p.ptr(), p.size(), std::is_array<T>());
 | 
			
		||||
        base::get().deallocate(p.ptr(), p.size());
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
using alloc_noinit_deleter = alloc_deleter<T, noinit_adaptor<A> >;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace detail {
 | 
			
		||||
 | 
			
		||||
@@ -346,15 +323,15 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    typename allocator::value_type* get() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
    typename allocator::value_type* get() const noexcept {
 | 
			
		||||
        return boost::to_address(p_);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    allocator& state() BOOST_SP_NOEXCEPT {
 | 
			
		||||
    allocator& state() noexcept {
 | 
			
		||||
        return a_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    type release() BOOST_SP_NOEXCEPT {
 | 
			
		||||
    type release() noexcept {
 | 
			
		||||
        pointer p = p_;
 | 
			
		||||
        p_ = pointer();
 | 
			
		||||
        return type(typename deleter::pointer(n_, p), deleter(a_));
 | 
			
		||||
@@ -371,7 +348,7 @@ private:
 | 
			
		||||
} /* detail */
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<!is_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<!std::is_array<T>::value,
 | 
			
		||||
    std::unique_ptr<T, alloc_deleter<T, A> > >::type
 | 
			
		||||
allocate_unique(const A& alloc)
 | 
			
		||||
{
 | 
			
		||||
@@ -380,9 +357,8 @@ allocate_unique(const A& alloc)
 | 
			
		||||
    return c.release();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 | 
			
		||||
template<class T, class A, class... Args>
 | 
			
		||||
inline typename enable_if_<!is_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<!std::is_array<T>::value,
 | 
			
		||||
    std::unique_ptr<T, alloc_deleter<T, A> > >::type
 | 
			
		||||
allocate_unique(const A& alloc, Args&&... args)
 | 
			
		||||
{
 | 
			
		||||
@@ -390,12 +366,11 @@ allocate_unique(const A& alloc, Args&&... args)
 | 
			
		||||
    boost::alloc_construct(c.state(), c.get(), std::forward<Args>(args)...);
 | 
			
		||||
    return c.release();
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<!is_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<!std::is_array<T>::value,
 | 
			
		||||
    std::unique_ptr<T, alloc_deleter<T, A> > >::type
 | 
			
		||||
allocate_unique(const A& alloc, typename type_identity<T>::type&& value)
 | 
			
		||||
allocate_unique(const A& alloc, typename detail::sp_type_identity<T>::type&& value)
 | 
			
		||||
{
 | 
			
		||||
    detail::sp_alloc_make<T, A> c(alloc, 1);
 | 
			
		||||
    boost::alloc_construct(c.state(), c.get(), std::move(value));
 | 
			
		||||
@@ -403,7 +378,7 @@ allocate_unique(const A& alloc, typename type_identity<T>::type&& value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<!is_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<!std::is_array<T>::value,
 | 
			
		||||
    std::unique_ptr<T, alloc_deleter<T, noinit_adaptor<A> > > >::type
 | 
			
		||||
allocate_unique_noinit(const A& alloc)
 | 
			
		||||
{
 | 
			
		||||
@@ -411,7 +386,7 @@ allocate_unique_noinit(const A& alloc)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_unbounded_array<T>::value,
 | 
			
		||||
    std::unique_ptr<T, alloc_deleter<T, A> > >::type
 | 
			
		||||
allocate_unique(const A& alloc, std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
@@ -422,19 +397,19 @@ allocate_unique(const A& alloc, std::size_t size)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_bounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_bounded_array<T>::value,
 | 
			
		||||
    std::unique_ptr<typename detail::sp_alloc_result<T>::type,
 | 
			
		||||
        alloc_deleter<T, A> > >::type
 | 
			
		||||
allocate_unique(const A& alloc)
 | 
			
		||||
{
 | 
			
		||||
    detail::sp_alloc_make<T, A> c(alloc, extent<T>::value);
 | 
			
		||||
    detail::sp_alloc_make<T, A> c(alloc, std::extent<T>::value);
 | 
			
		||||
    boost::alloc_construct_n(c.state(), boost::first_scalar(c.get()),
 | 
			
		||||
        detail::sp_alloc_size<T>::value);
 | 
			
		||||
    return c.release();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_unbounded_array<T>::value,
 | 
			
		||||
    std::unique_ptr<T, alloc_deleter<T, noinit_adaptor<A> > > >::type
 | 
			
		||||
allocate_unique_noinit(const A& alloc, std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
@@ -442,7 +417,7 @@ allocate_unique_noinit(const A& alloc, std::size_t size)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_bounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_bounded_array<T>::value,
 | 
			
		||||
    std::unique_ptr<typename detail::sp_alloc_result<T>::type,
 | 
			
		||||
        alloc_deleter<T, noinit_adaptor<A> > > >::type
 | 
			
		||||
allocate_unique_noinit(const A& alloc)
 | 
			
		||||
@@ -451,32 +426,41 @@ allocate_unique_noinit(const A& alloc)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_unbounded_array<T>::value,
 | 
			
		||||
    std::unique_ptr<T, alloc_deleter<T, A> > >::type
 | 
			
		||||
allocate_unique(const A& alloc, std::size_t size,
 | 
			
		||||
    const typename remove_extent<T>::type& value)
 | 
			
		||||
    const typename std::remove_extent<T>::type& value)
 | 
			
		||||
{
 | 
			
		||||
    detail::sp_alloc_make<T, A> c(alloc, size);
 | 
			
		||||
    boost::alloc_construct_n(c.state(), boost::first_scalar(c.get()),
 | 
			
		||||
        size * detail::sp_alloc_size<T>::value, boost::first_scalar(&value),
 | 
			
		||||
        detail::sp_alloc_size<typename remove_extent<T>::type>::value);
 | 
			
		||||
        detail::sp_alloc_size<typename std::remove_extent<T>::type>::value);
 | 
			
		||||
    return c.release();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_bounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_bounded_array<T>::value,
 | 
			
		||||
    std::unique_ptr<typename detail::sp_alloc_result<T>::type,
 | 
			
		||||
        alloc_deleter<T, A> > >::type
 | 
			
		||||
allocate_unique(const A& alloc,
 | 
			
		||||
    const typename remove_extent<T>::type& value)
 | 
			
		||||
    const typename std::remove_extent<T>::type& value)
 | 
			
		||||
{
 | 
			
		||||
    detail::sp_alloc_make<T, A> c(alloc, extent<T>::value);
 | 
			
		||||
    detail::sp_alloc_make<T, A> c(alloc, std::extent<T>::value);
 | 
			
		||||
    boost::alloc_construct_n(c.state(), boost::first_scalar(c.get()),
 | 
			
		||||
        detail::sp_alloc_size<T>::value, boost::first_scalar(&value),
 | 
			
		||||
        detail::sp_alloc_size<typename remove_extent<T>::type>::value);
 | 
			
		||||
        detail::sp_alloc_size<typename std::remove_extent<T>::type>::value);
 | 
			
		||||
    return c.release();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U, class A>
 | 
			
		||||
inline typename allocator_pointer<typename allocator_rebind<A,
 | 
			
		||||
    typename detail::sp_alloc_value<T>::type>::type>::type
 | 
			
		||||
get_allocator_pointer(const std::unique_ptr<T,
 | 
			
		||||
    alloc_deleter<U, A> >& p) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get().ptr();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} /* boost */
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -33,7 +33,7 @@ private:
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    bool compare_exchange( shared_ptr<T>& v, shared_ptr<T> w ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool compare_exchange( shared_ptr<T>& v, shared_ptr<T> w ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        l_.lock();
 | 
			
		||||
 | 
			
		||||
@@ -57,39 +57,16 @@ private:
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX ) && !defined( BOOST_NO_CXX11_CONSTEXPR )
 | 
			
		||||
 | 
			
		||||
    constexpr atomic_shared_ptr() BOOST_SP_NOEXCEPT: l_ BOOST_DETAIL_SPINLOCK_INIT
 | 
			
		||||
    constexpr atomic_shared_ptr() noexcept: l_ BOOST_DETAIL_SPINLOCK_INIT
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    atomic_shared_ptr( shared_ptr<T> p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    atomic_shared_ptr( shared_ptr<T> p ) noexcept
 | 
			
		||||
        : p_( std::move( p ) ), l_ BOOST_DETAIL_SPINLOCK_INIT
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    atomic_shared_ptr() BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::spinlock init = BOOST_DETAIL_SPINLOCK_INIT;
 | 
			
		||||
        std::memcpy( &l_, &init, sizeof( init ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    atomic_shared_ptr( shared_ptr<T> p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
        : p_( std::move( p ) )
 | 
			
		||||
#else
 | 
			
		||||
        : p_( p )
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::spinlock init = BOOST_DETAIL_SPINLOCK_INIT;
 | 
			
		||||
        std::memcpy( &l_, &init, sizeof( init ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    atomic_shared_ptr& operator=( shared_ptr<T> r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    atomic_shared_ptr& operator=( shared_ptr<T> r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::spinlock::scoped_lock lock( l_ );
 | 
			
		||||
        p_.swap( r );
 | 
			
		||||
@@ -97,140 +74,120 @@ public:
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR bool is_lock_free() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    constexpr bool is_lock_free() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    shared_ptr<T> load() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    shared_ptr<T> load() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::spinlock::scoped_lock lock( l_ );
 | 
			
		||||
        return p_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class M> shared_ptr<T> load( M ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class M> shared_ptr<T> load( M ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::spinlock::scoped_lock lock( l_ );
 | 
			
		||||
        return p_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator shared_ptr<T>() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    operator shared_ptr<T>() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::spinlock::scoped_lock lock( l_ );
 | 
			
		||||
        return p_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void store( shared_ptr<T> r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void store( shared_ptr<T> r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::spinlock::scoped_lock lock( l_ );
 | 
			
		||||
        p_.swap( r );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class M> void store( shared_ptr<T> r, M ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class M> void store( shared_ptr<T> r, M ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::spinlock::scoped_lock lock( l_ );
 | 
			
		||||
        p_.swap( r );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    shared_ptr<T> exchange( shared_ptr<T> r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    shared_ptr<T> exchange( shared_ptr<T> r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        {
 | 
			
		||||
            boost::detail::spinlock::scoped_lock lock( l_ );
 | 
			
		||||
            p_.swap( r );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
        return std::move( r );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        return r;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class M> shared_ptr<T> exchange( shared_ptr<T> r, M ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class M> shared_ptr<T> exchange( shared_ptr<T> r, M ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        {
 | 
			
		||||
            boost::detail::spinlock::scoped_lock lock( l_ );
 | 
			
		||||
            p_.swap( r );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
        return std::move( r );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        return r;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class M> bool compare_exchange_weak( shared_ptr<T>& v, const shared_ptr<T>& w, M, M ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class M> bool compare_exchange_weak( shared_ptr<T>& v, const shared_ptr<T>& w, M, M ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return compare_exchange( v, w );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class M> bool compare_exchange_weak( shared_ptr<T>& v, const shared_ptr<T>& w, M ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class M> bool compare_exchange_weak( shared_ptr<T>& v, const shared_ptr<T>& w, M ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return compare_exchange( v, w );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool compare_exchange_weak( shared_ptr<T>& v, const shared_ptr<T>& w ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool compare_exchange_weak( shared_ptr<T>& v, const shared_ptr<T>& w ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return compare_exchange( v, w );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class M> bool compare_exchange_strong( shared_ptr<T>& v, const shared_ptr<T>& w, M, M ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class M> bool compare_exchange_strong( shared_ptr<T>& v, const shared_ptr<T>& w, M, M ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return compare_exchange( v, w );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class M> bool compare_exchange_strong( shared_ptr<T>& v, const shared_ptr<T>& w, M ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class M> bool compare_exchange_strong( shared_ptr<T>& v, const shared_ptr<T>& w, M ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return compare_exchange( v, w );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool compare_exchange_strong( shared_ptr<T>& v, const shared_ptr<T>& w ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool compare_exchange_strong( shared_ptr<T>& v, const shared_ptr<T>& w ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return compare_exchange( v, w );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    template<class M> bool compare_exchange_weak( shared_ptr<T>& v, shared_ptr<T>&& w, M, M ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class M> bool compare_exchange_weak( shared_ptr<T>& v, shared_ptr<T>&& w, M, M ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return compare_exchange( v, std::move( w ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class M> bool compare_exchange_weak( shared_ptr<T>& v, shared_ptr<T>&& w, M ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class M> bool compare_exchange_weak( shared_ptr<T>& v, shared_ptr<T>&& w, M ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return compare_exchange( v, std::move( w ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool compare_exchange_weak( shared_ptr<T>& v, shared_ptr<T>&& w ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool compare_exchange_weak( shared_ptr<T>& v, shared_ptr<T>&& w ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return compare_exchange( v, std::move( w ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class M> bool compare_exchange_strong( shared_ptr<T>& v, shared_ptr<T>&& w, M, M ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class M> bool compare_exchange_strong( shared_ptr<T>& v, shared_ptr<T>&& w, M, M ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return compare_exchange( v, std::move( w ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class M> bool compare_exchange_strong( shared_ptr<T>& v, shared_ptr<T>&& w, M ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class M> bool compare_exchange_strong( shared_ptr<T>& v, shared_ptr<T>&& w, M ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return compare_exchange( v, std::move( w ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool compare_exchange_strong( shared_ptr<T>& v, shared_ptr<T>&& w ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool compare_exchange_strong( shared_ptr<T>& v, shared_ptr<T>&& w ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return compare_exchange( v, std::move( w ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 
 | 
			
		||||
@@ -20,23 +20,9 @@
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <exception>
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_BORLANDC
 | 
			
		||||
# pragma warn -8026     // Functions with excep. spec. are not expanded inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
// The standard library that comes with Borland C++ 5.5.1, 5.6.4
 | 
			
		||||
// defines std::exception and its members as having C calling
 | 
			
		||||
// convention (-pc). When the definition of bad_weak_ptr
 | 
			
		||||
// is compiled with -ps, the compiler issues an error.
 | 
			
		||||
// Hence, the temporary #pragma option -pc below.
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_BORLANDC) && BOOST_BORLANDC <= 0x564
 | 
			
		||||
# pragma option push -pc
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_CLANG)
 | 
			
		||||
// Intel C++ on Mac defines __clang__ but doesn't support the pragma
 | 
			
		||||
# pragma clang diagnostic push
 | 
			
		||||
@@ -47,7 +33,7 @@ class bad_weak_ptr: public std::exception
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    char const * what() const BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE
 | 
			
		||||
    char const * what() const noexcept override
 | 
			
		||||
    {
 | 
			
		||||
        return "tr1::bad_weak_ptr";
 | 
			
		||||
    }
 | 
			
		||||
@@ -57,14 +43,6 @@ public:
 | 
			
		||||
# pragma clang diagnostic pop
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_BORLANDC) && BOOST_BORLANDC <= 0x564
 | 
			
		||||
# pragma option pop
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_BORLANDC
 | 
			
		||||
# pragma warn .8026     // Functions with excep. spec. are not expanded inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_BAD_WEAK_PTR_HPP_INCLUDED
 | 
			
		||||
 
 | 
			
		||||
@@ -43,8 +43,10 @@
 | 
			
		||||
//    Memory Ordering: acquire/release
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_has_sync_intrinsics.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/deprecated_macros.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_has_sync.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_AC_DISABLE_THREADS )
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_nt.hpp>
 | 
			
		||||
@@ -73,15 +75,18 @@
 | 
			
		||||
#elif defined( BOOST_DISABLE_THREADS ) && !defined( BOOST_SP_ENABLE_THREADS ) && !defined( BOOST_DISABLE_WIN32 )
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_nt.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_HAS_GCC_INTRINSICS )
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_gcc_atomic.hpp>
 | 
			
		||||
 | 
			
		||||
#elif !defined( BOOST_NO_CXX11_HDR_ATOMIC )
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_std_atomic.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_HAS_SYNC_INTRINSICS )
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_sync.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) ) && !defined( __PATHSCALE__ )
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_gcc_x86.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_HAS_SYNC )
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_sync.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_win32.hpp>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										63
									
								
								include/boost/smart_ptr/detail/atomic_count_gcc_atomic.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								include/boost/smart_ptr/detail/atomic_count_gcc_atomic.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_ATOMIC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_ATOMIC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// boost/detail/atomic_count_gcc_atomic.hpp
 | 
			
		||||
//
 | 
			
		||||
// atomic_count for g++ 4.7+
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2007, 2020 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/cstdint.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using __atomic atomic_count")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class atomic_count
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count( long v ): value_( static_cast< boost::int_least32_t >( v ) )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator++()
 | 
			
		||||
    {
 | 
			
		||||
        return __atomic_add_fetch( &value_, +1, __ATOMIC_ACQ_REL );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator--()
 | 
			
		||||
    {
 | 
			
		||||
        return __atomic_add_fetch( &value_, -1, __ATOMIC_ACQ_REL );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator long() const
 | 
			
		||||
    {
 | 
			
		||||
        return __atomic_load_n( &value_, __ATOMIC_ACQUIRE );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    atomic_count(atomic_count const &);
 | 
			
		||||
    atomic_count & operator=(atomic_count const &);
 | 
			
		||||
 | 
			
		||||
    boost::int_least32_t value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_ATOMIC_HPP_INCLUDED
 | 
			
		||||
@@ -13,6 +13,8 @@
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_obsolete.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
@@ -20,6 +22,8 @@ BOOST_PRAGMA_MESSAGE("Using g++/x86 atomic_count")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,66 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SOLARIS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SOLARIS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count_solaris.hpp
 | 
			
		||||
//   based on: boost/detail/atomic_count_win32.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001-2005 Peter Dimov
 | 
			
		||||
//  Copyright (c) 2006 Michael van der Westhuizen
 | 
			
		||||
//
 | 
			
		||||
// 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 <atomic.h>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using Solaris atomic_count")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class atomic_count
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count( uint32_t v ): value_( v )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator++()
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_inc_32_nv( &value_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator--()
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_dec_32_nv( &value_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator uint32_t() const
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<uint32_t const volatile &>( value_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    atomic_count( atomic_count const & );
 | 
			
		||||
    atomic_count & operator=( atomic_count const & );
 | 
			
		||||
 | 
			
		||||
    uint32_t value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SOLARIS_HPP_INCLUDED
 | 
			
		||||
@@ -15,6 +15,8 @@
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/cstdint.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined( __ia64__ ) && defined( __INTEL_COMPILER )
 | 
			
		||||
# include <ia64intrin.h>
 | 
			
		||||
#endif
 | 
			
		||||
@@ -36,7 +38,9 @@ class atomic_count
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count( long v ) : value_( v ) {}
 | 
			
		||||
    explicit atomic_count( long v ): value_( static_cast< boost::int_least32_t >( v ) )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator++()
 | 
			
		||||
    {
 | 
			
		||||
@@ -58,7 +62,7 @@ private:
 | 
			
		||||
    atomic_count(atomic_count const &);
 | 
			
		||||
    atomic_count & operator=(atomic_count const &);
 | 
			
		||||
 | 
			
		||||
    mutable long value_;
 | 
			
		||||
    mutable boost::int_least32_t value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										52
									
								
								include/boost/smart_ptr/detail/deprecated_macros.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								include/boost/smart_ptr/detail/deprecated_macros.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_DEPRECATED_MACROS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_DEPRECATED_MACROS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// Copyright 2024 Peter Dimov
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("The macro BOOST_SP_ENABLE_DEBUG_HOOKS has been deprecated in 1.87 and support for it will be removed.")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_STD_ALLOCATOR)
 | 
			
		||||
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("The macro BOOST_SP_USE_STD_ALLOCATOR has been deprecated in 1.87 and support for it will be removed.")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_QUICK_ALLOCATOR)
 | 
			
		||||
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("The macro BOOST_SP_USE_QUICK_ALLOCATOR has been deprecated in 1.87 and support for it will be removed.")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_AC_USE_SPINLOCK)
 | 
			
		||||
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("The macro BOOST_AC_USE_SPINLOCK has been deprecated in 1.87 and support for it will be removed.")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_AC_USE_PTHREADS)
 | 
			
		||||
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("The macro BOOST_AC_USE_PTHREADS has been deprecated in 1.87 and support for it will be removed.")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_SPINLOCK)
 | 
			
		||||
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("The macro BOOST_SP_USE_SPINLOCK has been deprecated in 1.87 and support for it will be removed.")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_PTHREADS)
 | 
			
		||||
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("The macro BOOST_SP_USE_PTHREADS has been deprecated in 1.87 and support for it will be removed.")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_DEPRECATED_MACROS_HPP_INCLUDED
 | 
			
		||||
@@ -104,18 +104,10 @@ public:
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_HAS_PTHREADS )
 | 
			
		||||
 | 
			
		||||
extern "C" void * lw_thread_routine( void * pv )
 | 
			
		||||
extern "C" inline void * lw_thread_routine( void * pv )
 | 
			
		||||
{
 | 
			
		||||
#if defined(BOOST_NO_CXX11_SMART_PTR)
 | 
			
		||||
 | 
			
		||||
    std::auto_ptr<lw_abstract_thread> pt( static_cast<lw_abstract_thread *>( pv ) );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    std::unique_ptr<lw_abstract_thread> pt( static_cast<lw_abstract_thread *>( pv ) );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    pt->run();
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
@@ -123,18 +115,10 @@ extern "C" void * lw_thread_routine( void * pv )
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
unsigned __stdcall lw_thread_routine( void * pv )
 | 
			
		||||
inline unsigned __stdcall lw_thread_routine( void * pv )
 | 
			
		||||
{
 | 
			
		||||
#if defined(BOOST_NO_CXX11_SMART_PTR)
 | 
			
		||||
 | 
			
		||||
    std::auto_ptr<lw_abstract_thread> pt( static_cast<lw_abstract_thread *>( pv ) );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    std::unique_ptr<lw_abstract_thread> pt( static_cast<lw_abstract_thread *>( pv ) );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    pt->run();
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
@@ -162,16 +146,8 @@ private:
 | 
			
		||||
 | 
			
		||||
template<class F> int lw_thread_create( lw_thread_t & th, F f )
 | 
			
		||||
{
 | 
			
		||||
#if defined(BOOST_NO_CXX11_SMART_PTR)
 | 
			
		||||
 | 
			
		||||
    std::auto_ptr<lw_abstract_thread> p( new lw_thread_impl<F>( f ) );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    std::unique_ptr<lw_abstract_thread> p( new lw_thread_impl<F>( f ) );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    int r = lw_thread_create_( &th, 0, lw_thread_routine, p.get() );
 | 
			
		||||
 | 
			
		||||
    if( r == 0 )
 | 
			
		||||
 
 | 
			
		||||
@@ -42,23 +42,23 @@ private:
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR local_counted_base() BOOST_SP_NOEXCEPT: local_use_count_( initial_ )
 | 
			
		||||
    constexpr local_counted_base() noexcept: local_use_count_( initial_ )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR local_counted_base( local_counted_base const & ) BOOST_SP_NOEXCEPT: local_use_count_( initial_ )
 | 
			
		||||
    constexpr local_counted_base( local_counted_base const & ) noexcept: local_use_count_( initial_ )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~local_counted_base() /*BOOST_SP_NOEXCEPT*/
 | 
			
		||||
    virtual ~local_counted_base() /*noexcept*/
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void local_cb_destroy() BOOST_SP_NOEXCEPT = 0;
 | 
			
		||||
    virtual void local_cb_destroy() noexcept = 0;
 | 
			
		||||
 | 
			
		||||
    virtual boost::detail::shared_count local_cb_get_shared_count() const BOOST_SP_NOEXCEPT = 0;
 | 
			
		||||
    virtual boost::detail::shared_count local_cb_get_shared_count() const noexcept = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void add_ref() noexcept
 | 
			
		||||
    {
 | 
			
		||||
#if !defined(__NVCC__)
 | 
			
		||||
#if defined( __has_builtin )
 | 
			
		||||
@@ -73,7 +73,7 @@ public:
 | 
			
		||||
        local_use_count_ = static_cast<count_type>( local_use_count_ + 1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void release() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        local_use_count_ = static_cast<count_type>( local_use_count_ - 1 );
 | 
			
		||||
 | 
			
		||||
@@ -83,7 +83,7 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long local_use_count() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    long local_use_count() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return local_use_count_;
 | 
			
		||||
    }
 | 
			
		||||
@@ -101,24 +101,20 @@ private:
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit local_counted_impl( shared_count const& pn ) BOOST_SP_NOEXCEPT: pn_( pn )
 | 
			
		||||
    explicit local_counted_impl( shared_count const& pn ) noexcept: pn_( pn )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    explicit local_counted_impl( shared_count && pn ) BOOST_SP_NOEXCEPT: pn_( std::move(pn) )
 | 
			
		||||
    explicit local_counted_impl( shared_count && pn ) noexcept: pn_( std::move(pn) )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    void local_cb_destroy() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    void local_cb_destroy() noexcept override
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    boost::detail::shared_count local_cb_get_shared_count() const BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    boost::detail::shared_count local_cb_get_shared_count() const noexcept override
 | 
			
		||||
    {
 | 
			
		||||
        return pn_;
 | 
			
		||||
    }
 | 
			
		||||
@@ -130,12 +126,12 @@ public:
 | 
			
		||||
 | 
			
		||||
    shared_count pn_;
 | 
			
		||||
 | 
			
		||||
    void local_cb_destroy() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    void local_cb_destroy() noexcept override
 | 
			
		||||
    {
 | 
			
		||||
        shared_count().swap( pn_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    boost::detail::shared_count local_cb_get_shared_count() const BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    boost::detail::shared_count local_cb_get_shared_count() const noexcept override
 | 
			
		||||
    {
 | 
			
		||||
        return pn_;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -38,48 +38,40 @@ public:
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    explicit local_sp_deleter( D const& d ) BOOST_SP_NOEXCEPT: d_( d )
 | 
			
		||||
    explicit local_sp_deleter( D const& d ) noexcept: d_( d )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    explicit local_sp_deleter( D&& d ) BOOST_SP_NOEXCEPT: d_( std::move(d) )
 | 
			
		||||
    explicit local_sp_deleter( D&& d ) noexcept: d_( std::move(d) )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    D& deleter() BOOST_SP_NOEXCEPT
 | 
			
		||||
    D& deleter() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return d_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> void operator()( Y* p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class Y> void operator()( Y* p ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        d_( p );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
    void operator()( boost::detail::sp_nullptr_t p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void operator()( std::nullptr_t p ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        d_( p );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<> class local_sp_deleter<void>
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class D> D * get_local_deleter( local_sp_deleter<D> * p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class D> D * get_local_deleter( local_sp_deleter<D> * p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return &p->deleter();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void * get_local_deleter( local_sp_deleter<void> * /*p*/ ) BOOST_SP_NOEXCEPT
 | 
			
		||||
inline void * get_local_deleter( local_sp_deleter<void> * /*p*/ ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,64 +0,0 @@
 | 
			
		||||
//  This header intentionally has no include guards.
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001-2009, 2012 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
 | 
			
		||||
 | 
			
		||||
#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_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#elif ( defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, < 0x570) ) || defined(__CINT__)
 | 
			
		||||
 | 
			
		||||
    operator bool () const BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#elif defined( _MANAGED )
 | 
			
		||||
 | 
			
		||||
    static void unspecified_bool( this_type*** )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    typedef void (*unspecified_bool_type)( this_type*** );
 | 
			
		||||
 | 
			
		||||
    operator unspecified_bool_type() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px == 0? 0: unspecified_bool;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#elif \
 | 
			
		||||
    ( defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, < 0x3200) ) || \
 | 
			
		||||
    ( defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ < 304) ) || \
 | 
			
		||||
    ( defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x590) )
 | 
			
		||||
 | 
			
		||||
    typedef element_type * (this_type::*unspecified_bool_type)() const;
 | 
			
		||||
 | 
			
		||||
    operator unspecified_bool_type() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px == 0? 0: &this_type::get;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    typedef element_type * this_type::*unspecified_bool_type;
 | 
			
		||||
 | 
			
		||||
    operator unspecified_bool_type() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px == 0? 0: &this_type::px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // operator! is redundant, but some compilers need it
 | 
			
		||||
    bool operator! () const BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px == 0;
 | 
			
		||||
    }
 | 
			
		||||
@@ -21,21 +21,20 @@
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/lightweight_mutex.hpp>
 | 
			
		||||
#include <boost/type_traits/type_with_alignment.hpp>
 | 
			
		||||
#include <boost/type_traits/alignment_of.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_type_traits.hpp>
 | 
			
		||||
 | 
			
		||||
#include <type_traits>
 | 
			
		||||
#include <new>              // ::operator new, ::operator delete
 | 
			
		||||
#include <cstddef>          // std::size_t
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<unsigned size, unsigned align_> union freeblock
 | 
			
		||||
{
 | 
			
		||||
    typedef typename boost::type_with_alignment<align_>::type aligner_type;
 | 
			
		||||
    typedef typename sp_type_with_alignment<align_>::type aligner_type;
 | 
			
		||||
    aligner_type aligner;
 | 
			
		||||
    char bytes[size];
 | 
			
		||||
    freeblock * next;
 | 
			
		||||
@@ -74,7 +73,7 @@ template<unsigned size, unsigned align_> struct allocator_impl
 | 
			
		||||
 | 
			
		||||
    static lightweight_mutex & mutex()
 | 
			
		||||
    {
 | 
			
		||||
        static freeblock< sizeof( lightweight_mutex ), boost::alignment_of< lightweight_mutex >::value > fbm;
 | 
			
		||||
        static freeblock< sizeof( lightweight_mutex ), std::alignment_of< lightweight_mutex >::value > fbm;
 | 
			
		||||
        static lightweight_mutex * pm = new( &fbm ) lightweight_mutex;
 | 
			
		||||
        return *pm;
 | 
			
		||||
    }
 | 
			
		||||
@@ -188,7 +187,7 @@ template<unsigned size, unsigned align_>
 | 
			
		||||
  unsigned allocator_impl<size, align_>::last = allocator_impl<size, align_>::items_per_page;
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct quick_allocator: public allocator_impl< sizeof(T), boost::alignment_of<T>::value >
 | 
			
		||||
struct quick_allocator: public allocator_impl< sizeof(T), std::alignment_of<T>::value >
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -18,16 +18,12 @@
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#if defined(__BORLANDC__) && !defined(__clang__)
 | 
			
		||||
# pragma warn -8027     // Functions containing try are not expanded inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/bad_weak_ptr.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_disable_deprecated.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <boost/checked_delete.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/deprecated_macros.hpp>
 | 
			
		||||
#include <boost/core/checked_delete.hpp>
 | 
			
		||||
#include <boost/throw_exception.hpp>
 | 
			
		||||
#include <boost/core/addressof.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
@@ -100,7 +96,7 @@ template< class D > struct sp_convert_reference< D& >
 | 
			
		||||
    typedef sp_reference_wrapper< D > type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T> std::size_t sp_hash_pointer( T* p ) BOOST_NOEXCEPT
 | 
			
		||||
template<class T> std::size_t sp_hash_pointer( T* p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    boost::uintptr_t v = reinterpret_cast<boost::uintptr_t>( p );
 | 
			
		||||
 | 
			
		||||
@@ -124,14 +120,14 @@ private:
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR shared_count() BOOST_SP_NOEXCEPT: pi_(0)
 | 
			
		||||
    constexpr shared_count() noexcept: pi_(0)
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR explicit shared_count( sp_counted_base * pi ) BOOST_SP_NOEXCEPT: pi_( pi )
 | 
			
		||||
    constexpr explicit shared_count( sp_counted_base * pi ) noexcept: pi_( pi )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
@@ -168,18 +164,11 @@ public:
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1200 )
 | 
			
		||||
    template<class Y, class D> shared_count( Y * p, D d ): pi_(0)
 | 
			
		||||
#else
 | 
			
		||||
    template<class P, class D> shared_count( P p, D d ): pi_(0)
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1200 )
 | 
			
		||||
        typedef Y* P;
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
@@ -205,8 +194,6 @@ public:
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
			
		||||
 | 
			
		||||
    template< class P, class D > shared_count( P p, sp_inplace_tag<D> ): pi_( 0 )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
@@ -237,8 +224,6 @@ public:
 | 
			
		||||
#endif // #ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
			
		||||
 | 
			
		||||
    template<class P, class D, class A> shared_count( P p, D d, A a ): pi_( 0 )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
@@ -246,16 +231,8 @@ public:
 | 
			
		||||
    {
 | 
			
		||||
        typedef sp_counted_impl_pda<P, D, A> impl_type;
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
 | 
			
		||||
 | 
			
		||||
        typedef typename std::allocator_traits<A>::template rebind_alloc< impl_type > A2;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        typedef typename A::template rebind< impl_type >::other A2;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        A2 a2( a );
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
@@ -294,8 +271,6 @@ public:
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
			
		||||
 | 
			
		||||
    template< class P, class D, class A > shared_count( P p, sp_inplace_tag< D >, A a ): pi_( 0 )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
@@ -303,16 +278,8 @@ public:
 | 
			
		||||
    {
 | 
			
		||||
        typedef sp_counted_impl_pda< P, D, A > impl_type;
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
 | 
			
		||||
 | 
			
		||||
        typedef typename std::allocator_traits<A>::template rebind_alloc< impl_type > A2;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        typedef typename A::template rebind< impl_type >::other A2;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        A2 a2( a );
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
@@ -351,8 +318,6 @@ public:
 | 
			
		||||
#endif // #ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_AUTO_PTR
 | 
			
		||||
 | 
			
		||||
    // auto_ptr<Y> is special cased to provide the strong guarantee
 | 
			
		||||
@@ -377,8 +342,6 @@ public:
 | 
			
		||||
 | 
			
		||||
#endif 
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_SMART_PTR )
 | 
			
		||||
 | 
			
		||||
    template<class Y, class D>
 | 
			
		||||
    explicit shared_count( std::unique_ptr<Y, D> & r ): pi_( 0 )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
@@ -387,7 +350,7 @@ public:
 | 
			
		||||
    {
 | 
			
		||||
        typedef typename sp_convert_reference<D>::type D2;
 | 
			
		||||
 | 
			
		||||
        D2 d2( r.get_deleter() );
 | 
			
		||||
        D2 d2( static_cast<D&&>( r.get_deleter() ) );
 | 
			
		||||
        pi_ = new sp_counted_impl_pd< typename std::unique_ptr<Y, D>::pointer, D2 >( r.get(), d2 );
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_NO_EXCEPTIONS
 | 
			
		||||
@@ -402,8 +365,6 @@ public:
 | 
			
		||||
        r.release();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#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)
 | 
			
		||||
@@ -427,7 +388,7 @@ public:
 | 
			
		||||
        r.release();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~shared_count() /*BOOST_SP_NOEXCEPT*/
 | 
			
		||||
    ~shared_count() /*noexcept*/
 | 
			
		||||
    {
 | 
			
		||||
        if( pi_ != 0 ) pi_->release();
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
@@ -435,7 +396,7 @@ public:
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    shared_count(shared_count const & r) BOOST_SP_NOEXCEPT: pi_(r.pi_)
 | 
			
		||||
    shared_count(shared_count const & r) noexcept: pi_(r.pi_)
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
@@ -443,9 +404,7 @@ public:
 | 
			
		||||
        if( pi_ != 0 ) pi_->add_ref_copy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    shared_count(shared_count && r) BOOST_SP_NOEXCEPT: pi_(r.pi_)
 | 
			
		||||
    shared_count(shared_count && r) noexcept: pi_(r.pi_)
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
@@ -453,12 +412,10 @@ public:
 | 
			
		||||
        r.pi_ = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    explicit shared_count(weak_count const & r); // throws bad_weak_ptr when r.use_count() == 0
 | 
			
		||||
    shared_count( weak_count const & r, sp_nothrow_tag ) BOOST_SP_NOEXCEPT; // constructs an empty *this when r.use_count() == 0
 | 
			
		||||
    shared_count( weak_count const & r, sp_nothrow_tag ) noexcept; // constructs an empty *this when r.use_count() == 0
 | 
			
		||||
 | 
			
		||||
    shared_count & operator= (shared_count const & r) BOOST_SP_NOEXCEPT
 | 
			
		||||
    shared_count & operator= (shared_count const & r) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        sp_counted_base * tmp = r.pi_;
 | 
			
		||||
 | 
			
		||||
@@ -472,58 +429,58 @@ public:
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void swap(shared_count & r) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void swap(shared_count & r) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        sp_counted_base * tmp = r.pi_;
 | 
			
		||||
        r.pi_ = pi_;
 | 
			
		||||
        pi_ = tmp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    long use_count() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pi_ != 0? pi_->use_count(): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool unique() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool unique() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return use_count() == 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool empty() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool empty() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pi_ == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool operator==( shared_count const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool operator==( shared_count const & r ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pi_ == r.pi_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool operator==( weak_count const & r ) const BOOST_SP_NOEXCEPT;
 | 
			
		||||
    bool operator==( weak_count const & r ) const noexcept;
 | 
			
		||||
 | 
			
		||||
    bool operator<( shared_count const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool operator<( shared_count const & r ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return std::less<sp_counted_base *>()( pi_, r.pi_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool operator<( weak_count const & r ) const BOOST_SP_NOEXCEPT;
 | 
			
		||||
    bool operator<( weak_count const & r ) const noexcept;
 | 
			
		||||
 | 
			
		||||
    void * get_deleter( sp_typeinfo_ const & ti ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * get_deleter( sp_typeinfo_ const & ti ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pi_? pi_->get_deleter( ti ): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * get_local_deleter( sp_typeinfo_ const & ti ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * get_local_deleter( sp_typeinfo_ const & ti ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pi_? pi_->get_local_deleter( ti ): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * get_untyped_deleter() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * get_untyped_deleter() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pi_? pi_->get_untyped_deleter(): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::size_t hash_value() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    std::size_t hash_value() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return sp_hash_pointer( pi_ );
 | 
			
		||||
    }
 | 
			
		||||
@@ -544,14 +501,14 @@ private:
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR weak_count() BOOST_SP_NOEXCEPT: pi_(0)
 | 
			
		||||
    constexpr weak_count() noexcept: pi_(0)
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(weak_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_count(shared_count const & r) BOOST_SP_NOEXCEPT: pi_(r.pi_)
 | 
			
		||||
    weak_count(shared_count const & r) noexcept: pi_(r.pi_)
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(weak_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
@@ -559,7 +516,7 @@ public:
 | 
			
		||||
        if(pi_ != 0) pi_->weak_add_ref();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_count(weak_count const & r) BOOST_SP_NOEXCEPT: pi_(r.pi_)
 | 
			
		||||
    weak_count(weak_count const & r) noexcept: pi_(r.pi_)
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(weak_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
@@ -569,9 +526,7 @@ public:
 | 
			
		||||
 | 
			
		||||
// Move support
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    weak_count(weak_count && r) BOOST_SP_NOEXCEPT: pi_(r.pi_)
 | 
			
		||||
    weak_count(weak_count && r) noexcept: pi_(r.pi_)
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(weak_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
@@ -579,9 +534,7 @@ public:
 | 
			
		||||
        r.pi_ = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    ~weak_count() /*BOOST_SP_NOEXCEPT*/
 | 
			
		||||
    ~weak_count() /*noexcept*/
 | 
			
		||||
    {
 | 
			
		||||
        if(pi_ != 0) pi_->weak_release();
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
@@ -589,7 +542,7 @@ public:
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_count & operator= (shared_count const & r) BOOST_SP_NOEXCEPT
 | 
			
		||||
    weak_count & operator= (shared_count const & r) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        sp_counted_base * tmp = r.pi_;
 | 
			
		||||
 | 
			
		||||
@@ -603,7 +556,7 @@ public:
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_count & operator= (weak_count const & r) BOOST_SP_NOEXCEPT
 | 
			
		||||
    weak_count & operator= (weak_count const & r) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        sp_counted_base * tmp = r.pi_;
 | 
			
		||||
 | 
			
		||||
@@ -617,44 +570,44 @@ public:
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void swap(weak_count & r) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void swap(weak_count & r) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        sp_counted_base * tmp = r.pi_;
 | 
			
		||||
        r.pi_ = pi_;
 | 
			
		||||
        pi_ = tmp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    long use_count() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pi_ != 0? pi_->use_count(): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool empty() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool empty() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pi_ == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool operator==( weak_count const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool operator==( weak_count const & r ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pi_ == r.pi_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool operator==( shared_count const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool operator==( shared_count const & r ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pi_ == r.pi_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool operator<( weak_count const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool operator<( weak_count const & r ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return std::less<sp_counted_base *>()( pi_, r.pi_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool operator<( shared_count const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool operator<( shared_count const & r ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return std::less<sp_counted_base *>()( pi_, r.pi_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::size_t hash_value() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    std::size_t hash_value() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return sp_hash_pointer( pi_ );
 | 
			
		||||
    }
 | 
			
		||||
@@ -671,7 +624,7 @@ inline shared_count::shared_count( weak_count const & r ): pi_( r.pi_ )
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline shared_count::shared_count( weak_count const & r, sp_nothrow_tag ) BOOST_SP_NOEXCEPT: pi_( r.pi_ )
 | 
			
		||||
inline shared_count::shared_count( weak_count const & r, sp_nothrow_tag ) noexcept: pi_( r.pi_ )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
@@ -682,12 +635,12 @@ inline shared_count::shared_count( weak_count const & r, sp_nothrow_tag ) BOOST_
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline bool shared_count::operator==( weak_count const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
inline bool shared_count::operator==( weak_count const & r ) const noexcept
 | 
			
		||||
{
 | 
			
		||||
    return pi_ == r.pi_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline bool shared_count::operator<( weak_count const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
inline bool shared_count::operator<( weak_count const & r ) const noexcept
 | 
			
		||||
{
 | 
			
		||||
    return std::less<sp_counted_base *>()( pi_, r.pi_ );
 | 
			
		||||
}
 | 
			
		||||
@@ -700,8 +653,4 @@ inline bool shared_count::operator<( weak_count const & r ) const BOOST_SP_NOEXC
 | 
			
		||||
#pragma GCC diagnostic pop
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(__BORLANDC__) && !defined(__clang__)
 | 
			
		||||
# pragma warn .8027     // Functions containing try are not expanded inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SHARED_COUNT_HPP_INCLUDED
 | 
			
		||||
 
 | 
			
		||||
@@ -18,20 +18,6 @@
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( BOOST_NO_SFINAE )
 | 
			
		||||
# define BOOST_SP_NO_SP_CONVERTIBLE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( __GNUC__ ) && ( __GNUC__ * 100 + __GNUC_MINOR__ < 303 )
 | 
			
		||||
# define BOOST_SP_NO_SP_CONVERTIBLE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( BOOST_BORLANDC ) && ( BOOST_BORLANDC < 0x630 )
 | 
			
		||||
# define BOOST_SP_NO_SP_CONVERTIBLE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -87,6 +73,4 @@ template< class Y, class T > struct sp_enable_if_convertible: public sp_enable_i
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED
 | 
			
		||||
 
 | 
			
		||||
@@ -17,14 +17,10 @@
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_has_sync_intrinsics.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/deprecated_macros.hpp>
 | 
			
		||||
#include <boost/config.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 )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_nt.hpp>
 | 
			
		||||
@@ -41,18 +37,24 @@
 | 
			
		||||
#elif defined( BOOST_DISABLE_THREADS ) && !defined( BOOST_SP_ENABLE_THREADS ) && !defined( BOOST_DISABLE_WIN32 )
 | 
			
		||||
# 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_SP_HAS_GCC_INTRINSICS )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_gcc_atomic.hpp>
 | 
			
		||||
 | 
			
		||||
#elif !defined( BOOST_NO_CXX11_HDR_ATOMIC )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_std_atomic.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( __SNC__ )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp>
 | 
			
		||||
#elif defined( __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_sync.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) ) && !defined(__PATHSCALE__)
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_HAS_SYNC_INTRINSICS )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_sync.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( __SNC__ )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined(__HP_aCC) && defined(__ia64)
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp>
 | 
			
		||||
 | 
			
		||||
@@ -71,9 +73,6 @@
 | 
			
		||||
#elif defined( __GNUC__ ) && ( defined( __mips__ ) || defined( _mips ) ) && !defined(__PATHSCALE__) && !defined( __mips16 )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_HAS_SYNC )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_sync.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined(__GNUC__) && ( defined( __sparcv9 ) || ( defined( __sparcv8 ) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 402 ) ) )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp>
 | 
			
		||||
 | 
			
		||||
@@ -91,6 +90,4 @@
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#undef BOOST_SP_HAS_CLANG_C11_ATOMICS
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_obsolete.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <machine/sys/inline.h>
 | 
			
		||||
 | 
			
		||||
@@ -26,6 +27,8 @@ BOOST_PRAGMA_MESSAGE("Using HP aCC++/HP-UX/IA64 sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,168 +0,0 @@
 | 
			
		||||
#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/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/cstdint.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using Clang/C11 sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined(__clang__)
 | 
			
		||||
# pragma clang diagnostic push
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(__clang__) && defined(__has_warning)
 | 
			
		||||
# if __has_warning( "-Wc11-extensions" )
 | 
			
		||||
#  pragma clang diagnostic ignored "-Wc11-extensions"
 | 
			
		||||
# endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
typedef _Atomic( boost::int_least32_t ) atomic_int_least32_t;
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( atomic_int_least32_t * pw ) BOOST_SP_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    __c11_atomic_fetch_add( pw, 1, __ATOMIC_RELAXED );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline boost::int_least32_t atomic_decrement( atomic_int_least32_t * pw ) BOOST_SP_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return __c11_atomic_fetch_sub( pw, 1, __ATOMIC_ACQ_REL );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline boost::int_least32_t atomic_conditional_increment( atomic_int_least32_t * pw ) BOOST_SP_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    // 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 ignored "-Wweak-vtables"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
class BOOST_SYMBOL_VISIBLE 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() BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        __c11_atomic_init( &use_count_, 1 );
 | 
			
		||||
        __c11_atomic_init( &weak_count_, 1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() /*BOOST_SP_NOEXCEPT*/
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() BOOST_SP_NOEXCEPT = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() BOOST_SP_NOEXCEPT // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo_ const & ti ) BOOST_SP_NOEXCEPT = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo_ const & ti ) BOOST_SP_NOEXCEPT = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() BOOST_SP_NOEXCEPT = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy() BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() BOOST_SP_NOEXCEPT // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &use_count_ ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        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
 | 
			
		||||
@@ -25,6 +25,7 @@
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_obsolete.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
@@ -61,7 +62,11 @@ inline long atomic_decrement( register long * pw )
 | 
			
		||||
 | 
			
		||||
    asm
 | 
			
		||||
    {
 | 
			
		||||
#if defined(__PPCZen__) || defined(__PPCe500__) || defined(__PPCe500v2__)
 | 
			
		||||
    msync
 | 
			
		||||
#else
 | 
			
		||||
    sync
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
loop:
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_X86_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_X86_HPP_INCLUDED
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_ATOMIC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_ATOMIC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
@@ -7,31 +7,20 @@
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// detail/sp_counted_base_gcc_atomic.hpp - g++ 4.7+ __atomic intrinsics
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_cw_x86.hpp - CodeWarrion on 486+
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 Peter Dimov
 | 
			
		||||
//  Copyright 2005 Rene Rivera
 | 
			
		||||
//
 | 
			
		||||
//  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)
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Ben Hitchings for the #weak + (#shared != 0)
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2007, 2020 Peter Dimov
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/cstdint.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using CodeWarrior/x86 sp_counted_base")
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using __atomic sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -41,50 +30,41 @@ namespace boost
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline int atomic_exchange_and_add( int * pw, int dv )
 | 
			
		||||
inline void atomic_increment( boost::uint_least32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    // int r = *pw;
 | 
			
		||||
    // *pw += dv;
 | 
			
		||||
    __atomic_fetch_add( pw, 1, __ATOMIC_RELAXED );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline boost::uint_least32_t atomic_decrement( boost::uint_least32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    return __atomic_fetch_sub( pw, 1, __ATOMIC_ACQ_REL );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline boost::uint_least32_t atomic_conditional_increment( boost::uint_least32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    // long r = *pw;
 | 
			
		||||
    // if( r != 0 ) ++*pw;
 | 
			
		||||
    // return r;
 | 
			
		||||
 | 
			
		||||
    asm
 | 
			
		||||
    boost::uint_least32_t r = __atomic_load_n( pw, __ATOMIC_RELAXED );
 | 
			
		||||
 | 
			
		||||
    for( ;; )
 | 
			
		||||
    {
 | 
			
		||||
        mov esi, [pw]
 | 
			
		||||
        mov eax, dv
 | 
			
		||||
        lock xadd dword ptr [esi], eax
 | 
			
		||||
        if( r == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if( __atomic_compare_exchange_n( pw, &r, r + 1, true, __ATOMIC_RELAXED, __ATOMIC_RELAXED ) )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int * pw )
 | 
			
		||||
inline boost::uint_least32_t atomic_load( boost::uint_least32_t const * pw )
 | 
			
		||||
{
 | 
			
		||||
    //atomic_exchange_and_add( pw, 1 );
 | 
			
		||||
 | 
			
		||||
    asm
 | 
			
		||||
    {
 | 
			
		||||
        mov esi, [pw]
 | 
			
		||||
        lock inc dword ptr [esi]
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_conditional_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // int rv = *pw;
 | 
			
		||||
    // if( rv != 0 ) ++*pw;
 | 
			
		||||
    // return rv;
 | 
			
		||||
 | 
			
		||||
    asm
 | 
			
		||||
    {
 | 
			
		||||
        mov esi, [pw]
 | 
			
		||||
        mov eax, dword ptr [esi]
 | 
			
		||||
    L0:
 | 
			
		||||
        test eax, eax
 | 
			
		||||
        je L1
 | 
			
		||||
        mov ebx, eax
 | 
			
		||||
        inc ebx
 | 
			
		||||
        lock cmpxchg dword ptr [esi], ebx
 | 
			
		||||
        jne L0
 | 
			
		||||
    L1:
 | 
			
		||||
    }
 | 
			
		||||
    return __atomic_load_n( pw, __ATOMIC_ACQUIRE );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class BOOST_SYMBOL_VISIBLE sp_counted_base
 | 
			
		||||
@@ -94,8 +74,8 @@ private:
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    int use_count_;        // #shared
 | 
			
		||||
    int weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
    boost::uint_least32_t use_count_;        // #shared
 | 
			
		||||
    boost::uint_least32_t weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
@@ -135,7 +115,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_exchange_and_add( &use_count_, -1 ) == 1 )
 | 
			
		||||
        if( atomic_decrement( &use_count_ ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
@@ -149,7 +129,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_exchange_and_add( &weak_count_, -1 ) == 1 )
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
@@ -157,7 +137,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<int const volatile &>( use_count_ );
 | 
			
		||||
        return static_cast<long>( atomic_load( &use_count_ ) );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -165,4 +145,4 @@ public:
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_X86_HPP_INCLUDED
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED
 | 
			
		||||
@@ -17,6 +17,7 @@
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_obsolete.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
@@ -26,6 +27,8 @@ BOOST_PRAGMA_MESSAGE("Using g++/IA64 sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,7 @@
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_obsolete.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
@@ -30,6 +31,8 @@ BOOST_PRAGMA_MESSAGE("Using g++/MIPS sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_obsolete.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
@@ -34,6 +35,8 @@ BOOST_PRAGMA_MESSAGE("Using g++/PowerPC sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,7 @@
 | 
			
		||||
//  Thanks to Michael van der Westhuizen
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_obsolete.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <inttypes.h> // int32_t
 | 
			
		||||
 | 
			
		||||
@@ -30,6 +31,8 @@ BOOST_PRAGMA_MESSAGE("Using g++/Sparc sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_obsolete.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
@@ -34,6 +35,8 @@ BOOST_PRAGMA_MESSAGE("Using g++/x86 sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,6 @@
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/cstdint.hpp>
 | 
			
		||||
 | 
			
		||||
@@ -48,43 +47,43 @@ private:
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base() BOOST_SP_NOEXCEPT: use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    sp_counted_base() noexcept: use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() /*BOOST_SP_NOEXCEPT*/
 | 
			
		||||
    virtual ~sp_counted_base() /*noexcept*/
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() BOOST_SP_NOEXCEPT = 0; // nothrow
 | 
			
		||||
    virtual void dispose() noexcept = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() BOOST_SP_NOEXCEPT // nothrow
 | 
			
		||||
    virtual void destroy() noexcept // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo_ const & ti ) BOOST_SP_NOEXCEPT = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo_ const & ti ) BOOST_SP_NOEXCEPT = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() BOOST_SP_NOEXCEPT = 0;
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo_ const & ti ) noexcept = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo_ const & ti ) noexcept = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() noexcept = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void add_ref_copy() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        ++use_count_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() BOOST_SP_NOEXCEPT // true on success
 | 
			
		||||
    bool add_ref_lock() noexcept // true on success
 | 
			
		||||
    {
 | 
			
		||||
        if( use_count_ == 0 ) return false;
 | 
			
		||||
        ++use_count_;
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void release() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        if( --use_count_ == 0 )
 | 
			
		||||
        {
 | 
			
		||||
@@ -93,12 +92,12 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void weak_add_ref() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        ++weak_count_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void weak_release() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        if( --weak_count_ == 0 )
 | 
			
		||||
        {
 | 
			
		||||
@@ -106,7 +105,7 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    long use_count() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return use_count_;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,7 @@
 | 
			
		||||
//  Thanks to Michael van der Westhuizen
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_obsolete.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <inttypes.h> // uint32_t
 | 
			
		||||
 | 
			
		||||
@@ -30,6 +31,8 @@ BOOST_PRAGMA_MESSAGE("Using PS3 sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,123 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SOLARIS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SOLARIS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_solaris.hpp
 | 
			
		||||
//   based on: detail/sp_counted_base_w32.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 Peter Dimov
 | 
			
		||||
//  Copyright 2006 Michael van der Westhuizen
 | 
			
		||||
//
 | 
			
		||||
//  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)
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Ben Hitchings for the #weak + (#shared != 0)
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <atomic.h>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using Solaris sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class BOOST_SYMBOL_VISIBLE sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    uint32_t use_count_;        // #shared
 | 
			
		||||
    uint32_t weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), 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_local_deleter( sp_typeinfo_ const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        atomic_inc_32( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        for( ;; )
 | 
			
		||||
        {
 | 
			
		||||
            uint32_t tmp = static_cast< uint32_t const volatile& >( use_count_ );
 | 
			
		||||
            if( tmp == 0 ) return false;
 | 
			
		||||
            if( atomic_cas_32( &use_count_, tmp, tmp + 1 ) == tmp ) return true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_dec_32_nv( &use_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_inc_32( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_dec_32_nv( &weak_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<long const volatile &>( use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SOLARIS_HPP_INCLUDED
 | 
			
		||||
@@ -16,7 +16,6 @@
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <atomic>
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
@@ -34,17 +33,17 @@ namespace boost
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( std::atomic_int_least32_t * pw ) BOOST_SP_NOEXCEPT
 | 
			
		||||
inline void atomic_increment( std::atomic_int_least32_t * pw ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    pw->fetch_add( 1, std::memory_order_relaxed );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline std::int_least32_t atomic_decrement( std::atomic_int_least32_t * pw ) BOOST_SP_NOEXCEPT
 | 
			
		||||
inline std::int_least32_t atomic_decrement( std::atomic_int_least32_t * pw ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return pw->fetch_sub( 1, std::memory_order_acq_rel );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline std::int_least32_t atomic_conditional_increment( std::atomic_int_least32_t * pw ) BOOST_SP_NOEXCEPT
 | 
			
		||||
inline std::int_least32_t atomic_conditional_increment( std::atomic_int_least32_t * pw ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    // long r = *pw;
 | 
			
		||||
    // if( r != 0 ) ++*pw;
 | 
			
		||||
@@ -78,41 +77,41 @@ private:
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base() BOOST_SP_NOEXCEPT: use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    sp_counted_base() noexcept: use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() /*BOOST_SP_NOEXCEPT*/
 | 
			
		||||
    virtual ~sp_counted_base() /*noexcept*/
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() BOOST_SP_NOEXCEPT = 0;
 | 
			
		||||
    virtual void dispose() noexcept = 0;
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() BOOST_SP_NOEXCEPT
 | 
			
		||||
    virtual void destroy() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo_ const & ti ) BOOST_SP_NOEXCEPT = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo_ const & ti ) BOOST_SP_NOEXCEPT = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() BOOST_SP_NOEXCEPT = 0;
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo_ const & ti ) noexcept = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo_ const & ti ) noexcept = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() noexcept = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void add_ref_copy() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() BOOST_SP_NOEXCEPT // true on success
 | 
			
		||||
    bool add_ref_lock() noexcept // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void release() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &use_count_ ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
@@ -121,12 +120,12 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void weak_add_ref() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void weak_release() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
@@ -134,7 +133,7 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    long use_count() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return use_count_.load( std::memory_order_acquire );
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,7 @@
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_obsolete.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
@@ -31,6 +32,8 @@ BOOST_PRAGMA_MESSAGE("Using xlC/PowerPC sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
extern "builtin" void __lwsync(void);
 | 
			
		||||
extern "builtin" void __isync(void);
 | 
			
		||||
extern "builtin" int __fetch_and_add(volatile int* addr, int val);
 | 
			
		||||
 
 | 
			
		||||
@@ -90,18 +90,7 @@ public:
 | 
			
		||||
            long tmp = static_cast< long const volatile& >( use_count_ );
 | 
			
		||||
            if( tmp == 0 ) return false;
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, == 1200 )
 | 
			
		||||
 | 
			
		||||
            // work around a code generation bug
 | 
			
		||||
 | 
			
		||||
            long tmp2 = tmp + 1;
 | 
			
		||||
            if( BOOST_SP_INTERLOCKED_COMPARE_EXCHANGE( &use_count_, tmp2, tmp ) == tmp2 - 1 ) return true;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
            if( BOOST_SP_INTERLOCKED_COMPARE_EXCHANGE( &use_count_, tmp + 1, tmp ) == tmp ) return true;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -23,8 +23,8 @@
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_counted_base.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <boost/checked_delete.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/deprecated_macros.hpp>
 | 
			
		||||
#include <boost/core/checked_delete.hpp>
 | 
			
		||||
#include <boost/core/addressof.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
@@ -52,12 +52,12 @@ namespace detail
 | 
			
		||||
 | 
			
		||||
template<class D> class local_sp_deleter;
 | 
			
		||||
 | 
			
		||||
template<class D> D * get_local_deleter( D * /*p*/ ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class D> D * get_local_deleter( D * /*p*/ ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class D> D * get_local_deleter( local_sp_deleter<D> * p ) BOOST_SP_NOEXCEPT;
 | 
			
		||||
template<class D> D * get_local_deleter( local_sp_deleter<D> * p ) noexcept;
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
@@ -81,7 +81,7 @@ public:
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void dispose() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    void dispose() noexcept override
 | 
			
		||||
    {
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        boost::sp_scalar_destructor_hook( px_, sizeof(X), this );
 | 
			
		||||
@@ -89,17 +89,17 @@ public:
 | 
			
		||||
        boost::checked_delete( px_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * get_deleter( sp_typeinfo_ const & ) BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    void * get_deleter( sp_typeinfo_ const & ) noexcept override
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * get_local_deleter( sp_typeinfo_ const & ) BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    void * get_local_deleter( sp_typeinfo_ const & ) noexcept override
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * get_untyped_deleter() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    void * get_untyped_deleter() noexcept override
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
@@ -133,19 +133,12 @@ public:
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Borland's Codeguard trips up over the -Vx- option here:
 | 
			
		||||
//
 | 
			
		||||
#ifdef __CODEGUARD__
 | 
			
		||||
# pragma option push -Vx-
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class P, class D> class BOOST_SYMBOL_VISIBLE sp_counted_impl_pd: public sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    P ptr; // copy constructor must not throw
 | 
			
		||||
    D del; // copy constructor must not throw
 | 
			
		||||
    D del; // copy/move constructor must not throw
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pd( sp_counted_impl_pd const & );
 | 
			
		||||
    sp_counted_impl_pd & operator= ( sp_counted_impl_pd const & );
 | 
			
		||||
@@ -156,7 +149,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    // pre: d(p) must not throw
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pd( P p, D & d ): ptr( p ), del( d )
 | 
			
		||||
    sp_counted_impl_pd( P p, D & d ): ptr( p ), del( static_cast< D&& >( d ) )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -164,22 +157,22 @@ public:
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void dispose() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    void dispose() noexcept override
 | 
			
		||||
    {
 | 
			
		||||
        del( ptr );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * get_deleter( sp_typeinfo_ const & ti ) BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    void * get_deleter( sp_typeinfo_ const & ti ) noexcept override
 | 
			
		||||
    {
 | 
			
		||||
        return ti == BOOST_SP_TYPEID_(D)? &reinterpret_cast<char&>( del ): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * get_local_deleter( sp_typeinfo_ const & ti ) BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    void * get_local_deleter( sp_typeinfo_ const & ti ) noexcept override
 | 
			
		||||
    {
 | 
			
		||||
        return ti == BOOST_SP_TYPEID_(D)? boost::detail::get_local_deleter( boost::addressof( del ) ): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * get_untyped_deleter() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    void * get_untyped_deleter() noexcept override
 | 
			
		||||
    {
 | 
			
		||||
        return &reinterpret_cast<char&>( del );
 | 
			
		||||
    }
 | 
			
		||||
@@ -218,7 +211,7 @@ template<class P, class D, class A> class BOOST_SYMBOL_VISIBLE sp_counted_impl_p
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    P p_; // copy constructor must not throw
 | 
			
		||||
    D d_; // copy constructor must not throw
 | 
			
		||||
    D d_; // copy/move constructor must not throw
 | 
			
		||||
    A a_; // copy constructor must not throw
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pda( sp_counted_impl_pda const & );
 | 
			
		||||
@@ -230,7 +223,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    // pre: d( p ) must not throw
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pda( P p, D & d, A a ): p_( p ), d_( d ), a_( a )
 | 
			
		||||
    sp_counted_impl_pda( P p, D & d, A a ): p_( p ), d_( static_cast< D&& >( d ) ), a_( a )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -238,23 +231,15 @@ public:
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void dispose() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    void dispose() noexcept override
 | 
			
		||||
    {
 | 
			
		||||
        d_( p_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void destroy() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    void destroy() noexcept override
 | 
			
		||||
    {
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
 | 
			
		||||
 | 
			
		||||
        typedef typename std::allocator_traits<A>::template rebind_alloc< this_type > A2;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        typedef typename A::template rebind< this_type >::other A2;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        A2 a2( a_ );
 | 
			
		||||
 | 
			
		||||
        this->~this_type();
 | 
			
		||||
@@ -262,26 +247,22 @@ public:
 | 
			
		||||
        a2.deallocate( this, 1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * get_deleter( sp_typeinfo_ const & ti ) BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    void * get_deleter( sp_typeinfo_ const & ti ) noexcept override
 | 
			
		||||
    {
 | 
			
		||||
        return ti == BOOST_SP_TYPEID_( D )? &reinterpret_cast<char&>( d_ ): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * get_local_deleter( sp_typeinfo_ const & ti ) BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    void * get_local_deleter( sp_typeinfo_ const & ti ) noexcept override
 | 
			
		||||
    {
 | 
			
		||||
        return ti == BOOST_SP_TYPEID_( D )? boost::detail::get_local_deleter( boost::addressof( d_ ) ): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * get_untyped_deleter() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    void * get_untyped_deleter() noexcept override
 | 
			
		||||
    {
 | 
			
		||||
        return &reinterpret_cast<char&>( d_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#ifdef __CODEGUARD__
 | 
			
		||||
# pragma option pop
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										37
									
								
								include/boost/smart_ptr/detail/sp_cxx20_constexpr.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								include/boost/smart_ptr/detail/sp_cxx20_constexpr.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_CXX20_CONSTEXPR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_CXX20_CONSTEXPR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
#pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_noexcept.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2025 Mathias Stearn
 | 
			
		||||
//
 | 
			
		||||
//  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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// This macro is used to mark functions as constexpr if the compiler supports
 | 
			
		||||
// constexpr destructors. Since you can't have a constexpr smart pointer object,
 | 
			
		||||
// everything except null constructors are guided behind this macro. Because
 | 
			
		||||
// this also guards a use of dynamic_cast, we need to check for its availability
 | 
			
		||||
// as well. It isn't worth splitting out since all known compilers that support
 | 
			
		||||
// constexpr dynamic_cast also support constexpr destructors.
 | 
			
		||||
//
 | 
			
		||||
// WARNING: This does not check for changing active member of a union in
 | 
			
		||||
// constant expressions which is allowed in C++20. If that is needed, we
 | 
			
		||||
// need to raise the checked version to 202002L.
 | 
			
		||||
#if defined(__cpp_constexpr_dynamic_alloc) && __cpp_constexpr_dynamic_alloc >= 201907L \
 | 
			
		||||
    && defined(__cpp_constexpr) && __cpp_constexpr >= 201907L
 | 
			
		||||
#define BOOST_SP_CXX20_CONSTEXPR constexpr
 | 
			
		||||
#else
 | 
			
		||||
#define BOOST_SP_CXX20_CONSTEXPR
 | 
			
		||||
#define BOOST_SP_NO_CXX20_CONSTEXPR
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_CXX20_CONSTEXPR_HPP_INCLUDED
 | 
			
		||||
@@ -1,52 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_FORWARD_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_FORWARD_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_forward.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2008,2012 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>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#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
 | 
			
		||||
{
 | 
			
		||||
    return static_cast< T&& >( t );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_FORWARD_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										30
									
								
								include/boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								include/boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_HAS_GCC_INTRINSICS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_HAS_GCC_INTRINSICS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2020 Peter Dimov
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
// Defines the BOOST_SP_HAS_GCC_INTRINSICS macro if the __atomic_*
 | 
			
		||||
// intrinsics are available.
 | 
			
		||||
 | 
			
		||||
// Libraries (e.g. Kokkos) sometimes define the __ATOMIC_RELAXED macros,
 | 
			
		||||
// leading to errors under MSVC (https://github.com/boostorg/smart_ptr/pull/112)
 | 
			
		||||
 | 
			
		||||
#if defined( __ATOMIC_RELAXED ) && defined( __ATOMIC_ACQUIRE ) && defined( __ATOMIC_RELEASE ) && defined( __ATOMIC_ACQ_REL ) \
 | 
			
		||||
    && !( defined(_MSC_VER) && !defined(__clang__) )
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_HAS_GCC_INTRINSICS
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_HAS_GCC_INTRINSICS_HPP_INCLUDED
 | 
			
		||||
@@ -1,69 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_HAS_SYNC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_HAS_SYNC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/smart_ptr/detail/sp_has_sync.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008, 2009 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)
 | 
			
		||||
//
 | 
			
		||||
//  Defines the BOOST_SP_HAS_SYNC macro if the __sync_* intrinsics
 | 
			
		||||
//  are available.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_SP_NO_SYNC
 | 
			
		||||
 | 
			
		||||
#if !defined( __c2__ ) && defined( __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 )
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_HAS_SYNC
 | 
			
		||||
 | 
			
		||||
#elif defined( __IBMCPP__ ) && ( __IBMCPP__ >= 1210 ) && !defined( __COMPILER_VER__ )
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_HAS_SYNC
 | 
			
		||||
 | 
			
		||||
#elif !defined( __c2__ ) && defined( __GNUC__ ) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 )
 | 
			
		||||
 | 
			
		||||
#define BOOST_SP_HAS_SYNC
 | 
			
		||||
 | 
			
		||||
#if defined( __arm__ )  || defined( __armel__ )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined( __hppa ) || defined( __hppa__ )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined( __m68k__ )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined( __sh__ )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined( __sparc__ )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined( __INTEL_COMPILER ) && !defined( __ia64__ ) && ( __INTEL_COMPILER < 1110 )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(__PATHSCALE__) && ((__PATHCC__ == 4) && (__PATHCC_MINOR__ < 9)) 
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SP_NO_SYNC
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_HAS_SYNC_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										69
									
								
								include/boost/smart_ptr/detail/sp_has_sync_intrinsics.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								include/boost/smart_ptr/detail/sp_has_sync_intrinsics.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,69 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_HAS_SYNC_INTRINSICS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_HAS_SYNC_INTRINSICS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/smart_ptr/detail/sp_has_sync_intrinsics.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008, 2009 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)
 | 
			
		||||
//
 | 
			
		||||
//  Defines the BOOST_SP_HAS_SYNC_INTRINSICS macro if the __sync_* intrinsics
 | 
			
		||||
//  are available.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_SP_NO_SYNC_INTRINSICS ) && !defined( BOOST_SP_NO_SYNC )
 | 
			
		||||
 | 
			
		||||
#if defined( __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 ) && !defined( __c2__ )
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_HAS_SYNC_INTRINSICS
 | 
			
		||||
 | 
			
		||||
#elif defined( __IBMCPP__ ) && ( __IBMCPP__ >= 1210 ) && !defined( __COMPILER_VER__ )
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_HAS_SYNC_INTRINSICS
 | 
			
		||||
 | 
			
		||||
#elif defined( __GNUC__ ) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 ) && !defined( __c2__ )
 | 
			
		||||
 | 
			
		||||
#define BOOST_SP_HAS_SYNC_INTRINSICS
 | 
			
		||||
 | 
			
		||||
#if defined( __arm__ )  || defined( __armel__ )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC_INTRINSICS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined( __hppa ) || defined( __hppa__ )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC_INTRINSICS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined( __m68k__ )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC_INTRINSICS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined( __sh__ )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC_INTRINSICS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined( __sparc__ )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC_INTRINSICS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined( __INTEL_COMPILER ) && !defined( __ia64__ ) && ( __INTEL_COMPILER < 1110 )
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC_INTRINSICS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(__PATHSCALE__) && ((__PATHCC__ == 4) && (__PATHCC_MINOR__ < 9)) 
 | 
			
		||||
#undef BOOST_SP_HAS_SYNC_INTRINSICS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #if !defined( BOOST_SP_NO_SYNC_INTRINSICS ) && !defined( BOOST_SP_NO_SYNC )
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_HAS_SYNC_INTRINSICS_HPP_INCLUDED
 | 
			
		||||
@@ -15,25 +15,16 @@
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
// BOOST_SP_NOEXCEPT
 | 
			
		||||
// BOOST_SP_NOEXCEPT (obsolete, only retained for compatibility)
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_MSVC ) && BOOST_MSVC >= 1700 && BOOST_MSVC < 1900
 | 
			
		||||
#define BOOST_SP_NOEXCEPT noexcept
 | 
			
		||||
 | 
			
		||||
#  define BOOST_SP_NOEXCEPT BOOST_NOEXCEPT_OR_NOTHROW
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#  define BOOST_SP_NOEXCEPT BOOST_NOEXCEPT
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// BOOST_SP_NOEXCEPT_WITH_ASSERT
 | 
			
		||||
// BOOST_SP_NOEXCEPT_WITH_ASSERT (noexcept, unless a user assertion handler is present)
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_DISABLE_ASSERTS) || ( defined(BOOST_ENABLE_ASSERT_DEBUG_HANDLER) && defined(NDEBUG) )
 | 
			
		||||
 | 
			
		||||
#  define BOOST_SP_NOEXCEPT_WITH_ASSERT BOOST_SP_NOEXCEPT
 | 
			
		||||
#  define BOOST_SP_NOEXCEPT_WITH_ASSERT noexcept
 | 
			
		||||
 | 
			
		||||
#elif defined(BOOST_ENABLE_ASSERT_HANDLER) || ( defined(BOOST_ENABLE_ASSERT_DEBUG_HANDLER) && !defined(NDEBUG) )
 | 
			
		||||
 | 
			
		||||
@@ -41,7 +32,7 @@
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#  define BOOST_SP_NOEXCEPT_WITH_ASSERT BOOST_SP_NOEXCEPT
 | 
			
		||||
#  define BOOST_SP_NOEXCEPT_WITH_ASSERT noexcept
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,45 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_NULLPTR_T_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_NULLPTR_T_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_nullptr_t.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2013 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>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_DECLTYPE ) && ( ( defined( __clang__ ) && !defined( _LIBCPP_VERSION ) ) || defined( __INTEL_COMPILER ) )
 | 
			
		||||
 | 
			
		||||
    typedef decltype(nullptr) sp_nullptr_t;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    typedef std::nullptr_t sp_nullptr_t;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_NULLPTR_T_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										32
									
								
								include/boost/smart_ptr/detail/sp_obsolete.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								include/boost/smart_ptr/detail/sp_obsolete.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_OBSOLETE_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_OBSOLETE_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// boost/smart_ptr/detail/sp_obsolete.hpp
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2020 Peter Dimov
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
// Defines the BOOST_SP_OBSOLETE macro that emits a deprecation
 | 
			
		||||
// message.
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_SP_NO_OBSOLETE_MESSAGE )
 | 
			
		||||
 | 
			
		||||
#define BOOST_SP_OBSOLETE() BOOST_PRAGMA_MESSAGE("This platform-specific implementation is presumed obsolete and is slated for removal. If you want it retained, please open an issue in https://github.com/boostorg/smart_ptr.")
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#define BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_OBSOLETE_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										23
									
								
								include/boost/smart_ptr/detail/sp_thread_pause.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								include/boost/smart_ptr/detail/sp_thread_pause.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_THREAD_PAUSE_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_THREAD_PAUSE_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// Copyright 2023 Peter Dimov
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/core/yield_primitives.hpp>
 | 
			
		||||
#include <boost/config/header_deprecated.hpp>
 | 
			
		||||
 | 
			
		||||
BOOST_HEADER_DEPRECATED( "<boost/core/yield_primitives.hpp>" )
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
using boost::core::sp_thread_pause;
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_THREAD_PAUSE_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										23
									
								
								include/boost/smart_ptr/detail/sp_thread_sleep.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								include/boost/smart_ptr/detail/sp_thread_sleep.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_THREAD_SLEEP_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_THREAD_SLEEP_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// Copyright 2023 Peter Dimov
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/core/yield_primitives.hpp>
 | 
			
		||||
#include <boost/config/header_deprecated.hpp>
 | 
			
		||||
 | 
			
		||||
BOOST_HEADER_DEPRECATED( "<boost/core/yield_primitives.hpp>" )
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
using boost::core::sp_thread_sleep;
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_THREAD_SLEEP_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										23
									
								
								include/boost/smart_ptr/detail/sp_thread_yield.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								include/boost/smart_ptr/detail/sp_thread_yield.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_THREAD_YIELD_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_THREAD_YIELD_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// Copyright 2023 Peter Dimov
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/core/yield_primitives.hpp>
 | 
			
		||||
#include <boost/config/header_deprecated.hpp>
 | 
			
		||||
 | 
			
		||||
BOOST_HEADER_DEPRECATED( "<boost/core/yield_primitives.hpp>" )
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
using boost::core::sp_thread_yield;
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_THREAD_YIELD_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										55
									
								
								include/boost/smart_ptr/detail/sp_type_traits.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								include/boost/smart_ptr/detail/sp_type_traits.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_TYPE_TRAITS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_TYPE_TRAITS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// Copyright 2024 Peter Dimov
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <type_traits>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
// std::is_bounded_array (C++20)
 | 
			
		||||
 | 
			
		||||
template<class T> struct sp_is_bounded_array: std::false_type
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, std::size_t N> struct sp_is_bounded_array< T[N] >: std::true_type
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// std::is_unbounded_array (C++20)
 | 
			
		||||
 | 
			
		||||
template<class T> struct sp_is_unbounded_array: std::false_type
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T> struct sp_is_unbounded_array< T[] >: std::true_type
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// std::type_identity (C++20)
 | 
			
		||||
 | 
			
		||||
template<class T> struct sp_type_identity
 | 
			
		||||
{
 | 
			
		||||
    typedef T type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// boost::type_with_alignment
 | 
			
		||||
 | 
			
		||||
template<std::size_t A> struct sp_type_with_alignment
 | 
			
		||||
{
 | 
			
		||||
    struct alignas(A) type
 | 
			
		||||
    {
 | 
			
		||||
        unsigned char padding[ A ];
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_TYPE_TRAITS_HPP_INCLUDED
 | 
			
		||||
@@ -28,28 +28,27 @@
 | 
			
		||||
//  #define BOOST_DETAIL_SPINLOCK_INIT <unspecified>
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_has_sync_intrinsics.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/deprecated_macros.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_has_sync.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_SP_USE_STD_ATOMIC )
 | 
			
		||||
# if !defined( __clang__ )
 | 
			
		||||
#   include <boost/smart_ptr/detail/spinlock_std_atomic.hpp>
 | 
			
		||||
# else
 | 
			
		||||
//  Clang (at least up to 3.4) can't compile spinlock_pool when
 | 
			
		||||
//  using std::atomic, so substitute the __sync implementation instead.
 | 
			
		||||
#   include <boost/smart_ptr/detail/spinlock_sync.hpp>
 | 
			
		||||
# endif
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_std_atomic.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_USE_PTHREADS )
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_pt.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_HAS_GCC_INTRINSICS )
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_gcc_atomic.hpp>
 | 
			
		||||
 | 
			
		||||
#elif !defined( BOOST_NO_CXX11_HDR_ATOMIC )
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_std_atomic.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined(__GNUC__) && defined( __arm__ ) && !defined( __thumb__ )
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_gcc_arm.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_HAS_SYNC )
 | 
			
		||||
#elif defined( BOOST_SP_HAS_SYNC_INTRINSICS )
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_sync.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										94
									
								
								include/boost/smart_ptr/detail/spinlock_gcc_atomic.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								include/boost/smart_ptr/detail/spinlock_gcc_atomic.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,94 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ATOMIC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ATOMIC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Copyright 2008, 2020 Peter Dimov
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/yield_k.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using __atomic spinlock")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class spinlock
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    // `bool` alignment is required for Apple PPC32
 | 
			
		||||
    // https://github.com/boostorg/smart_ptr/issues/105
 | 
			
		||||
    // https://github.com/PurpleI2P/i2pd/issues/1726
 | 
			
		||||
    // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107590
 | 
			
		||||
 | 
			
		||||
    union
 | 
			
		||||
    {
 | 
			
		||||
        unsigned char v_;
 | 
			
		||||
        bool align_;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    bool try_lock()
 | 
			
		||||
    {
 | 
			
		||||
        return __atomic_test_and_set( &v_, __ATOMIC_ACQUIRE ) == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void lock()
 | 
			
		||||
    {
 | 
			
		||||
        for( unsigned k = 0; !try_lock(); ++k )
 | 
			
		||||
        {
 | 
			
		||||
            boost::detail::yield( k );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void unlock()
 | 
			
		||||
    {
 | 
			
		||||
        __atomic_clear( &v_, __ATOMIC_RELEASE );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    class scoped_lock
 | 
			
		||||
    {
 | 
			
		||||
    private:
 | 
			
		||||
 | 
			
		||||
        spinlock & sp_;
 | 
			
		||||
 | 
			
		||||
        scoped_lock( scoped_lock const & );
 | 
			
		||||
        scoped_lock & operator=( scoped_lock const & );
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        explicit scoped_lock( spinlock & sp ): sp_( sp )
 | 
			
		||||
        {
 | 
			
		||||
            sp.lock();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ~scoped_lock()
 | 
			
		||||
        {
 | 
			
		||||
            sp_.unlock();
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#define BOOST_DETAIL_SPINLOCK_INIT {{0}}
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ATOMIC_HPP_INCLUDED
 | 
			
		||||
@@ -16,7 +16,6 @@
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/yield_k.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <atomic>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
@@ -40,12 +39,12 @@ public:
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    bool try_lock() BOOST_NOEXCEPT
 | 
			
		||||
    bool try_lock() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return !v_.test_and_set( std::memory_order_acquire );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void lock() BOOST_NOEXCEPT
 | 
			
		||||
    void lock() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        for( unsigned k = 0; !try_lock(); ++k )
 | 
			
		||||
        {
 | 
			
		||||
@@ -53,7 +52,7 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void unlock() BOOST_NOEXCEPT
 | 
			
		||||
    void unlock() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        v_ .clear( std::memory_order_release );
 | 
			
		||||
    }
 | 
			
		||||
@@ -71,12 +70,12 @@ public:
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        explicit scoped_lock( spinlock & sp ) BOOST_NOEXCEPT: sp_( sp )
 | 
			
		||||
        explicit scoped_lock( spinlock & sp ) noexcept: sp_( sp )
 | 
			
		||||
        {
 | 
			
		||||
            sp.lock();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ~scoped_lock() /*BOOST_NOEXCEPT*/
 | 
			
		||||
        ~scoped_lock() /*noexcept*/
 | 
			
		||||
        {
 | 
			
		||||
            sp_.unlock();
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ class spinlock
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    int v_;
 | 
			
		||||
    unsigned char v_;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,106 +7,19 @@
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// boost/smart_ptr/detail/yield_k.hpp
 | 
			
		||||
//
 | 
			
		||||
//  yield_k.hpp
 | 
			
		||||
// Copyright 2008, 2020 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 Peter Dimov
 | 
			
		||||
// inline void boost::detail::yield( unsigned k );
 | 
			
		||||
//
 | 
			
		||||
//  void yield( unsigned k );
 | 
			
		||||
//
 | 
			
		||||
//  Typical use:
 | 
			
		||||
//
 | 
			
		||||
//  for( unsigned k = 0; !try_lock(); ++k ) yield( k );
 | 
			
		||||
//
 | 
			
		||||
//  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
 | 
			
		||||
//   Typical use:
 | 
			
		||||
//   for( unsigned k = 0; !try_lock(); ++k ) yield( k );
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
// BOOST_SMT_PAUSE
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && _MSC_VER >= 1310 && ( defined(_M_IX86) || defined(_M_X64) ) && !defined(__c2__)
 | 
			
		||||
 | 
			
		||||
extern "C" void _mm_pause();
 | 
			
		||||
 | 
			
		||||
#define BOOST_SMT_PAUSE _mm_pause();
 | 
			
		||||
 | 
			
		||||
#elif defined(__GNUC__) && ( defined(__i386__) || defined(__x86_64__) )
 | 
			
		||||
 | 
			
		||||
#define BOOST_SMT_PAUSE __asm__ __volatile__( "rep; nop" : : : "memory" );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#if defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined( __CYGWIN__ )
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_USE_WINDOWS_H )
 | 
			
		||||
# include <windows.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_USE_WINDOWS_H )
 | 
			
		||||
 | 
			
		||||
#if defined(__clang__) && defined(__x86_64__)
 | 
			
		||||
// clang x64 warns that __stdcall is ignored
 | 
			
		||||
# define BOOST_SP_STDCALL
 | 
			
		||||
#else
 | 
			
		||||
# define BOOST_SP_STDCALL __stdcall
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(__LP64__) // Cygwin 64
 | 
			
		||||
  extern "C" __declspec(dllimport) void BOOST_SP_STDCALL Sleep( unsigned int ms );
 | 
			
		||||
#else
 | 
			
		||||
  extern "C" __declspec(dllimport) void BOOST_SP_STDCALL Sleep( unsigned long ms );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#undef BOOST_SP_STDCALL
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_USE_WINDOWS_H )
 | 
			
		||||
 | 
			
		||||
inline void yield( unsigned k ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    if( k < 4 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
#if defined( BOOST_SMT_PAUSE )
 | 
			
		||||
    else if( k < 16 )
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_SMT_PAUSE
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
    else if( k < 32 )
 | 
			
		||||
    {
 | 
			
		||||
        Sleep( 0 );
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        Sleep( 1 );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_HAS_PTHREADS )
 | 
			
		||||
 | 
			
		||||
#ifndef _AIX
 | 
			
		||||
#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 <boost/core/yield_primitives.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
@@ -116,31 +29,16 @@ namespace detail
 | 
			
		||||
 | 
			
		||||
inline void yield( unsigned k )
 | 
			
		||||
{
 | 
			
		||||
    if( k < 4 )
 | 
			
		||||
    // Experiments on Windows and Fedora 32 show that a single pause,
 | 
			
		||||
    // followed by an immediate sp_thread_sleep(), is best.
 | 
			
		||||
 | 
			
		||||
    if( k & 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
#if defined( BOOST_SMT_PAUSE )
 | 
			
		||||
    else if( k < 16 )
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_SMT_PAUSE
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
    else if( k < 32 || k & 1 )
 | 
			
		||||
    {
 | 
			
		||||
        sched_yield();
 | 
			
		||||
        boost::core::sp_thread_sleep();
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        // g++ -Wextra warns on {} or {0}
 | 
			
		||||
        struct timespec rqtp = { 0, 0 };
 | 
			
		||||
 | 
			
		||||
        // POSIX says that timespec has tv_sec and tv_nsec
 | 
			
		||||
        // But it doesn't guarantee order or placement
 | 
			
		||||
 | 
			
		||||
        rqtp.tv_sec = 0;
 | 
			
		||||
        rqtp.tv_nsec = 1000;
 | 
			
		||||
 | 
			
		||||
        nanosleep( &rqtp, 0 );
 | 
			
		||||
        boost::core::sp_thread_pause();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -148,22 +46,4 @@ inline void yield( unsigned k )
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void yield( unsigned )
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,6 @@
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/ for documentation.
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/enable_shared_from_this.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
@@ -31,7 +30,7 @@ template<class T> shared_ptr<T> shared_from( T * p )
 | 
			
		||||
    return shared_ptr<T>( p->enable_shared_from_this<enable_shared_from>::shared_from_this(), p );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> weak_ptr<T> weak_from( T * p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> weak_ptr<T> weak_from( T * p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return weak_ptr<T>( p->enable_shared_from_this<enable_shared_from>::weak_from_this(), p );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -71,15 +71,12 @@ private:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
 | 
			
		||||
public:
 | 
			
		||||
#else
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    template<class Y> friend class shared_ptr;
 | 
			
		||||
    template<typename T> friend boost::shared_ptr<T> shared_from_raw(T *);
 | 
			
		||||
    template<typename T> friend boost::weak_ptr<T> weak_from_raw(T *);
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
    shared_ptr<void const volatile> shared_from_this() const
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
@@ -15,9 +15,7 @@
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/weak_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/shared_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
@@ -26,20 +24,20 @@ template<class T> class enable_shared_from_this
 | 
			
		||||
{
 | 
			
		||||
protected:
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR enable_shared_from_this() BOOST_SP_NOEXCEPT
 | 
			
		||||
    constexpr enable_shared_from_this() noexcept
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR enable_shared_from_this(enable_shared_from_this const &) BOOST_SP_NOEXCEPT
 | 
			
		||||
    constexpr enable_shared_from_this(enable_shared_from_this const &) noexcept
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    enable_shared_from_this & operator=(enable_shared_from_this const &) BOOST_SP_NOEXCEPT
 | 
			
		||||
    enable_shared_from_this & operator=(enable_shared_from_this const &) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~enable_shared_from_this() BOOST_SP_NOEXCEPT // ~weak_ptr<T> newer throws, so this call also must not throw
 | 
			
		||||
    ~enable_shared_from_this() noexcept // ~weak_ptr<T> newer throws, so this call also must not throw
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -59,12 +57,12 @@ public:
 | 
			
		||||
        return p;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_ptr<T> weak_from_this() BOOST_SP_NOEXCEPT
 | 
			
		||||
    weak_ptr<T> weak_from_this() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return weak_this_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_ptr<T const> weak_from_this() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    weak_ptr<T const> weak_from_this() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return weak_this_;
 | 
			
		||||
    }
 | 
			
		||||
@@ -72,7 +70,7 @@ public:
 | 
			
		||||
public: // actually private, but avoids compiler template friendship issues
 | 
			
		||||
 | 
			
		||||
    // Note: invoked automatically by shared_ptr; do not call
 | 
			
		||||
    template<class X, class Y> void _internal_accept_owner( shared_ptr<X> const * ppx, Y * py ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class X, class Y> void _internal_accept_owner( shared_ptr<X> const * ppx, Y * py ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        if( weak_this_.expired() )
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -13,24 +13,14 @@
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/ for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/config/workaround.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_cxx20_constexpr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_convertible.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_nullptr_t.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/config/no_tr1/functional.hpp>           // for std::less
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_IOSTREAM)
 | 
			
		||||
#if !defined(BOOST_NO_IOSFWD)
 | 
			
		||||
#include <functional>           // for std::less
 | 
			
		||||
#include <iosfwd>               // for std::basic_ostream
 | 
			
		||||
#else
 | 
			
		||||
#include <ostream>
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
@@ -60,64 +50,46 @@ public:
 | 
			
		||||
 | 
			
		||||
    typedef T element_type;
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR intrusive_ptr() BOOST_SP_NOEXCEPT : px( 0 )
 | 
			
		||||
    constexpr intrusive_ptr() noexcept : px( 0 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr( T * p, bool add_ref = true ): px( p )
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR intrusive_ptr( T * p, bool add_ref = true ): px( p )
 | 
			
		||||
    {
 | 
			
		||||
        if( px != 0 && add_ref ) intrusive_ptr_add_ref( px );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_MEMBER_TEMPLATES) || defined(BOOST_MSVC6_MEMBER_TEMPLATES)
 | 
			
		||||
 | 
			
		||||
    template<class U>
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr( intrusive_ptr<U> const & rhs, typename boost::detail::sp_enable_if_convertible<U,T>::type = boost::detail::sp_empty() )
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr( intrusive_ptr<U> const & rhs )
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR intrusive_ptr( intrusive_ptr<U> const & rhs, typename boost::detail::sp_enable_if_convertible<U,T>::type = boost::detail::sp_empty() )
 | 
			
		||||
    : px( rhs.get() )
 | 
			
		||||
    {
 | 
			
		||||
        if( px != 0 ) intrusive_ptr_add_ref( px );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr(intrusive_ptr const & rhs): px( rhs.px )
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR intrusive_ptr(intrusive_ptr const & rhs): px( rhs.px )
 | 
			
		||||
    {
 | 
			
		||||
        if( px != 0 ) intrusive_ptr_add_ref( px );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~intrusive_ptr()
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR ~intrusive_ptr()
 | 
			
		||||
    {
 | 
			
		||||
        if( px != 0 ) intrusive_ptr_release( px );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_MEMBER_TEMPLATES) || defined(BOOST_MSVC6_MEMBER_TEMPLATES)
 | 
			
		||||
 | 
			
		||||
    template<class U> intrusive_ptr & operator=(intrusive_ptr<U> const & rhs)
 | 
			
		||||
    template<class U> BOOST_SP_CXX20_CONSTEXPR intrusive_ptr & operator=(intrusive_ptr<U> const & rhs)
 | 
			
		||||
    {
 | 
			
		||||
        this_type(rhs).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Move support
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr(intrusive_ptr && rhs) BOOST_SP_NOEXCEPT : px( rhs.px )
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR intrusive_ptr(intrusive_ptr && rhs) noexcept : px( rhs.px )
 | 
			
		||||
    {
 | 
			
		||||
        rhs.px = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr & operator=(intrusive_ptr && rhs) BOOST_SP_NOEXCEPT
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR intrusive_ptr & operator=(intrusive_ptr && rhs) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type( static_cast< intrusive_ptr && >( rhs ) ).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
@@ -126,84 +98,76 @@ public:
 | 
			
		||||
    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        
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR intrusive_ptr(intrusive_ptr<U> && rhs, typename boost::detail::sp_enable_if_convertible<U,T>::type = boost::detail::sp_empty())
 | 
			
		||||
    : px( rhs.px )
 | 
			
		||||
    {
 | 
			
		||||
        rhs.px = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class U>
 | 
			
		||||
    intrusive_ptr & operator=(intrusive_ptr<U> && rhs) BOOST_SP_NOEXCEPT
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR intrusive_ptr & operator=(intrusive_ptr<U> && rhs) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type( static_cast< intrusive_ptr<U> && >( rhs ) ).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr & operator=(intrusive_ptr const & rhs)
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR intrusive_ptr & operator=(intrusive_ptr const & rhs)
 | 
			
		||||
    {
 | 
			
		||||
        this_type(rhs).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr & operator=(T * rhs)
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR intrusive_ptr & operator=(T * rhs)
 | 
			
		||||
    {
 | 
			
		||||
        this_type(rhs).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void reset()
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR void reset()
 | 
			
		||||
    {
 | 
			
		||||
        this_type().swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void reset( T * rhs )
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR void reset( T * rhs )
 | 
			
		||||
    {
 | 
			
		||||
        this_type( rhs ).swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void reset( T * rhs, bool add_ref )
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR void reset( T * rhs, bool add_ref )
 | 
			
		||||
    {
 | 
			
		||||
        this_type( rhs, add_ref ).swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T * get() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR T * get() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T * detach() BOOST_SP_NOEXCEPT
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR T * detach() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        T * ret = px;
 | 
			
		||||
        px = 0;
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T & operator*() const BOOST_SP_NOEXCEPT_WITH_ASSERT
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR T & operator*() const BOOST_SP_NOEXCEPT_WITH_ASSERT
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( px != 0 );
 | 
			
		||||
        return *px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T * operator->() const BOOST_SP_NOEXCEPT_WITH_ASSERT
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR T * operator->() const BOOST_SP_NOEXCEPT_WITH_ASSERT
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( px != 0 );
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
// implicit conversion to "bool"
 | 
			
		||||
#include <boost/smart_ptr/detail/operator_bool.hpp>
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR explicit operator bool () const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return px != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void swap(intrusive_ptr & rhs) BOOST_SP_NOEXCEPT
 | 
			
		||||
    BOOST_SP_CXX20_CONSTEXPR void swap(intrusive_ptr & rhs) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        T * tmp = px;
 | 
			
		||||
        px = rhs.px;
 | 
			
		||||
@@ -215,118 +179,101 @@ private:
 | 
			
		||||
    T * px;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator==(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> BOOST_SP_CXX20_CONSTEXPR inline bool operator==(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a.get() == b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator!=(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> BOOST_SP_CXX20_CONSTEXPR inline bool operator!=(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator==(intrusive_ptr<T> const & a, U * b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> BOOST_SP_CXX20_CONSTEXPR inline bool operator==(intrusive_ptr<T> const & a, U * b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a.get() == b;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator!=(intrusive_ptr<T> const & a, U * b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> BOOST_SP_CXX20_CONSTEXPR inline bool operator!=(intrusive_ptr<T> const & a, U * b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator==(T * a, intrusive_ptr<U> const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> BOOST_SP_CXX20_CONSTEXPR inline bool operator==(T * a, intrusive_ptr<U> const & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a == b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator!=(T * a, intrusive_ptr<U> const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> BOOST_SP_CXX20_CONSTEXPR inline bool operator!=(T * a, intrusive_ptr<U> const & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if __GNUC__ == 2 && __GNUC_MINOR__ <= 96
 | 
			
		||||
 | 
			
		||||
// Resolve the ambiguity between our op!= and the one in rel_ops
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=(intrusive_ptr<T> const & a, intrusive_ptr<T> const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( intrusive_ptr<T> const & p, boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> BOOST_SP_CXX20_CONSTEXPR inline bool operator==( intrusive_ptr<T> const & p, std::nullptr_t ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( boost::detail::sp_nullptr_t, intrusive_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> BOOST_SP_CXX20_CONSTEXPR inline bool operator==( std::nullptr_t, intrusive_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( intrusive_ptr<T> const & p, boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> BOOST_SP_CXX20_CONSTEXPR inline bool operator!=( intrusive_ptr<T> const & p, std::nullptr_t ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( boost::detail::sp_nullptr_t, intrusive_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> BOOST_SP_CXX20_CONSTEXPR inline bool operator!=( std::nullptr_t, intrusive_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator<(intrusive_ptr<T> const & a, intrusive_ptr<T> const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> BOOST_SP_CXX20_CONSTEXPR inline bool operator<(intrusive_ptr<T> const & a, intrusive_ptr<T> const & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return std::less<T *>()(a.get(), b.get());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> void swap(intrusive_ptr<T> & lhs, intrusive_ptr<T> & rhs) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> BOOST_SP_CXX20_CONSTEXPR inline void swap(intrusive_ptr<T> & lhs, intrusive_ptr<T> & rhs) noexcept
 | 
			
		||||
{
 | 
			
		||||
    lhs.swap(rhs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// mem_fn support
 | 
			
		||||
 | 
			
		||||
template<class T> T * get_pointer(intrusive_ptr<T> const & p) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> BOOST_SP_CXX20_CONSTEXPR inline T * get_pointer(intrusive_ptr<T> const & p) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// pointer casts
 | 
			
		||||
 | 
			
		||||
template<class T, class U> intrusive_ptr<T> static_pointer_cast(intrusive_ptr<U> const & p)
 | 
			
		||||
template<class T, class U> BOOST_SP_CXX20_CONSTEXPR inline intrusive_ptr<T> static_pointer_cast(intrusive_ptr<U> const & p)
 | 
			
		||||
{
 | 
			
		||||
    return static_cast<T *>(p.get());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> intrusive_ptr<T> const_pointer_cast(intrusive_ptr<U> const & p)
 | 
			
		||||
template<class T, class U> BOOST_SP_CXX20_CONSTEXPR inline intrusive_ptr<T> const_pointer_cast(intrusive_ptr<U> const & p)
 | 
			
		||||
{
 | 
			
		||||
    return const_cast<T *>(p.get());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> intrusive_ptr<T> dynamic_pointer_cast(intrusive_ptr<U> const & p)
 | 
			
		||||
template<class T, class U> BOOST_SP_CXX20_CONSTEXPR inline intrusive_ptr<T> dynamic_pointer_cast(intrusive_ptr<U> const & p)
 | 
			
		||||
{
 | 
			
		||||
    return dynamic_cast<T *>(p.get());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
template<class T, class U> intrusive_ptr<T> static_pointer_cast( intrusive_ptr<U> && p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> BOOST_SP_CXX20_CONSTEXPR inline intrusive_ptr<T> static_pointer_cast( intrusive_ptr<U> && p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return intrusive_ptr<T>( static_cast<T*>( p.detach() ), false );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> intrusive_ptr<T> const_pointer_cast( intrusive_ptr<U> && p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> BOOST_SP_CXX20_CONSTEXPR inline intrusive_ptr<T> const_pointer_cast( intrusive_ptr<U> && p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return intrusive_ptr<T>( const_cast<T*>( p.detach() ), false );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> intrusive_ptr<T> dynamic_pointer_cast( intrusive_ptr<U> && p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> BOOST_SP_CXX20_CONSTEXPR inline intrusive_ptr<T> dynamic_pointer_cast( intrusive_ptr<U> && p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    T * p2 = dynamic_cast<T*>( p.get() );
 | 
			
		||||
 | 
			
		||||
@@ -337,48 +284,19 @@ template<class T, class U> intrusive_ptr<T> dynamic_pointer_cast( intrusive_ptr<
 | 
			
		||||
    return r;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
// operator<<
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_IOSTREAM)
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_NO_TEMPLATED_IOSTREAMS) || ( defined(__GNUC__) &&  (__GNUC__ < 3) )
 | 
			
		||||
 | 
			
		||||
template<class Y> std::ostream & operator<< (std::ostream & os, intrusive_ptr<Y> const & p)
 | 
			
		||||
{
 | 
			
		||||
    os << p.get();
 | 
			
		||||
    return os;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
// in STLport's no-iostreams mode no iostream symbols can be used
 | 
			
		||||
#ifndef _STLP_NO_IOSTREAMS
 | 
			
		||||
 | 
			
		||||
# if defined(BOOST_MSVC) && BOOST_WORKAROUND(BOOST_MSVC, < 1300 && __SGI_STL_PORT)
 | 
			
		||||
// MSVC6 has problems finding std::basic_ostream through the using declaration in namespace _STL
 | 
			
		||||
using std::basic_ostream;
 | 
			
		||||
template<class E, class T, class Y> basic_ostream<E, T> & operator<< (basic_ostream<E, T> & os, intrusive_ptr<Y> const & p)
 | 
			
		||||
# else
 | 
			
		||||
template<class E, class T, class Y> std::basic_ostream<E, T> & operator<< (std::basic_ostream<E, T> & os, intrusive_ptr<Y> const & p)
 | 
			
		||||
# endif 
 | 
			
		||||
{
 | 
			
		||||
    os << p.get();
 | 
			
		||||
    return os;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // _STLP_NO_IOSTREAMS
 | 
			
		||||
 | 
			
		||||
#endif // __GNUC__ < 3
 | 
			
		||||
 | 
			
		||||
#endif // !defined(BOOST_NO_IOSTREAM)
 | 
			
		||||
 | 
			
		||||
// hash_value
 | 
			
		||||
 | 
			
		||||
template< class T > struct hash;
 | 
			
		||||
 | 
			
		||||
template< class T > std::size_t hash_value( boost::intrusive_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template< class T > std::size_t hash_value( boost::intrusive_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return boost::hash< T* >()( p.get() );
 | 
			
		||||
}
 | 
			
		||||
@@ -387,14 +305,12 @@ template< class T > std::size_t hash_value( boost::intrusive_ptr<T> const & p )
 | 
			
		||||
 | 
			
		||||
// std::hash
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
 | 
			
		||||
 | 
			
		||||
namespace std
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<class T> struct hash< ::boost::intrusive_ptr<T> >
 | 
			
		||||
{
 | 
			
		||||
    std::size_t operator()( ::boost::intrusive_ptr<T> const & p ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    std::size_t operator()( ::boost::intrusive_ptr<T> const & p ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return std::hash< T* >()( p.get() );
 | 
			
		||||
    }
 | 
			
		||||
@@ -402,6 +318,4 @@ template<class T> struct hash< ::boost::intrusive_ptr<T> >
 | 
			
		||||
 | 
			
		||||
} // namespace std
 | 
			
		||||
 | 
			
		||||
#endif // #if !defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_INTRUSIVE_PTR_HPP_INCLUDED
 | 
			
		||||
 
 | 
			
		||||
@@ -15,9 +15,8 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_INTRUSIVE_REF_COUNTER_HPP_INCLUDED_
 | 
			
		||||
#define BOOST_SMART_PTR_INTRUSIVE_REF_COUNTER_HPP_INCLUDED_
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/atomic_count.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_HAS_PRAGMA_ONCE
 | 
			
		||||
#pragma once
 | 
			
		||||
@@ -46,17 +45,17 @@ struct thread_unsafe_counter
 | 
			
		||||
{
 | 
			
		||||
    typedef unsigned int type;
 | 
			
		||||
 | 
			
		||||
    static unsigned int load(unsigned int const& counter) BOOST_SP_NOEXCEPT
 | 
			
		||||
    static unsigned int load(unsigned int const& counter) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return counter;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static void increment(unsigned int& counter) BOOST_SP_NOEXCEPT
 | 
			
		||||
    static void increment(unsigned int& counter) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        ++counter;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static unsigned int decrement(unsigned int& counter) BOOST_SP_NOEXCEPT
 | 
			
		||||
    static unsigned int decrement(unsigned int& counter) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return --counter;
 | 
			
		||||
    }
 | 
			
		||||
@@ -72,17 +71,17 @@ struct thread_safe_counter
 | 
			
		||||
{
 | 
			
		||||
    typedef boost::detail::atomic_count type;
 | 
			
		||||
 | 
			
		||||
    static unsigned int load(boost::detail::atomic_count const& counter) BOOST_SP_NOEXCEPT
 | 
			
		||||
    static unsigned int load(boost::detail::atomic_count const& counter) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast< unsigned int >(static_cast< long >(counter));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static void increment(boost::detail::atomic_count& counter) BOOST_SP_NOEXCEPT
 | 
			
		||||
    static void increment(boost::detail::atomic_count& counter) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        ++counter;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static unsigned int decrement(boost::detail::atomic_count& counter) BOOST_SP_NOEXCEPT
 | 
			
		||||
    static unsigned int decrement(boost::detail::atomic_count& counter) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast< unsigned int >(--counter);
 | 
			
		||||
    }
 | 
			
		||||
@@ -92,9 +91,9 @@ template< typename DerivedT, typename CounterPolicyT = thread_safe_counter >
 | 
			
		||||
class intrusive_ref_counter;
 | 
			
		||||
 | 
			
		||||
template< typename DerivedT, typename CounterPolicyT >
 | 
			
		||||
void intrusive_ptr_add_ref(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_SP_NOEXCEPT;
 | 
			
		||||
void intrusive_ptr_add_ref(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) noexcept;
 | 
			
		||||
template< typename DerivedT, typename CounterPolicyT >
 | 
			
		||||
void intrusive_ptr_release(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_SP_NOEXCEPT;
 | 
			
		||||
void intrusive_ptr_release(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) noexcept;
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
 * \brief A reference counter base class
 | 
			
		||||
@@ -122,7 +121,7 @@ public:
 | 
			
		||||
     *
 | 
			
		||||
     * \post <tt>use_count() == 0</tt>
 | 
			
		||||
     */
 | 
			
		||||
    intrusive_ref_counter() BOOST_SP_NOEXCEPT : m_ref_counter(0)
 | 
			
		||||
    intrusive_ref_counter() noexcept : m_ref_counter(0)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -131,7 +130,7 @@ public:
 | 
			
		||||
     *
 | 
			
		||||
     * \post <tt>use_count() == 0</tt>
 | 
			
		||||
     */
 | 
			
		||||
    intrusive_ref_counter(intrusive_ref_counter const&) BOOST_SP_NOEXCEPT : m_ref_counter(0)
 | 
			
		||||
    intrusive_ref_counter(intrusive_ref_counter const&) noexcept : m_ref_counter(0)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -140,12 +139,12 @@ public:
 | 
			
		||||
     *
 | 
			
		||||
     * \post The reference counter is not modified after assignment
 | 
			
		||||
     */
 | 
			
		||||
    intrusive_ref_counter& operator= (intrusive_ref_counter const&) BOOST_SP_NOEXCEPT { return *this; }
 | 
			
		||||
    intrusive_ref_counter& operator= (intrusive_ref_counter const&) noexcept { return *this; }
 | 
			
		||||
 | 
			
		||||
    /*!
 | 
			
		||||
     * \return The reference counter
 | 
			
		||||
     */
 | 
			
		||||
    unsigned int use_count() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    unsigned int use_count() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return CounterPolicyT::load(m_ref_counter);
 | 
			
		||||
    }
 | 
			
		||||
@@ -156,18 +155,18 @@ protected:
 | 
			
		||||
     */
 | 
			
		||||
    BOOST_DEFAULTED_FUNCTION(~intrusive_ref_counter(), {})
 | 
			
		||||
 | 
			
		||||
    friend void intrusive_ptr_add_ref< DerivedT, CounterPolicyT >(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_SP_NOEXCEPT;
 | 
			
		||||
    friend void intrusive_ptr_release< DerivedT, CounterPolicyT >(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_SP_NOEXCEPT;
 | 
			
		||||
    friend void intrusive_ptr_add_ref< DerivedT, CounterPolicyT >(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) noexcept;
 | 
			
		||||
    friend void intrusive_ptr_release< DerivedT, CounterPolicyT >(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) noexcept;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< typename DerivedT, typename CounterPolicyT >
 | 
			
		||||
inline void intrusive_ptr_add_ref(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_SP_NOEXCEPT
 | 
			
		||||
inline void intrusive_ptr_add_ref(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) noexcept
 | 
			
		||||
{
 | 
			
		||||
    CounterPolicyT::increment(p->m_ref_counter);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< typename DerivedT, typename CounterPolicyT >
 | 
			
		||||
inline void intrusive_ptr_release(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_SP_NOEXCEPT
 | 
			
		||||
inline void intrusive_ptr_release(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) noexcept
 | 
			
		||||
{
 | 
			
		||||
    if (CounterPolicyT::decrement(p->m_ref_counter) == 0)
 | 
			
		||||
        delete static_cast< const DerivedT* >(p);
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,8 @@
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/ for documentation.
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/shared_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
@@ -126,7 +128,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    // destructor
 | 
			
		||||
 | 
			
		||||
    ~local_shared_ptr() BOOST_SP_NOEXCEPT
 | 
			
		||||
    ~local_shared_ptr() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        if( pn )
 | 
			
		||||
        {
 | 
			
		||||
@@ -136,20 +138,16 @@ public:
 | 
			
		||||
 | 
			
		||||
    // constructors
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR local_shared_ptr() BOOST_SP_NOEXCEPT : px( 0 ), pn( 0 )
 | 
			
		||||
    constexpr local_shared_ptr() noexcept : px( 0 ), pn( 0 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR local_shared_ptr( boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT : px( 0 ), pn( 0 )
 | 
			
		||||
    constexpr local_shared_ptr( std::nullptr_t ) noexcept : px( 0 ), pn( 0 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // internal constructor, used by make_shared
 | 
			
		||||
    BOOST_CONSTEXPR local_shared_ptr( boost::detail::lsp_internal_constructor_tag, element_type * px_, boost::detail::local_counted_base * pn_ ) BOOST_SP_NOEXCEPT : px( px_ ), pn( pn_ )
 | 
			
		||||
    constexpr local_shared_ptr( boost::detail::lsp_internal_constructor_tag, element_type * px_, boost::detail::local_counted_base * pn_ ) noexcept : px( px_ ), pn( pn_ )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -164,29 +162,21 @@ public:
 | 
			
		||||
        boost::detail::lsp_deleter_construct( this, p, d, pn );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
    template<class D> local_shared_ptr( boost::detail::sp_nullptr_t p, D d ): px( p ), pn( 0 )
 | 
			
		||||
    template<class D> local_shared_ptr( std::nullptr_t p, D d ): px( p ), pn( 0 )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::lsp_deleter_construct( this, p, d, pn );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    template<class Y, class D, class A> local_shared_ptr( Y * p, D d, A a ): px( p ), pn( 0 )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::lsp_allocator_construct( this, p, d, a, pn );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
    template<class D, class A> local_shared_ptr( boost::detail::sp_nullptr_t p, D d, A a ): px( p ), pn( 0 )
 | 
			
		||||
    template<class D, class A> local_shared_ptr( std::nullptr_t p, D d, A a ): px( p ), pn( 0 )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::lsp_allocator_construct( this, p, d, a, pn );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // construction from shared_ptr
 | 
			
		||||
 | 
			
		||||
    template<class Y> local_shared_ptr( shared_ptr<Y> const & r,
 | 
			
		||||
@@ -201,8 +191,6 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    template<class Y> local_shared_ptr( shared_ptr<Y> && r,
 | 
			
		||||
        typename boost::detail::sp_enable_if_convertible<Y, T>::type = boost::detail::sp_empty() )
 | 
			
		||||
        : px( r.get() ), pn( 0 )
 | 
			
		||||
@@ -216,12 +204,8 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // construction from unique_ptr
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_SMART_PTR ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    template< class Y, class D >
 | 
			
		||||
    local_shared_ptr( std::unique_ptr< Y, D > && r,
 | 
			
		||||
        typename boost::detail::sp_enable_if_convertible<Y, T>::type = boost::detail::sp_empty() )
 | 
			
		||||
@@ -235,8 +219,6 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    template< class Y, class D >
 | 
			
		||||
    local_shared_ptr( boost::movelib::unique_ptr< Y, D > r ); // !
 | 
			
		||||
    //  : px( r.get() ), pn( new boost::detail::local_counted_impl( shared_ptr<T>( std::move(r) ) ) )
 | 
			
		||||
@@ -246,7 +228,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    // copy constructor
 | 
			
		||||
 | 
			
		||||
    local_shared_ptr( local_shared_ptr const & r ) BOOST_SP_NOEXCEPT : px( r.px ), pn( r.pn )
 | 
			
		||||
    local_shared_ptr( local_shared_ptr const & r ) noexcept : px( r.px ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
        if( pn )
 | 
			
		||||
        {
 | 
			
		||||
@@ -256,20 +238,16 @@ public:
 | 
			
		||||
 | 
			
		||||
    // move constructor
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    local_shared_ptr( local_shared_ptr && r ) BOOST_SP_NOEXCEPT : px( r.px ), pn( r.pn )
 | 
			
		||||
    local_shared_ptr( local_shared_ptr && r ) noexcept : px( r.px ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
        r.px = 0;
 | 
			
		||||
        r.pn = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // converting copy constructor
 | 
			
		||||
 | 
			
		||||
    template<class Y> local_shared_ptr( local_shared_ptr<Y> const & r,
 | 
			
		||||
        typename boost::detail::sp_enable_if_convertible<Y, T>::type = boost::detail::sp_empty() ) BOOST_SP_NOEXCEPT
 | 
			
		||||
        typename boost::detail::sp_enable_if_convertible<Y, T>::type = boost::detail::sp_empty() ) noexcept
 | 
			
		||||
        : px( r.px ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y, T >();
 | 
			
		||||
@@ -282,10 +260,8 @@ public:
 | 
			
		||||
 | 
			
		||||
    // converting move constructor
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    template<class Y> local_shared_ptr( local_shared_ptr<Y> && r,
 | 
			
		||||
        typename boost::detail::sp_enable_if_convertible<Y, T>::type = boost::detail::sp_empty() ) BOOST_SP_NOEXCEPT
 | 
			
		||||
        typename boost::detail::sp_enable_if_convertible<Y, T>::type = boost::detail::sp_empty() ) noexcept
 | 
			
		||||
        : px( r.px ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y, T >();
 | 
			
		||||
@@ -294,12 +270,10 @@ public:
 | 
			
		||||
        r.pn = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // aliasing
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    local_shared_ptr( local_shared_ptr<Y> const & r, element_type * p ) BOOST_SP_NOEXCEPT : px( p ), pn( r.pn )
 | 
			
		||||
    local_shared_ptr( local_shared_ptr<Y> const & r, element_type * p ) noexcept : px( p ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
        if( pn )
 | 
			
		||||
        {
 | 
			
		||||
@@ -307,60 +281,46 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    local_shared_ptr( local_shared_ptr<Y> && r, element_type * p ) BOOST_SP_NOEXCEPT : px( p ), pn( r.pn )
 | 
			
		||||
    local_shared_ptr( local_shared_ptr<Y> && r, element_type * p ) noexcept : px( p ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
        r.px = 0;
 | 
			
		||||
        r.pn = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // assignment
 | 
			
		||||
 | 
			
		||||
    local_shared_ptr & operator=( local_shared_ptr const & r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    local_shared_ptr & operator=( local_shared_ptr const & r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        local_shared_ptr( r ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> local_shared_ptr & operator=( local_shared_ptr<Y> const & r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class Y> local_shared_ptr & operator=( local_shared_ptr<Y> const & r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        local_shared_ptr( r ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    local_shared_ptr & operator=( local_shared_ptr && r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    local_shared_ptr & operator=( local_shared_ptr && r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        local_shared_ptr( std::move( r ) ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    local_shared_ptr & operator=( local_shared_ptr<Y> && r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    local_shared_ptr & operator=( local_shared_ptr<Y> && r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        local_shared_ptr( std::move( r ) ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
    local_shared_ptr & operator=( boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    local_shared_ptr & operator=( std::nullptr_t ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        local_shared_ptr().swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_SMART_PTR ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    template<class Y, class D>
 | 
			
		||||
    local_shared_ptr & operator=( std::unique_ptr<Y, D> && r )
 | 
			
		||||
    {
 | 
			
		||||
@@ -368,14 +328,12 @@ public:
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    template<class Y, class D>
 | 
			
		||||
    local_shared_ptr & operator=( boost::movelib::unique_ptr<Y, D> r ); // !
 | 
			
		||||
 | 
			
		||||
    // reset
 | 
			
		||||
 | 
			
		||||
    void reset() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void reset() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        local_shared_ptr().swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
@@ -395,28 +353,24 @@ public:
 | 
			
		||||
        local_shared_ptr( p, d, a ).swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> void reset( local_shared_ptr<Y> const & r, element_type * p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class Y> void reset( local_shared_ptr<Y> const & r, element_type * p ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        local_shared_ptr( r, p ).swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    template<class Y> void reset( local_shared_ptr<Y> && r, element_type * p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class Y> void reset( local_shared_ptr<Y> && r, element_type * p ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        local_shared_ptr( std::move( r ), p ).swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // accessors
 | 
			
		||||
 | 
			
		||||
    typename boost::detail::sp_dereference< T >::type operator* () const BOOST_SP_NOEXCEPT
 | 
			
		||||
    typename boost::detail::sp_dereference< T >::type operator* () const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return *px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    typename boost::detail::sp_member_access< T >::type operator-> () const BOOST_SP_NOEXCEPT
 | 
			
		||||
    typename boost::detail::sp_member_access< T >::type operator-> () const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
@@ -429,26 +383,24 @@ public:
 | 
			
		||||
        return static_cast< typename boost::detail::sp_array_access< T >::type >( px[ i ] );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    element_type * get() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    element_type * get() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // implicit conversion to "bool"
 | 
			
		||||
#include <boost/smart_ptr/detail/operator_bool.hpp>
 | 
			
		||||
    explicit operator bool () const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return px != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long local_use_count() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    long local_use_count() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn? pn->local_use_count(): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // conversions to shared_ptr, weak_ptr
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && !defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS)
 | 
			
		||||
    template<class Y, class E = typename boost::detail::sp_enable_if_convertible<T,Y>::type> operator shared_ptr<Y>() const BOOST_SP_NOEXCEPT
 | 
			
		||||
#else
 | 
			
		||||
    template<class Y> operator shared_ptr<Y>() const BOOST_SP_NOEXCEPT
 | 
			
		||||
#endif
 | 
			
		||||
    template<class Y, class E = typename boost::detail::sp_enable_if_convertible<T,Y>::type> operator shared_ptr<Y>() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible<T, Y>();
 | 
			
		||||
 | 
			
		||||
@@ -462,11 +414,7 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && !defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS)
 | 
			
		||||
    template<class Y, class E = typename boost::detail::sp_enable_if_convertible<T,Y>::type> operator weak_ptr<Y>() const BOOST_SP_NOEXCEPT
 | 
			
		||||
#else
 | 
			
		||||
    template<class Y> operator weak_ptr<Y>() const BOOST_SP_NOEXCEPT
 | 
			
		||||
#endif
 | 
			
		||||
    template<class Y, class E = typename boost::detail::sp_enable_if_convertible<T,Y>::type> operator weak_ptr<Y>() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible<T, Y>();
 | 
			
		||||
 | 
			
		||||
@@ -482,7 +430,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    // swap
 | 
			
		||||
 | 
			
		||||
    void swap( local_shared_ptr & r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void swap( local_shared_ptr & r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        std::swap( px, r.px );
 | 
			
		||||
        std::swap( pn, r.pn );
 | 
			
		||||
@@ -490,84 +438,80 @@ public:
 | 
			
		||||
 | 
			
		||||
    // owner_before
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_before( local_shared_ptr<Y> const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class Y> bool owner_before( local_shared_ptr<Y> const & r ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return std::less< boost::detail::local_counted_base* >()( pn, r.pn );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // owner_equals
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_equals( local_shared_ptr<Y> const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class Y> bool owner_equals( local_shared_ptr<Y> const & r ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn == r.pn;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator==( local_shared_ptr<T> const & a, local_shared_ptr<U> const & b ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> inline bool operator==( local_shared_ptr<T> const & a, local_shared_ptr<U> const & b ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a.get() == b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator!=( local_shared_ptr<T> const & a, local_shared_ptr<U> const & b ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> inline bool operator!=( local_shared_ptr<T> const & a, local_shared_ptr<U> const & b ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( local_shared_ptr<T> const & p, boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator==( local_shared_ptr<T> const & p, std::nullptr_t ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( boost::detail::sp_nullptr_t, local_shared_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator==( std::nullptr_t, local_shared_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( local_shared_ptr<T> const & p, boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator!=( local_shared_ptr<T> const & p, std::nullptr_t ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( boost::detail::sp_nullptr_t, local_shared_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator!=( std::nullptr_t, local_shared_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator==( local_shared_ptr<T> const & a, shared_ptr<U> const & b ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> inline bool operator==( local_shared_ptr<T> const & a, shared_ptr<U> const & b ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a.get() == b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator!=( local_shared_ptr<T> const & a, shared_ptr<U> const & b ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> inline bool operator!=( local_shared_ptr<T> const & a, shared_ptr<U> const & b ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator==( shared_ptr<T> const & a, local_shared_ptr<U> const & b ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> inline bool operator==( shared_ptr<T> const & a, local_shared_ptr<U> const & b ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a.get() == b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator!=( shared_ptr<T> const & a, local_shared_ptr<U> const & b ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> inline bool operator!=( shared_ptr<T> const & a, local_shared_ptr<U> const & b ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator<(local_shared_ptr<T> const & a, local_shared_ptr<U> const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> inline bool operator<(local_shared_ptr<T> const & a, local_shared_ptr<U> const & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a.owner_before( b );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline void swap( local_shared_ptr<T> & a, local_shared_ptr<T> & b ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline void swap( local_shared_ptr<T> & a, local_shared_ptr<T> & b ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    a.swap( b );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> local_shared_ptr<T> static_pointer_cast( local_shared_ptr<U> const & r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> local_shared_ptr<T> static_pointer_cast( local_shared_ptr<U> const & r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) static_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -577,7 +521,7 @@ template<class T, class U> local_shared_ptr<T> static_pointer_cast( local_shared
 | 
			
		||||
    return local_shared_ptr<T>( r, p );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> local_shared_ptr<T> const_pointer_cast( local_shared_ptr<U> const & r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> local_shared_ptr<T> const_pointer_cast( local_shared_ptr<U> const & r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) const_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -587,7 +531,7 @@ template<class T, class U> local_shared_ptr<T> const_pointer_cast( local_shared_
 | 
			
		||||
    return local_shared_ptr<T>( r, p );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> local_shared_ptr<T> dynamic_pointer_cast( local_shared_ptr<U> const & r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> local_shared_ptr<T> dynamic_pointer_cast( local_shared_ptr<U> const & r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) dynamic_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -597,7 +541,7 @@ template<class T, class U> local_shared_ptr<T> dynamic_pointer_cast( local_share
 | 
			
		||||
    return p? local_shared_ptr<T>( r, p ): local_shared_ptr<T>();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> local_shared_ptr<T> reinterpret_pointer_cast( local_shared_ptr<U> const & r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> local_shared_ptr<T> reinterpret_pointer_cast( local_shared_ptr<U> const & r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) reinterpret_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -607,9 +551,7 @@ template<class T, class U> local_shared_ptr<T> reinterpret_pointer_cast( local_s
 | 
			
		||||
    return local_shared_ptr<T>( r, p );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
template<class T, class U> local_shared_ptr<T> static_pointer_cast( local_shared_ptr<U> && r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> local_shared_ptr<T> static_pointer_cast( local_shared_ptr<U> && r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) static_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -619,7 +561,7 @@ template<class T, class U> local_shared_ptr<T> static_pointer_cast( local_shared
 | 
			
		||||
    return local_shared_ptr<T>( std::move(r), p );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> local_shared_ptr<T> const_pointer_cast( local_shared_ptr<U> && r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> local_shared_ptr<T> const_pointer_cast( local_shared_ptr<U> && r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) const_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -629,7 +571,7 @@ template<class T, class U> local_shared_ptr<T> const_pointer_cast( local_shared_
 | 
			
		||||
    return local_shared_ptr<T>( std::move(r), p );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> local_shared_ptr<T> dynamic_pointer_cast( local_shared_ptr<U> && r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> local_shared_ptr<T> dynamic_pointer_cast( local_shared_ptr<U> && r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) dynamic_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -639,7 +581,7 @@ template<class T, class U> local_shared_ptr<T> dynamic_pointer_cast( local_share
 | 
			
		||||
    return p? local_shared_ptr<T>( std::move(r), p ): local_shared_ptr<T>();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> local_shared_ptr<T> reinterpret_pointer_cast( local_shared_ptr<U> && r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> local_shared_ptr<T> reinterpret_pointer_cast( local_shared_ptr<U> && r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) reinterpret_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -649,30 +591,24 @@ template<class T, class U> local_shared_ptr<T> reinterpret_pointer_cast( local_s
 | 
			
		||||
    return local_shared_ptr<T>( std::move(r), p );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
// get_pointer() enables boost::mem_fn to recognize local_shared_ptr
 | 
			
		||||
 | 
			
		||||
template<class T> inline typename local_shared_ptr<T>::element_type * get_pointer( local_shared_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline typename local_shared_ptr<T>::element_type * get_pointer( local_shared_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// operator<<
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_IOSTREAM)
 | 
			
		||||
 | 
			
		||||
template<class E, class T, class Y> std::basic_ostream<E, T> & operator<< ( std::basic_ostream<E, T> & os, local_shared_ptr<Y> const & p )
 | 
			
		||||
{
 | 
			
		||||
    os << p.get();
 | 
			
		||||
    return os;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // !defined(BOOST_NO_IOSTREAM)
 | 
			
		||||
 | 
			
		||||
// get_deleter
 | 
			
		||||
 | 
			
		||||
template<class D, class T> D * get_deleter( local_shared_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class D, class T> D * get_deleter( local_shared_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return get_deleter<D>( shared_ptr<T>( p ) );
 | 
			
		||||
}
 | 
			
		||||
@@ -681,7 +617,7 @@ template<class D, class T> D * get_deleter( local_shared_ptr<T> const & p ) BOOS
 | 
			
		||||
 | 
			
		||||
template< class T > struct hash;
 | 
			
		||||
 | 
			
		||||
template< class T > std::size_t hash_value( local_shared_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template< class T > std::size_t hash_value( local_shared_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return boost::hash< typename local_shared_ptr<T>::element_type* >()( p.get() );
 | 
			
		||||
}
 | 
			
		||||
@@ -690,14 +626,12 @@ template< class T > std::size_t hash_value( local_shared_ptr<T> const & p ) BOOS
 | 
			
		||||
 | 
			
		||||
// std::hash
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
 | 
			
		||||
 | 
			
		||||
namespace std
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<class T> struct hash< ::boost::local_shared_ptr<T> >
 | 
			
		||||
{
 | 
			
		||||
    std::size_t operator()( ::boost::local_shared_ptr<T> const & p ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    std::size_t operator()( ::boost::local_shared_ptr<T> const & p ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return std::hash< typename ::boost::local_shared_ptr<T>::element_type* >()( p.get() );
 | 
			
		||||
    }
 | 
			
		||||
@@ -705,6 +639,4 @@ template<class T> struct hash< ::boost::local_shared_ptr<T> >
 | 
			
		||||
 | 
			
		||||
} // namespace std
 | 
			
		||||
 | 
			
		||||
#endif // #if !defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_LOCAL_SHARED_PTR_HPP_INCLUDED
 | 
			
		||||
 
 | 
			
		||||
@@ -11,11 +11,13 @@ Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
 | 
			
		||||
#include <boost/core/default_allocator.hpp>
 | 
			
		||||
#include <boost/smart_ptr/allocate_local_shared_array.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_type_traits.hpp>
 | 
			
		||||
#include <type_traits>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename enable_if_<is_bounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_bounded_array<T>::value,
 | 
			
		||||
    local_shared_ptr<T> >::type
 | 
			
		||||
make_local_shared()
 | 
			
		||||
{
 | 
			
		||||
@@ -24,16 +26,16 @@ make_local_shared()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename enable_if_<is_bounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_bounded_array<T>::value,
 | 
			
		||||
    local_shared_ptr<T> >::type
 | 
			
		||||
make_local_shared(const typename remove_extent<T>::type& value)
 | 
			
		||||
make_local_shared(const typename std::remove_extent<T>::type& value)
 | 
			
		||||
{
 | 
			
		||||
    return boost::allocate_local_shared<T>(boost::default_allocator<typename
 | 
			
		||||
        detail::sp_array_element<T>::type>(), value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_unbounded_array<T>::value,
 | 
			
		||||
    local_shared_ptr<T> >::type
 | 
			
		||||
make_local_shared(std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
@@ -42,17 +44,17 @@ make_local_shared(std::size_t size)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_unbounded_array<T>::value,
 | 
			
		||||
    local_shared_ptr<T> >::type
 | 
			
		||||
make_local_shared(std::size_t size,
 | 
			
		||||
    const typename remove_extent<T>::type& value)
 | 
			
		||||
    const typename std::remove_extent<T>::type& value)
 | 
			
		||||
{
 | 
			
		||||
    return boost::allocate_local_shared<T>(boost::default_allocator<typename
 | 
			
		||||
        detail::sp_array_element<T>::type>(), size, value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename enable_if_<is_bounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_bounded_array<T>::value,
 | 
			
		||||
    local_shared_ptr<T> >::type
 | 
			
		||||
make_local_shared_noinit()
 | 
			
		||||
{
 | 
			
		||||
@@ -61,7 +63,7 @@ make_local_shared_noinit()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_unbounded_array<T>::value,
 | 
			
		||||
    local_shared_ptr<T> >::type
 | 
			
		||||
make_local_shared_noinit(std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -13,8 +13,8 @@
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/local_shared_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/make_shared.hpp>
 | 
			
		||||
#include <boost/type_traits/remove_const.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <type_traits>
 | 
			
		||||
#include <utility>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
@@ -45,7 +45,7 @@ template<class T, class A> class lsp_ms_deleter: public local_counted_impl_em
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    typedef typename sp_aligned_storage<sizeof(T), ::boost::alignment_of<T>::value>::type storage_type;
 | 
			
		||||
    typedef typename sp_aligned_storage<sizeof(T), std::alignment_of<T>::value>::type storage_type;
 | 
			
		||||
 | 
			
		||||
    storage_type storage_;
 | 
			
		||||
    A a_;
 | 
			
		||||
@@ -53,57 +53,49 @@ private:
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    void destroy() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void destroy() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        if( initialized_ )
 | 
			
		||||
        {
 | 
			
		||||
            T * p = reinterpret_cast< T* >( storage_.data_ );
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
 | 
			
		||||
 | 
			
		||||
            std::allocator_traits<A>::destroy( a_, p );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
            p->~T();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
            initialized_ = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit lsp_ms_deleter( A const & a ) BOOST_SP_NOEXCEPT : a_( a ), initialized_( false )
 | 
			
		||||
    explicit lsp_ms_deleter( A const & a ) noexcept : a_( a ), initialized_( false )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // optimization: do not copy storage_
 | 
			
		||||
    lsp_ms_deleter( lsp_ms_deleter const & r ) BOOST_SP_NOEXCEPT : a_( r.a_), initialized_( false )
 | 
			
		||||
    lsp_ms_deleter( lsp_ms_deleter const & r ) noexcept : a_( r.a_), initialized_( false )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~lsp_ms_deleter() BOOST_SP_NOEXCEPT
 | 
			
		||||
    ~lsp_ms_deleter() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        destroy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void operator()( T * ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void operator()( T * ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        destroy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static void operator_fn( T* ) BOOST_SP_NOEXCEPT // operator() can't be static
 | 
			
		||||
    static void operator_fn( T* ) noexcept // operator() can't be static
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * address() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * address() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return storage_.data_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void set_initialized() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void set_initialized() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        initialized_ = true;
 | 
			
		||||
    }
 | 
			
		||||
@@ -113,16 +105,8 @@ public:
 | 
			
		||||
 | 
			
		||||
template<class T, class A, class... Args> typename boost::detail::lsp_if_not_array<T>::type allocate_local_shared( A const & a, Args&&... args )
 | 
			
		||||
{
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
 | 
			
		||||
 | 
			
		||||
    typedef typename std::allocator_traits<A>::template rebind_alloc<T> A2;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    typedef typename A::template rebind<T>::other A2;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    A2 a2( a );
 | 
			
		||||
 | 
			
		||||
    typedef boost::detail::lsp_ms_deleter<T, A2> D;
 | 
			
		||||
@@ -132,16 +116,8 @@ template<class T, class A, class... Args> typename boost::detail::lsp_if_not_arr
 | 
			
		||||
    D * pd = static_cast< D* >( pt._internal_get_untyped_deleter() );
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
 | 
			
		||||
 | 
			
		||||
    std::allocator_traits<A2>::construct( a2, static_cast< T* >( pv ), std::forward<Args>( args )... );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T( std::forward<Args>( args )... );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
@@ -154,16 +130,8 @@ template<class T, class A, class... Args> typename boost::detail::lsp_if_not_arr
 | 
			
		||||
 | 
			
		||||
template<class T, class A> typename boost::detail::lsp_if_not_array<T>::type allocate_local_shared_noinit( A const & a )
 | 
			
		||||
{
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
 | 
			
		||||
 | 
			
		||||
    typedef typename std::allocator_traits<A>::template rebind_alloc<T> A2;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    typedef typename A::template rebind<T>::other A2;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    A2 a2( a );
 | 
			
		||||
 | 
			
		||||
    typedef boost::detail::lsp_ms_deleter< T, std::allocator<T> > D;
 | 
			
		||||
@@ -187,13 +155,13 @@ template<class T, class A> typename boost::detail::lsp_if_not_array<T>::type all
 | 
			
		||||
 | 
			
		||||
template<class T, class... Args> typename boost::detail::lsp_if_not_array<T>::type make_local_shared( Args&&... args )
 | 
			
		||||
{
 | 
			
		||||
    typedef typename boost::remove_const<T>::type T2;
 | 
			
		||||
    typedef typename std::remove_const<T>::type T2;
 | 
			
		||||
    return boost::allocate_local_shared<T2>( std::allocator<T2>(), std::forward<Args>(args)... );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> typename boost::detail::lsp_if_not_array<T>::type make_local_shared_noinit()
 | 
			
		||||
{
 | 
			
		||||
    typedef typename boost::remove_const<T>::type T2;
 | 
			
		||||
    typedef typename std::remove_const<T>::type T2;
 | 
			
		||||
    return boost::allocate_shared_noinit<T2>( std::allocator<T2>() );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -12,10 +12,7 @@
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/ for documentation.
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/make_shared_object.hpp>
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) && !defined( BOOST_NO_SFINAE )
 | 
			
		||||
# include <boost/smart_ptr/make_shared_array.hpp>
 | 
			
		||||
# include <boost/smart_ptr/allocate_shared_array.hpp>
 | 
			
		||||
#endif
 | 
			
		||||
#include <boost/smart_ptr/make_shared_array.hpp>
 | 
			
		||||
#include <boost/smart_ptr/allocate_shared_array.hpp>
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
 | 
			
		||||
 
 | 
			
		||||
@@ -10,11 +10,13 @@ Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
 | 
			
		||||
#include <boost/core/default_allocator.hpp>
 | 
			
		||||
#include <boost/smart_ptr/allocate_shared_array.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_type_traits.hpp>
 | 
			
		||||
#include <type_traits>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename enable_if_<is_bounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_bounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
make_shared()
 | 
			
		||||
{
 | 
			
		||||
    return boost::allocate_shared<T>(boost::default_allocator<typename
 | 
			
		||||
@@ -22,15 +24,15 @@ make_shared()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename enable_if_<is_bounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
make_shared(const typename remove_extent<T>::type& value)
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_bounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
make_shared(const typename std::remove_extent<T>::type& value)
 | 
			
		||||
{
 | 
			
		||||
    return boost::allocate_shared<T>(boost::default_allocator<typename
 | 
			
		||||
        detail::sp_array_element<T>::type>(), value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_unbounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
make_shared(std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
    return boost::allocate_shared<T>(boost::default_allocator<typename
 | 
			
		||||
@@ -38,15 +40,15 @@ make_shared(std::size_t size)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
make_shared(std::size_t size, const typename remove_extent<T>::type& value)
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_unbounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
make_shared(std::size_t size, const typename std::remove_extent<T>::type& value)
 | 
			
		||||
{
 | 
			
		||||
    return boost::allocate_shared<T>(boost::default_allocator<typename
 | 
			
		||||
        detail::sp_array_element<T>::type>(), size, value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename enable_if_<is_bounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_bounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
make_shared_noinit()
 | 
			
		||||
{
 | 
			
		||||
    return boost::allocate_shared_noinit<T>(boost::default_allocator<typename
 | 
			
		||||
@@ -54,7 +56,7 @@ make_shared_noinit()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_unbounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
make_shared_noinit(std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
    return boost::allocate_shared_noinit<T>(boost::default_allocator<typename
 | 
			
		||||
 
 | 
			
		||||
@@ -11,20 +11,16 @@
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/ for documentation.
 | 
			
		||||
 | 
			
		||||
#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/detail/sp_forward.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <boost/type_traits/type_with_alignment.hpp>
 | 
			
		||||
#include <boost/type_traits/alignment_of.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_type_traits.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <utility>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
#include <new>
 | 
			
		||||
#include <type_traits>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -33,7 +29,7 @@ template< std::size_t N, std::size_t A > struct sp_aligned_storage
 | 
			
		||||
    union type
 | 
			
		||||
    {
 | 
			
		||||
        char data_[ N ];
 | 
			
		||||
        typename boost::type_with_alignment< A >::type align_;
 | 
			
		||||
        typename sp_type_with_alignment< A >::type align_;
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -41,14 +37,14 @@ template< class T > class sp_ms_deleter
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type;
 | 
			
		||||
    typedef typename sp_aligned_storage< sizeof( T ), std::alignment_of< T >::value >::type storage_type;
 | 
			
		||||
 | 
			
		||||
    bool initialized_;
 | 
			
		||||
    storage_type storage_;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    void destroy() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void destroy() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        if( initialized_ )
 | 
			
		||||
        {
 | 
			
		||||
@@ -70,39 +66,39 @@ private:
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_ms_deleter() BOOST_SP_NOEXCEPT : initialized_( false )
 | 
			
		||||
    sp_ms_deleter() noexcept : initialized_( false )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class A> explicit sp_ms_deleter( A const & ) BOOST_SP_NOEXCEPT : initialized_( false )
 | 
			
		||||
    template<class A> explicit sp_ms_deleter( A const & ) noexcept : initialized_( false )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // optimization: do not copy storage_
 | 
			
		||||
    sp_ms_deleter( sp_ms_deleter const & ) BOOST_SP_NOEXCEPT : initialized_( false )
 | 
			
		||||
    sp_ms_deleter( sp_ms_deleter const & ) noexcept : initialized_( false )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~sp_ms_deleter() BOOST_SP_NOEXCEPT
 | 
			
		||||
    ~sp_ms_deleter() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        destroy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void operator()( T * ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void operator()( T * ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        destroy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static void operator_fn( T* ) BOOST_SP_NOEXCEPT // operator() can't be static
 | 
			
		||||
    static void operator_fn( T* ) noexcept // operator() can't be static
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * address() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * address() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return storage_.data_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void set_initialized() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void set_initialized() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        initialized_ = true;
 | 
			
		||||
    }
 | 
			
		||||
@@ -112,7 +108,7 @@ template< class T, class A > class sp_as_deleter
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type;
 | 
			
		||||
    typedef typename sp_aligned_storage< sizeof( T ), std::alignment_of< T >::value >::type storage_type;
 | 
			
		||||
 | 
			
		||||
    storage_type storage_;
 | 
			
		||||
    A a_;
 | 
			
		||||
@@ -120,57 +116,49 @@ private:
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    void destroy() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void destroy() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        if( initialized_ )
 | 
			
		||||
        {
 | 
			
		||||
            T * p = reinterpret_cast< T* >( storage_.data_ );
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
 | 
			
		||||
 | 
			
		||||
            std::allocator_traits<A>::destroy( a_, p );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
            p->~T();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
            initialized_ = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_as_deleter( A const & a ) BOOST_SP_NOEXCEPT : a_( a ), initialized_( false )
 | 
			
		||||
    sp_as_deleter( A const & a ) noexcept : a_( a ), initialized_( false )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // optimization: do not copy storage_
 | 
			
		||||
    sp_as_deleter( sp_as_deleter const & r ) BOOST_SP_NOEXCEPT : a_( r.a_), initialized_( false )
 | 
			
		||||
    sp_as_deleter( sp_as_deleter const & r ) noexcept : a_( r.a_), initialized_( false )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~sp_as_deleter() BOOST_SP_NOEXCEPT
 | 
			
		||||
    ~sp_as_deleter() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        destroy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void operator()( T * ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void operator()( T * ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        destroy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static void operator_fn( T* ) BOOST_SP_NOEXCEPT // operator() can't be static
 | 
			
		||||
    static void operator_fn( T* ) noexcept // operator() can't be static
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * address() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * address() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return storage_.data_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void set_initialized() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void set_initialized() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        initialized_ = true;
 | 
			
		||||
    }
 | 
			
		||||
@@ -181,29 +169,17 @@ template< class T > struct sp_if_not_array
 | 
			
		||||
    typedef boost::shared_ptr< T > type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
template< class T > struct sp_if_not_array< T[] >
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_BORLANDC ) || !BOOST_WORKAROUND( BOOST_BORLANDC, < 0x600 )
 | 
			
		||||
 | 
			
		||||
template< class T, std::size_t N > struct sp_if_not_array< T[N] >
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
			
		||||
# define BOOST_SP_MSD( T ) boost::detail::sp_inplace_tag< boost::detail::sp_ms_deleter< T > >()
 | 
			
		||||
#else
 | 
			
		||||
# define BOOST_SP_MSD( T ) boost::detail::sp_ms_deleter< T >()
 | 
			
		||||
#endif
 | 
			
		||||
#define BOOST_SP_MSD( T ) boost::detail::sp_inplace_tag< boost::detail::sp_ms_deleter< T > >()
 | 
			
		||||
 | 
			
		||||
// _noinit versions
 | 
			
		||||
 | 
			
		||||
@@ -241,9 +217,7 @@ template< class T, class A > typename boost::detail::sp_if_not_array< T >::type
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
// Variadic templates, rvalue reference
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
template< class T, class... Args > typename boost::detail::sp_if_not_array< T >::type make_shared( Args && ... args )
 | 
			
		||||
{
 | 
			
		||||
@@ -253,7 +227,7 @@ template< class T, class... Args > typename boost::detail::sp_if_not_array< T >:
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T( boost::detail::sp_forward<Args>( args )... );
 | 
			
		||||
    ::new( pv ) T( std::forward<Args>( args )... );
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
@@ -264,8 +238,6 @@ template< class T, class... Args > typename boost::detail::sp_if_not_array< T >:
 | 
			
		||||
 | 
			
		||||
template< class T, class A, class... Args > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, Args && ... args )
 | 
			
		||||
{
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
 | 
			
		||||
 | 
			
		||||
    typedef typename std::allocator_traits<A>::template rebind_alloc<T> A2;
 | 
			
		||||
    A2 a2( a );
 | 
			
		||||
 | 
			
		||||
@@ -273,26 +245,10 @@ template< class T, class A, class... Args > typename boost::detail::sp_if_not_ar
 | 
			
		||||
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_inplace_tag<D>(), a2 );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    typedef boost::detail::sp_ms_deleter< T > D;
 | 
			
		||||
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_inplace_tag<D>(), a );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    D * pd = static_cast< D* >( pt._internal_get_untyped_deleter() );
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
 | 
			
		||||
 | 
			
		||||
    std::allocator_traits<A2>::construct( a2, static_cast< T* >( pv ), boost::detail::sp_forward<Args>( args )... );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T( boost::detail::sp_forward<Args>( args )... );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    std::allocator_traits<A2>::construct( a2, static_cast< T* >( pv ), std::forward<Args>( args )... );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
@@ -302,498 +258,6 @@ template< class T, class A, class... Args > typename boost::detail::sp_if_not_ar
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
// Common zero-argument versions
 | 
			
		||||
 | 
			
		||||
template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared()
 | 
			
		||||
{
 | 
			
		||||
    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();
 | 
			
		||||
    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 > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a )
 | 
			
		||||
{
 | 
			
		||||
    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();
 | 
			
		||||
    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 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// C++03 version
 | 
			
		||||
 | 
			
		||||
template< class T, class 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::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::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, BOOST_FWD_REF(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::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( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(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::forward<A1>( a1 ),
 | 
			
		||||
        boost::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, 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::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::forward<A1>( a1 ),
 | 
			
		||||
        boost::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( 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::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::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::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, 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::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::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::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( 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::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::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 ),
 | 
			
		||||
        boost::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, 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::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::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 ),
 | 
			
		||||
        boost::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( 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::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::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 ),
 | 
			
		||||
        boost::forward<A4>( a4 ),
 | 
			
		||||
        boost::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, 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::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::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 ),
 | 
			
		||||
        boost::forward<A4>( a4 ),
 | 
			
		||||
        boost::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( 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::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::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();
 | 
			
		||||
 | 
			
		||||
    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, 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::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::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();
 | 
			
		||||
 | 
			
		||||
    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( 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::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::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();
 | 
			
		||||
 | 
			
		||||
    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, 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::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::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();
 | 
			
		||||
 | 
			
		||||
    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( 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::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::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();
 | 
			
		||||
 | 
			
		||||
    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, 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::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::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();
 | 
			
		||||
 | 
			
		||||
    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( 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::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::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();
 | 
			
		||||
 | 
			
		||||
    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, 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::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::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();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
#undef BOOST_SP_MSD
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 
 | 
			
		||||
@@ -8,60 +8,55 @@ Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
#ifndef BOOST_SMART_PTR_MAKE_UNIQUE_HPP
 | 
			
		||||
#define BOOST_SMART_PTR_MAKE_UNIQUE_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/type_traits/enable_if.hpp>
 | 
			
		||||
#include <boost/type_traits/is_array.hpp>
 | 
			
		||||
#include <boost/type_traits/is_unbounded_array.hpp>
 | 
			
		||||
#include <boost/type_traits/remove_extent.hpp>
 | 
			
		||||
#include <boost/type_traits/remove_reference.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_type_traits.hpp>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <type_traits>
 | 
			
		||||
#include <utility>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename enable_if_<!is_array<T>::value, std::unique_ptr<T> >::type
 | 
			
		||||
inline typename std::enable_if<!std::is_array<T>::value, std::unique_ptr<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 enable_if_<!is_array<T>::value, std::unique_ptr<T> >::type
 | 
			
		||||
inline typename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T> >::type
 | 
			
		||||
make_unique(Args&&... args)
 | 
			
		||||
{
 | 
			
		||||
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename enable_if_<!is_array<T>::value, std::unique_ptr<T> >::type
 | 
			
		||||
make_unique(typename remove_reference<T>::type&& value)
 | 
			
		||||
inline typename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T> >::type
 | 
			
		||||
make_unique(typename std::remove_reference<T>::type&& value)
 | 
			
		||||
{
 | 
			
		||||
    return std::unique_ptr<T>(new T(std::move(value)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename enable_if_<!is_array<T>::value, std::unique_ptr<T> >::type
 | 
			
		||||
inline typename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T> >::type
 | 
			
		||||
make_unique_noinit()
 | 
			
		||||
{
 | 
			
		||||
    return std::unique_ptr<T>(new T);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_unbounded_array<T>::value,
 | 
			
		||||
    std::unique_ptr<T> >::type
 | 
			
		||||
make_unique(std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
    return std::unique_ptr<T>(new typename remove_extent<T>::type[size]());
 | 
			
		||||
    return std::unique_ptr<T>(new typename std::remove_extent<T>::type[size]());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value,
 | 
			
		||||
inline typename std::enable_if<detail::sp_is_unbounded_array<T>::value,
 | 
			
		||||
    std::unique_ptr<T> >::type
 | 
			
		||||
make_unique_noinit(std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
    return std::unique_ptr<T>(new typename remove_extent<T>::type[size]);
 | 
			
		||||
    return std::unique_ptr<T>(new typename std::remove_extent<T>::type[size]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} /* boost */
 | 
			
		||||
 
 | 
			
		||||
@@ -5,8 +5,6 @@
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -16,7 +14,7 @@ template<class T = void> struct owner_equal_to
 | 
			
		||||
    typedef T first_argument_type;
 | 
			
		||||
    typedef T second_argument_type;
 | 
			
		||||
 | 
			
		||||
    template<class U, class V> bool operator()( U const & u, V const & v ) const BOOST_NOEXCEPT
 | 
			
		||||
    template<class U, class V> bool operator()( U const & u, V const & v ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return u.owner_equals( v );
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
@@ -16,7 +15,7 @@ template<class T> struct owner_hash
 | 
			
		||||
    typedef std::size_t result_type;
 | 
			
		||||
    typedef T argument_type;
 | 
			
		||||
 | 
			
		||||
    std::size_t operator()( T const & t ) const BOOST_NOEXCEPT
 | 
			
		||||
    std::size_t operator()( T const & t ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return t.owner_hash_value();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -14,8 +14,6 @@
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/ for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -25,7 +23,7 @@ template<class T = void> struct owner_less
 | 
			
		||||
    typedef T first_argument_type;
 | 
			
		||||
    typedef T second_argument_type;
 | 
			
		||||
 | 
			
		||||
    template<class U, class V> bool operator()( U const & u, V const & v ) const BOOST_NOEXCEPT
 | 
			
		||||
    template<class U, class V> bool operator()( U const & u, V const & v ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return u.owner_before( v );
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -10,12 +10,11 @@
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/ for documentation.
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/checked_delete.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_nullptr_t.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/deprecated_macros.hpp>
 | 
			
		||||
#include <boost/core/checked_delete.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/config/workaround.hpp>
 | 
			
		||||
 | 
			
		||||
#include <cstddef>            // for std::ptrdiff_t
 | 
			
		||||
@@ -54,14 +53,14 @@ public:
 | 
			
		||||
 | 
			
		||||
    typedef T element_type;
 | 
			
		||||
 | 
			
		||||
    explicit scoped_array( T * p = 0 ) BOOST_SP_NOEXCEPT : px( p )
 | 
			
		||||
    explicit scoped_array( T * p = 0 ) noexcept : px( p )
 | 
			
		||||
    {
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        boost::sp_array_constructor_hook( px );
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~scoped_array() BOOST_SP_NOEXCEPT
 | 
			
		||||
    ~scoped_array() noexcept
 | 
			
		||||
    {
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        boost::sp_array_destructor_hook( px );
 | 
			
		||||
@@ -82,15 +81,17 @@ public:
 | 
			
		||||
        return px[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T * get() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    T * get() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
// implicit conversion to "bool"
 | 
			
		||||
#include <boost/smart_ptr/detail/operator_bool.hpp>
 | 
			
		||||
    explicit operator bool () const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return px != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void swap(scoped_array & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void swap(scoped_array & b) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        T * tmp = b.px;
 | 
			
		||||
        b.px = px;
 | 
			
		||||
@@ -98,31 +99,27 @@ public:
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( scoped_array<T> const & p, boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator==( scoped_array<T> const & p, std::nullptr_t ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( boost::detail::sp_nullptr_t, scoped_array<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator==( std::nullptr_t, scoped_array<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( scoped_array<T> const & p, boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator!=( scoped_array<T> const & p, std::nullptr_t ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( boost::detail::sp_nullptr_t, scoped_array<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator!=( std::nullptr_t, scoped_array<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class T> inline void swap(scoped_array<T> & a, scoped_array<T> & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline void swap(scoped_array<T> & a, scoped_array<T> & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    a.swap(b);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,13 +10,14 @@
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/ for documentation.
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/checked_delete.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/smart_ptr/detail/deprecated_macros.hpp>
 | 
			
		||||
#include <boost/core/checked_delete.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/config/workaround.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_AUTO_PTR
 | 
			
		||||
# include <memory>          // for std::auto_ptr
 | 
			
		||||
@@ -62,7 +63,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    typedef T element_type;
 | 
			
		||||
 | 
			
		||||
    explicit scoped_ptr( T * p = 0 ) BOOST_SP_NOEXCEPT : px( p )
 | 
			
		||||
    explicit scoped_ptr( T * p = 0 ) noexcept : px( p )
 | 
			
		||||
    {
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        boost::sp_scalar_constructor_hook( px );
 | 
			
		||||
@@ -71,7 +72,7 @@ public:
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_AUTO_PTR
 | 
			
		||||
 | 
			
		||||
    explicit scoped_ptr( std::auto_ptr<T> p ) BOOST_SP_NOEXCEPT : px( p.release() )
 | 
			
		||||
    explicit scoped_ptr( std::auto_ptr<T> p ) noexcept : px( p.release() )
 | 
			
		||||
    {
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        boost::sp_scalar_constructor_hook( px );
 | 
			
		||||
@@ -80,7 +81,7 @@ public:
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    ~scoped_ptr() BOOST_SP_NOEXCEPT
 | 
			
		||||
    ~scoped_ptr() noexcept
 | 
			
		||||
    {
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        boost::sp_scalar_destructor_hook( px );
 | 
			
		||||
@@ -106,15 +107,17 @@ public:
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T * get() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    T * get() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
// implicit conversion to "bool"
 | 
			
		||||
#include <boost/smart_ptr/detail/operator_bool.hpp>
 | 
			
		||||
    explicit operator bool () const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return px != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void swap(scoped_ptr & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void swap(scoped_ptr & b) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        T * tmp = b.px;
 | 
			
		||||
        b.px = px;
 | 
			
		||||
@@ -122,38 +125,34 @@ public:
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( scoped_ptr<T> const & p, boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator==( scoped_ptr<T> const & p, std::nullptr_t ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( boost::detail::sp_nullptr_t, scoped_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator==( std::nullptr_t, scoped_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( scoped_ptr<T> const & p, boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator!=( scoped_ptr<T> const & p, std::nullptr_t ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( boost::detail::sp_nullptr_t, scoped_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator!=( std::nullptr_t, scoped_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class T> inline void swap(scoped_ptr<T> & a, scoped_ptr<T> & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline void swap(scoped_ptr<T> & a, scoped_ptr<T> & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    a.swap(b);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// get_pointer(p) is a generic way to say p.get()
 | 
			
		||||
 | 
			
		||||
template<class T> inline T * get_pointer(scoped_ptr<T> const & p) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline T * get_pointer(scoped_ptr<T> const & p) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -14,22 +14,17 @@
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/ for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>   // for broken compiler workarounds
 | 
			
		||||
 | 
			
		||||
#include <memory>             // TR1 cyclic inclusion fix
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/checked_delete.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/shared_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/shared_count.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_nullptr_t.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <boost/core/checked_delete.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/config/workaround.hpp>
 | 
			
		||||
 | 
			
		||||
#include <cstddef>            // for std::ptrdiff_t
 | 
			
		||||
#include <algorithm>          // for std::swap
 | 
			
		||||
#include <functional>         // for std::less
 | 
			
		||||
#include <cstddef>            // for std::ptrdiff_t
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
@@ -54,18 +49,14 @@ public:
 | 
			
		||||
 | 
			
		||||
    typedef T element_type;
 | 
			
		||||
 | 
			
		||||
    shared_array() BOOST_SP_NOEXCEPT : px( 0 ), pn()
 | 
			
		||||
    shared_array() noexcept : px( 0 ), pn()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
    shared_array( boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT : px( 0 ), pn()
 | 
			
		||||
    shared_array( std::nullptr_t ) noexcept : px( 0 ), pn()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    explicit shared_array( Y * p ): px( p ), pn( p, checked_array_deleter<Y>() )
 | 
			
		||||
    {
 | 
			
		||||
@@ -91,36 +82,23 @@ public:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
//  generated copy constructor, destructor are fine...
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
// ... except in C++0x, move disables the implicit copy
 | 
			
		||||
 | 
			
		||||
    shared_array( shared_array const & r ) BOOST_SP_NOEXCEPT : px( r.px ), pn( r.pn )
 | 
			
		||||
    shared_array( shared_array const & r ) noexcept : px( r.px ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    shared_array( shared_array && r ) BOOST_SP_NOEXCEPT : px( r.px ), pn()
 | 
			
		||||
    shared_array( shared_array && r ) noexcept : px( r.px ), pn()
 | 
			
		||||
    {
 | 
			
		||||
        pn.swap( r.pn );
 | 
			
		||||
        r.px = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // conversion
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
    shared_array( shared_array<Y> const & r, typename boost::detail::sp_enable_if_convertible< Y[], T[] >::type = boost::detail::sp_empty() )
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    shared_array( shared_array<Y> const & r )
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    BOOST_SP_NOEXCEPT : px( r.px ), pn( r.pn )
 | 
			
		||||
    noexcept : px( r.px ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y[], T[] >();
 | 
			
		||||
    }
 | 
			
		||||
@@ -128,47 +106,39 @@ public:
 | 
			
		||||
    // aliasing
 | 
			
		||||
 | 
			
		||||
    template< class Y >
 | 
			
		||||
    shared_array( shared_array<Y> const & r, element_type * p ) BOOST_SP_NOEXCEPT : px( p ), pn( r.pn )
 | 
			
		||||
    shared_array( shared_array<Y> const & r, element_type * p ) noexcept : px( p ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // assignment
 | 
			
		||||
 | 
			
		||||
    shared_array & operator=( shared_array const & r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    shared_array & operator=( shared_array const & r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type( r ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_MSVC) || (BOOST_MSVC >= 1400)
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    shared_array & operator=( shared_array<Y> const & r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    shared_array & operator=( shared_array<Y> const & r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type( r ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    shared_array & operator=( shared_array && r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    shared_array & operator=( shared_array && r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type( static_cast< shared_array && >( r ) ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    shared_array & operator=( shared_array<Y> && r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    shared_array & operator=( shared_array<Y> && r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type( static_cast< shared_array<Y> && >( r ) ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    void reset() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void reset() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type().swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
@@ -189,7 +159,7 @@ public:
 | 
			
		||||
        this_type( p, d, a ).swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> void reset( shared_array<Y> const & r, element_type * p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class Y> void reset( shared_array<Y> const & r, element_type * p ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type( r, p ).swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
@@ -201,31 +171,33 @@ public:
 | 
			
		||||
        return px[i];
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    T * get() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    T * get() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
// implicit conversion to "bool"
 | 
			
		||||
#include <boost/smart_ptr/detail/operator_bool.hpp>
 | 
			
		||||
    explicit operator bool () const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return px != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool unique() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool unique() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn.unique();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    long use_count() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn.use_count();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void swap(shared_array<T> & other) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void swap(shared_array<T> & other) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        std::swap(px, other.px);
 | 
			
		||||
        pn.swap(other.pn);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * _internal_get_deleter( boost::detail::sp_typeinfo_ const & ti ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * _internal_get_deleter( boost::detail::sp_typeinfo_ const & ti ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn.get_deleter( ti );
 | 
			
		||||
    }
 | 
			
		||||
@@ -239,51 +211,47 @@ private:
 | 
			
		||||
 | 
			
		||||
};  // shared_array
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==(shared_array<T> const & a, shared_array<T> const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator==(shared_array<T> const & a, shared_array<T> const & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a.get() == b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=(shared_array<T> const & a, shared_array<T> const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator!=(shared_array<T> const & a, shared_array<T> const & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( shared_array<T> const & p, boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator==( shared_array<T> const & p, std::nullptr_t ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( boost::detail::sp_nullptr_t, shared_array<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator==( std::nullptr_t, shared_array<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( shared_array<T> const & p, boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator!=( shared_array<T> const & p, std::nullptr_t ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( boost::detail::sp_nullptr_t, shared_array<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator!=( std::nullptr_t, shared_array<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator<(shared_array<T> const & a, shared_array<T> const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator<(shared_array<T> const & a, shared_array<T> const & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return std::less<T*>()(a.get(), b.get());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> void swap(shared_array<T> & a, shared_array<T> & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> void swap(shared_array<T> & a, shared_array<T> & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    a.swap(b);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class D, class T > D * get_deleter( shared_array<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template< class D, class T > D * get_deleter( shared_array<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return static_cast< D * >( p._internal_get_deleter( BOOST_SP_TYPEID_(D) ) );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -16,10 +16,9 @@
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/shared_count.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_convertible.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/checked_delete.hpp>
 | 
			
		||||
#include <boost/core/checked_delete.hpp>
 | 
			
		||||
#include <boost/throw_exception.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
@@ -34,14 +33,7 @@
 | 
			
		||||
#include <typeinfo>             // for std::bad_cast
 | 
			
		||||
#include <cstddef>              // for std::size_t
 | 
			
		||||
#include <memory>               // for std::auto_ptr
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_IOSTREAM)
 | 
			
		||||
#if !defined(BOOST_NO_IOSFWD)
 | 
			
		||||
#include <iosfwd>               // for std::basic_ostream
 | 
			
		||||
#else
 | 
			
		||||
#include <ostream>
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_SP_DISABLE_DEPRECATED )
 | 
			
		||||
#pragma GCC diagnostic push
 | 
			
		||||
@@ -73,24 +65,16 @@ template< class T > struct sp_element
 | 
			
		||||
    typedef T type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
template< class T > struct sp_element< T[] >
 | 
			
		||||
{
 | 
			
		||||
    typedef T type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_BORLANDC ) || !BOOST_WORKAROUND( BOOST_BORLANDC, < 0x600 )
 | 
			
		||||
 | 
			
		||||
template< class T, std::size_t N > struct sp_element< T[N] >
 | 
			
		||||
{
 | 
			
		||||
    typedef T type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
// sp_dereference, return type of operator*
 | 
			
		||||
 | 
			
		||||
template< class T > struct sp_dereference
 | 
			
		||||
@@ -103,8 +87,6 @@ template<> struct sp_dereference< void >
 | 
			
		||||
    typedef void type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CV_VOID_SPECIALIZATIONS)
 | 
			
		||||
 | 
			
		||||
template<> struct sp_dereference< void const >
 | 
			
		||||
{
 | 
			
		||||
    typedef void type;
 | 
			
		||||
@@ -120,26 +102,16 @@ template<> struct sp_dereference< void const volatile >
 | 
			
		||||
    typedef void type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // !defined(BOOST_NO_CV_VOID_SPECIALIZATIONS)
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
template< class T > struct sp_dereference< T[] >
 | 
			
		||||
{
 | 
			
		||||
    typedef void type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_BORLANDC ) || !BOOST_WORKAROUND( BOOST_BORLANDC, < 0x600 )
 | 
			
		||||
 | 
			
		||||
template< class T, std::size_t N > struct sp_dereference< T[N] >
 | 
			
		||||
{
 | 
			
		||||
    typedef void type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
// sp_member_access, return type of operator->
 | 
			
		||||
 | 
			
		||||
template< class T > struct sp_member_access
 | 
			
		||||
@@ -147,24 +119,16 @@ template< class T > struct sp_member_access
 | 
			
		||||
    typedef T * type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
template< class T > struct sp_member_access< T[] >
 | 
			
		||||
{
 | 
			
		||||
    typedef void type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_BORLANDC ) || !BOOST_WORKAROUND( BOOST_BORLANDC, < 0x600 )
 | 
			
		||||
 | 
			
		||||
template< class T, std::size_t N > struct sp_member_access< T[N] >
 | 
			
		||||
{
 | 
			
		||||
    typedef void type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
// sp_array_access, return type of operator[]
 | 
			
		||||
 | 
			
		||||
template< class T > struct sp_array_access
 | 
			
		||||
@@ -172,24 +136,16 @@ template< class T > struct sp_array_access
 | 
			
		||||
    typedef void type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
template< class T > struct sp_array_access< T[] >
 | 
			
		||||
{
 | 
			
		||||
    typedef T & type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_BORLANDC ) || !BOOST_WORKAROUND( BOOST_BORLANDC, < 0x600 )
 | 
			
		||||
 | 
			
		||||
template< class T, std::size_t N > struct sp_array_access< T[N] >
 | 
			
		||||
{
 | 
			
		||||
    typedef T & type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
// sp_extent, for operator[] index check
 | 
			
		||||
 | 
			
		||||
template< class T > struct sp_extent
 | 
			
		||||
@@ -197,15 +153,11 @@ template< class T > struct sp_extent
 | 
			
		||||
    enum _vt { value = 0 };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
template< class T, std::size_t N > struct sp_extent< T[N] >
 | 
			
		||||
{
 | 
			
		||||
    enum _vt { value = N };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
// enable_shared_from_this support
 | 
			
		||||
 | 
			
		||||
template< class X, class Y, class T > inline void sp_enable_shared_from_this( boost::shared_ptr<X> const * ppx, Y const * py, boost::enable_shared_from_this< T > const * pe )
 | 
			
		||||
@@ -239,37 +191,11 @@ inline void sp_enable_shared_from_this( ... )
 | 
			
		||||
 | 
			
		||||
#endif // _MANAGED
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_SFINAE ) && !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) && !defined( BOOST_NO_AUTO_PTR )
 | 
			
		||||
 | 
			
		||||
// rvalue auto_ptr support based on a technique by Dave Abrahams
 | 
			
		||||
 | 
			
		||||
template< class T, class R > struct sp_enable_if_auto_ptr
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class T, class R > struct sp_enable_if_auto_ptr< std::auto_ptr< T >, R >
 | 
			
		||||
{
 | 
			
		||||
    typedef R type;
 | 
			
		||||
}; 
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// sp_assert_convertible
 | 
			
		||||
 | 
			
		||||
template< class Y, class T > inline void sp_assert_convertible() BOOST_SP_NOEXCEPT
 | 
			
		||||
template< class Y, class T > inline void sp_assert_convertible() noexcept
 | 
			
		||||
{
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
    // static_assert( sp_convertible< Y, T >::value );
 | 
			
		||||
    typedef char tmp[ sp_convertible< Y, T >::value? 1: -1 ];
 | 
			
		||||
    (void)sizeof( tmp );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    T* p = static_cast< Y* >( 0 );
 | 
			
		||||
    (void)p;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    static_assert( sp_convertible< Y, T >::value, "incompatible pointer type" );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// pointer constructor helper
 | 
			
		||||
@@ -280,8 +206,6 @@ template< class T, class Y > inline void sp_pointer_construct( boost::shared_ptr
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( ppx, p, p );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
template< class T, class Y > inline void sp_pointer_construct( boost::shared_ptr< T[] > * /*ppx*/, Y * p, boost::detail::shared_count & pn )
 | 
			
		||||
{
 | 
			
		||||
    sp_assert_convertible< Y[], T[] >();
 | 
			
		||||
@@ -294,8 +218,6 @@ template< class T, std::size_t N, class Y > inline void sp_pointer_construct( bo
 | 
			
		||||
    boost::detail::shared_count( p, boost::checked_array_deleter< T >() ).swap( pn );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
// deleter constructor helper
 | 
			
		||||
 | 
			
		||||
template< class T, class Y > inline void sp_deleter_construct( boost::shared_ptr< T > * ppx, Y * p )
 | 
			
		||||
@@ -303,8 +225,6 @@ template< class T, class Y > inline void sp_deleter_construct( boost::shared_ptr
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( ppx, p, p );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
template< class T, class Y > inline void sp_deleter_construct( boost::shared_ptr< T[] > * /*ppx*/, Y * /*p*/ )
 | 
			
		||||
{
 | 
			
		||||
    sp_assert_convertible< Y[], T[] >();
 | 
			
		||||
@@ -315,8 +235,6 @@ template< class T, std::size_t N, class Y > inline void sp_deleter_construct( bo
 | 
			
		||||
    sp_assert_convertible< Y[N], T[N] >();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
struct sp_internal_constructor_tag
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
@@ -343,30 +261,22 @@ public:
 | 
			
		||||
 | 
			
		||||
    typedef typename boost::detail::sp_element< T >::type element_type;
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR shared_ptr() BOOST_SP_NOEXCEPT : px( 0 ), pn()
 | 
			
		||||
    constexpr shared_ptr() noexcept : px( 0 ), pn()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR shared_ptr( boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT : px( 0 ), pn()
 | 
			
		||||
    constexpr shared_ptr( std::nullptr_t ) noexcept : px( 0 ), pn()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR shared_ptr( boost::detail::sp_internal_constructor_tag, element_type * px_, boost::detail::shared_count const & pn_ ) BOOST_SP_NOEXCEPT : px( px_ ), pn( pn_ )
 | 
			
		||||
    constexpr shared_ptr( boost::detail::sp_internal_constructor_tag, element_type * px_, boost::detail::shared_count const & pn_ ) noexcept : px( px_ ), pn( pn_ )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR shared_ptr( boost::detail::sp_internal_constructor_tag, element_type * px_, boost::detail::shared_count && pn_ ) BOOST_SP_NOEXCEPT : px( px_ ), pn( std::move( pn_ ) )
 | 
			
		||||
    constexpr shared_ptr( boost::detail::sp_internal_constructor_tag, element_type * px_, boost::detail::shared_count && pn_ ) noexcept : px( px_ ), pn( std::move( pn_ ) )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    explicit shared_ptr( Y * p ): px( p ), pn() // Y must be complete
 | 
			
		||||
    {
 | 
			
		||||
@@ -374,51 +284,38 @@ public:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //
 | 
			
		||||
    // Requirements: D's copy constructor must not throw
 | 
			
		||||
    // Requirements: D's copy/move constructors must not throw
 | 
			
		||||
    //
 | 
			
		||||
    // shared_ptr will release p by calling d(p)
 | 
			
		||||
    //
 | 
			
		||||
 | 
			
		||||
    template<class Y, class D> shared_ptr( Y * p, D d ): px( p ), pn( p, d )
 | 
			
		||||
    template<class Y, class D> shared_ptr( Y * p, D d ): px( p ), pn( p, static_cast< D&& >( d ) )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_deleter_construct( this, p );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
    template<class D> shared_ptr( boost::detail::sp_nullptr_t p, D d ): px( p ), pn( p, d )
 | 
			
		||||
    template<class D> shared_ptr( std::nullptr_t p, D d ): px( p ), pn( p, static_cast< D&& >( d ) )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // As above, but with allocator. A's copy constructor shall not throw.
 | 
			
		||||
 | 
			
		||||
    template<class Y, class D, class A> shared_ptr( Y * p, D d, A a ): px( p ), pn( p, d, a )
 | 
			
		||||
    template<class Y, class D, class A> shared_ptr( Y * p, D d, A a ): px( p ), pn( p, static_cast< D&& >( d ), a )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_deleter_construct( this, p );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
    template<class D, class A> shared_ptr( boost::detail::sp_nullptr_t p, D d, A a ): px( p ), pn( p, d, a )
 | 
			
		||||
    template<class D, class A> shared_ptr( std::nullptr_t p, D d, A a ): px( p ), pn( p, static_cast< D&& >( d ), a )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  generated copy constructor, destructor are fine...
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
// ... except in C++0x, move disables the implicit copy
 | 
			
		||||
 | 
			
		||||
    shared_ptr( shared_ptr const & r ) BOOST_SP_NOEXCEPT : px( r.px ), pn( r.pn )
 | 
			
		||||
    shared_ptr( shared_ptr const & r ) noexcept : px( r.px ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    explicit shared_ptr( weak_ptr<Y> const & r ): pn( r.pn ) // may throw
 | 
			
		||||
    {
 | 
			
		||||
@@ -430,7 +327,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    shared_ptr( weak_ptr<Y> const & r, boost::detail::sp_nothrow_tag )
 | 
			
		||||
    BOOST_SP_NOEXCEPT : px( 0 ), pn( r.pn, boost::detail::sp_nothrow_tag() )
 | 
			
		||||
    noexcept : px( 0 ), pn( r.pn, boost::detail::sp_nothrow_tag() )
 | 
			
		||||
    {
 | 
			
		||||
        if( !pn.empty() )
 | 
			
		||||
        {
 | 
			
		||||
@@ -439,23 +336,15 @@ public:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
    shared_ptr( shared_ptr<Y> const & r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() )
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    shared_ptr( shared_ptr<Y> const & r )
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    BOOST_SP_NOEXCEPT : px( r.px ), pn( r.pn )
 | 
			
		||||
    noexcept : px( r.px ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y, T >();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // aliasing
 | 
			
		||||
    template< class Y >
 | 
			
		||||
    shared_ptr( shared_ptr<Y> const & r, element_type * p ) BOOST_SP_NOEXCEPT : px( p ), pn( r.pn )
 | 
			
		||||
    shared_ptr( shared_ptr<Y> const & r, element_type * p ) noexcept : px( p ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -472,8 +361,6 @@ public:
 | 
			
		||||
        boost::detail::sp_deleter_construct( this, tmp );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    shared_ptr( std::auto_ptr<Y> && r ): px(r.get()), pn()
 | 
			
		||||
    {
 | 
			
		||||
@@ -485,27 +372,8 @@ public:
 | 
			
		||||
        boost::detail::sp_deleter_construct( this, tmp );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#elif !defined( BOOST_NO_SFINAE ) && !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
    template<class Ap>
 | 
			
		||||
    explicit shared_ptr( Ap r, typename boost::detail::sp_enable_if_auto_ptr<Ap, int>::type = 0 ): px( r.get() ), pn()
 | 
			
		||||
    {
 | 
			
		||||
        typedef typename Ap::element_type Y;
 | 
			
		||||
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y, T >();
 | 
			
		||||
 | 
			
		||||
        Y * tmp = r.get();
 | 
			
		||||
        pn = boost::detail::shared_count( r );
 | 
			
		||||
 | 
			
		||||
        boost::detail::sp_deleter_construct( this, tmp );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif // BOOST_NO_SFINAE, BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
			
		||||
 | 
			
		||||
#endif // BOOST_NO_AUTO_PTR
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_SMART_PTR ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    template< class Y, class D >
 | 
			
		||||
    shared_ptr( std::unique_ptr< Y, D > && r ): px( r.get() ), pn()
 | 
			
		||||
    {
 | 
			
		||||
@@ -520,8 +388,6 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    template< class Y, class D >
 | 
			
		||||
    shared_ptr( boost::movelib::unique_ptr< Y, D > r ): px( r.get() ), pn()
 | 
			
		||||
    {
 | 
			
		||||
@@ -538,23 +404,19 @@ public:
 | 
			
		||||
 | 
			
		||||
    // assignment
 | 
			
		||||
 | 
			
		||||
    shared_ptr & operator=( shared_ptr const & r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    shared_ptr & operator=( shared_ptr const & r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type(r).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_MSVC) || (BOOST_MSVC >= 1400)
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    shared_ptr & operator=(shared_ptr<Y> const & r) BOOST_SP_NOEXCEPT
 | 
			
		||||
    shared_ptr & operator=(shared_ptr<Y> const & r) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type(r).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_AUTO_PTR
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
@@ -564,8 +426,6 @@ public:
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    shared_ptr & operator=( std::auto_ptr<Y> && r )
 | 
			
		||||
    {
 | 
			
		||||
@@ -573,21 +433,8 @@ public:
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#elif !defined( BOOST_NO_SFINAE ) && !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
    template<class Ap>
 | 
			
		||||
    typename boost::detail::sp_enable_if_auto_ptr< Ap, shared_ptr & >::type operator=( Ap r )
 | 
			
		||||
    {
 | 
			
		||||
        this_type( r ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif // BOOST_NO_SFINAE, BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
			
		||||
 | 
			
		||||
#endif // BOOST_NO_AUTO_PTR
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_SMART_PTR ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    template<class Y, class D>
 | 
			
		||||
    shared_ptr & operator=( std::unique_ptr<Y, D> && r )
 | 
			
		||||
    {
 | 
			
		||||
@@ -595,8 +442,6 @@ public:
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    template<class Y, class D>
 | 
			
		||||
    shared_ptr & operator=( boost::movelib::unique_ptr<Y, D> r )
 | 
			
		||||
    {
 | 
			
		||||
@@ -623,40 +468,27 @@ public:
 | 
			
		||||
 | 
			
		||||
// Move support
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    shared_ptr( shared_ptr && r ) BOOST_SP_NOEXCEPT : px( r.px ), pn()
 | 
			
		||||
    shared_ptr( shared_ptr && r ) noexcept : px( r.px ), pn( static_cast< boost::detail::shared_count && >( r.pn ) )
 | 
			
		||||
    {
 | 
			
		||||
        pn.swap( r.pn );
 | 
			
		||||
        r.px = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
    shared_ptr( shared_ptr<Y> && r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() )
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    shared_ptr( shared_ptr<Y> && r )
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    BOOST_SP_NOEXCEPT : px( r.px ), pn()
 | 
			
		||||
    noexcept : px( r.px ), pn( static_cast< boost::detail::shared_count && >( r.pn ) )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y, T >();
 | 
			
		||||
 | 
			
		||||
        pn.swap( r.pn );
 | 
			
		||||
        r.px = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    shared_ptr & operator=( shared_ptr && r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    shared_ptr & operator=( shared_ptr && r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type( static_cast< shared_ptr && >( r ) ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    shared_ptr & operator=( shared_ptr<Y> && r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    shared_ptr & operator=( shared_ptr<Y> && r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type( static_cast< shared_ptr<Y> && >( r ) ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
@@ -664,25 +496,19 @@ public:
 | 
			
		||||
 | 
			
		||||
    // aliasing move
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    shared_ptr( shared_ptr<Y> && r, element_type * p ) BOOST_SP_NOEXCEPT : px( p ), pn()
 | 
			
		||||
    shared_ptr( shared_ptr<Y> && r, element_type * p ) noexcept : px( p ), pn()
 | 
			
		||||
    {
 | 
			
		||||
        pn.swap( r.pn );
 | 
			
		||||
        r.px = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
    shared_ptr & operator=( boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    shared_ptr & operator=( std::nullptr_t ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type().swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    void reset() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void reset() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type().swap(*this);
 | 
			
		||||
    }
 | 
			
		||||
@@ -695,28 +521,24 @@ public:
 | 
			
		||||
 | 
			
		||||
    template<class Y, class D> void reset( Y * p, D d )
 | 
			
		||||
    {
 | 
			
		||||
        this_type( p, d ).swap( *this );
 | 
			
		||||
        this_type( p, static_cast< D&& >( d ) ).swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y, class D, class A> void reset( Y * p, D d, A a )
 | 
			
		||||
    {
 | 
			
		||||
        this_type( p, d, a ).swap( *this );
 | 
			
		||||
        this_type( p, static_cast< D&& >( d ), a ).swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> void reset( shared_ptr<Y> const & r, element_type * p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class Y> void reset( shared_ptr<Y> const & r, element_type * p ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        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 ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class Y> void reset( shared_ptr<Y> && r, element_type * p ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type( static_cast< shared_ptr<Y> && >( r ), p ).swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    typename boost::detail::sp_dereference< T >::type operator* () const BOOST_SP_NOEXCEPT_WITH_ASSERT
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( px != 0 );
 | 
			
		||||
@@ -737,154 +559,134 @@ public:
 | 
			
		||||
        return static_cast< typename boost::detail::sp_array_access< T >::type >( px[ i ] );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    element_type * get() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    element_type * get() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
// implicit conversion to "bool"
 | 
			
		||||
#include <boost/smart_ptr/detail/operator_bool.hpp>
 | 
			
		||||
    explicit operator bool () const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return px != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool unique() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool unique() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn.unique();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    long use_count() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn.use_count();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void swap( shared_ptr & other ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void swap( shared_ptr & other ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        std::swap(px, other.px);
 | 
			
		||||
        pn.swap(other.pn);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_before( shared_ptr<Y> const & rhs ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class Y> bool owner_before( shared_ptr<Y> const & rhs ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn < rhs.pn;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_before( weak_ptr<Y> const & rhs ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class Y> bool owner_before( weak_ptr<Y> const & rhs ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn < rhs.pn;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_equals( shared_ptr<Y> const & rhs ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class Y> bool owner_equals( shared_ptr<Y> const & rhs ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn == rhs.pn;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_equals( weak_ptr<Y> const & rhs ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class Y> bool owner_equals( weak_ptr<Y> const & rhs ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn == rhs.pn;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::size_t owner_hash_value() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    std::size_t owner_hash_value() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn.hash_value();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * _internal_get_deleter( boost::detail::sp_typeinfo_ const & ti ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * _internal_get_deleter( boost::detail::sp_typeinfo_ const & ti ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn.get_deleter( ti );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * _internal_get_local_deleter( boost::detail::sp_typeinfo_ const & ti ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * _internal_get_local_deleter( boost::detail::sp_typeinfo_ const & ti ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn.get_local_deleter( ti );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * _internal_get_untyped_deleter() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * _internal_get_untyped_deleter() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn.get_untyped_deleter();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool _internal_equiv( shared_ptr const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool _internal_equiv( shared_ptr const & r ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return px == r.px && pn == r.pn;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    boost::detail::shared_count _internal_count() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    boost::detail::shared_count _internal_count() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
// Tasteless as this may seem, making all members public allows member templates
 | 
			
		||||
// to work in the absence of member template friends. (Matthew Langston)
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    template<class Y> friend class shared_ptr;
 | 
			
		||||
    template<class Y> friend class weak_ptr;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    element_type * px;                 // contained pointer
 | 
			
		||||
    boost::detail::shared_count pn;    // reference counter
 | 
			
		||||
 | 
			
		||||
};  // shared_ptr
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator==(shared_ptr<T> const & a, shared_ptr<U> const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> inline bool operator==(shared_ptr<T> const & a, shared_ptr<U> const & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a.get() == b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator!=(shared_ptr<T> const & a, shared_ptr<U> const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> inline bool operator!=(shared_ptr<T> const & a, shared_ptr<U> const & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if __GNUC__ == 2 && __GNUC_MINOR__ <= 96
 | 
			
		||||
 | 
			
		||||
// Resolve the ambiguity between our op!= and the one in rel_ops
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=(shared_ptr<T> const & a, shared_ptr<T> const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( shared_ptr<T> const & p, boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator==( shared_ptr<T> const & p, std::nullptr_t ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( boost::detail::sp_nullptr_t, shared_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator==( std::nullptr_t, shared_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( shared_ptr<T> const & p, boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator!=( shared_ptr<T> const & p, std::nullptr_t ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( boost::detail::sp_nullptr_t, shared_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool operator!=( std::nullptr_t, shared_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> inline bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a.owner_before( b );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline void swap(shared_ptr<T> & a, shared_ptr<T> & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline void swap(shared_ptr<T> & a, shared_ptr<T> & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    a.swap(b);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> shared_ptr<T> static_pointer_cast( shared_ptr<U> const & r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> shared_ptr<T> static_pointer_cast( shared_ptr<U> const & r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) static_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -894,7 +696,7 @@ template<class T, class U> shared_ptr<T> static_pointer_cast( shared_ptr<U> cons
 | 
			
		||||
    return shared_ptr<T>( r, p );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> shared_ptr<T> const_pointer_cast( shared_ptr<U> const & r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> shared_ptr<T> const_pointer_cast( shared_ptr<U> const & r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) const_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -904,7 +706,7 @@ template<class T, class U> shared_ptr<T> const_pointer_cast( shared_ptr<U> const
 | 
			
		||||
    return shared_ptr<T>( r, p );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> shared_ptr<T> dynamic_pointer_cast( shared_ptr<U> const & r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> shared_ptr<T> dynamic_pointer_cast( shared_ptr<U> const & r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) dynamic_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -914,7 +716,7 @@ template<class T, class U> shared_ptr<T> dynamic_pointer_cast( shared_ptr<U> con
 | 
			
		||||
    return p? shared_ptr<T>( r, p ): shared_ptr<T>();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> shared_ptr<T> reinterpret_pointer_cast( shared_ptr<U> const & r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> shared_ptr<T> reinterpret_pointer_cast( shared_ptr<U> const & r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) reinterpret_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -924,9 +726,7 @@ template<class T, class U> shared_ptr<T> reinterpret_pointer_cast( shared_ptr<U>
 | 
			
		||||
    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_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> shared_ptr<T> static_pointer_cast( shared_ptr<U> && r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) static_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -936,7 +736,7 @@ template<class T, class U> shared_ptr<T> static_pointer_cast( shared_ptr<U> && r
 | 
			
		||||
    return shared_ptr<T>( std::move(r), p );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> shared_ptr<T> const_pointer_cast( shared_ptr<U> && r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> shared_ptr<T> const_pointer_cast( shared_ptr<U> && r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) const_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -946,7 +746,7 @@ template<class T, class U> shared_ptr<T> const_pointer_cast( shared_ptr<U> && r
 | 
			
		||||
    return shared_ptr<T>( std::move(r), p );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> shared_ptr<T> dynamic_pointer_cast( shared_ptr<U> && r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> shared_ptr<T> dynamic_pointer_cast( shared_ptr<U> && r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) dynamic_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -956,7 +756,7 @@ template<class T, class U> shared_ptr<T> dynamic_pointer_cast( shared_ptr<U> &&
 | 
			
		||||
    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_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> shared_ptr<T> reinterpret_pointer_cast( shared_ptr<U> && r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    (void) reinterpret_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
@@ -966,62 +766,33 @@ template<class T, class U> shared_ptr<T> reinterpret_pointer_cast( shared_ptr<U>
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
template<class T> inline typename shared_ptr<T>::element_type * get_pointer(shared_ptr<T> const & p) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline typename shared_ptr<T>::element_type * get_pointer(shared_ptr<T> const & p) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// operator<<
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_IOSTREAM)
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_NO_TEMPLATED_IOSTREAMS) || ( defined(__GNUC__) &&  (__GNUC__ < 3) )
 | 
			
		||||
 | 
			
		||||
template<class Y> std::ostream & operator<< (std::ostream & os, shared_ptr<Y> const & p)
 | 
			
		||||
{
 | 
			
		||||
    os << p.get();
 | 
			
		||||
    return os;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
// in STLport's no-iostreams mode no iostream symbols can be used
 | 
			
		||||
#ifndef _STLP_NO_IOSTREAMS
 | 
			
		||||
 | 
			
		||||
# if defined(BOOST_MSVC) && BOOST_WORKAROUND(BOOST_MSVC, < 1300 && __SGI_STL_PORT)
 | 
			
		||||
// MSVC6 has problems finding std::basic_ostream through the using declaration in namespace _STL
 | 
			
		||||
using std::basic_ostream;
 | 
			
		||||
template<class E, class T, class Y> basic_ostream<E, T> & operator<< (basic_ostream<E, T> & os, shared_ptr<Y> const & p)
 | 
			
		||||
# else
 | 
			
		||||
template<class E, class T, class Y> std::basic_ostream<E, T> & operator<< (std::basic_ostream<E, T> & os, shared_ptr<Y> const & p)
 | 
			
		||||
# endif
 | 
			
		||||
{
 | 
			
		||||
    os << p.get();
 | 
			
		||||
    return os;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // _STLP_NO_IOSTREAMS
 | 
			
		||||
 | 
			
		||||
#endif // __GNUC__ < 3
 | 
			
		||||
 | 
			
		||||
#endif // !defined(BOOST_NO_IOSTREAM)
 | 
			
		||||
 | 
			
		||||
// get_deleter
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<class D, class T> D * basic_get_deleter( shared_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class D, class T> D * basic_get_deleter( shared_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return static_cast<D *>( p._internal_get_deleter(BOOST_SP_TYPEID_(D)) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class D, class T> D * basic_get_local_deleter( D *, shared_ptr<T> const & p ) BOOST_SP_NOEXCEPT;
 | 
			
		||||
template<class D, class T> D const * basic_get_local_deleter( D const *, shared_ptr<T> const & p ) BOOST_SP_NOEXCEPT;
 | 
			
		||||
template<class D, class T> D * basic_get_local_deleter( D *, shared_ptr<T> const & p ) noexcept;
 | 
			
		||||
template<class D, class T> D const * basic_get_local_deleter( D const *, shared_ptr<T> const & p ) noexcept;
 | 
			
		||||
 | 
			
		||||
class esft2_deleter_wrapper
 | 
			
		||||
{
 | 
			
		||||
@@ -1031,16 +802,16 @@ private:
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    esft2_deleter_wrapper() BOOST_SP_NOEXCEPT
 | 
			
		||||
    esft2_deleter_wrapper() noexcept
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template< class T > void set_deleter( shared_ptr<T> const & deleter ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    template< class T > void set_deleter( shared_ptr<T> const & deleter ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        deleter_ = deleter;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<typename D> D* get_deleter() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<typename D> D* get_deleter() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return boost::detail::basic_get_deleter<D>( deleter_ );
 | 
			
		||||
    }
 | 
			
		||||
@@ -1054,7 +825,7 @@ public:
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
template<class D, class T> D * get_deleter( shared_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class D, class T> D * get_deleter( shared_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    D * d = boost::detail::basic_get_deleter<D>( p );
 | 
			
		||||
 | 
			
		||||
@@ -1078,34 +849,34 @@ template<class D, class T> D * get_deleter( shared_ptr<T> const & p ) BOOST_SP_N
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_SP_NO_ATOMIC_ACCESS)
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool atomic_is_lock_free( shared_ptr<T> const * /*p*/ ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> inline bool atomic_is_lock_free( shared_ptr<T> const * /*p*/ ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> shared_ptr<T> atomic_load( shared_ptr<T> const * p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> shared_ptr<T> atomic_load( shared_ptr<T> const * p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    boost::detail::spinlock_pool<2>::scoped_lock lock( p );
 | 
			
		||||
    return *p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class M> inline shared_ptr<T> atomic_load_explicit( shared_ptr<T> const * p, /*memory_order mo*/ M ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class M> inline shared_ptr<T> atomic_load_explicit( shared_ptr<T> const * p, /*memory_order mo*/ M ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return atomic_load( p );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> void atomic_store( shared_ptr<T> * p, shared_ptr<T> r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> void atomic_store( shared_ptr<T> * p, shared_ptr<T> r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    boost::detail::spinlock_pool<2>::scoped_lock lock( p );
 | 
			
		||||
    p->swap( r );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class M> inline void atomic_store_explicit( shared_ptr<T> * p, shared_ptr<T> r, /*memory_order mo*/ M ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class M> inline void atomic_store_explicit( shared_ptr<T> * p, shared_ptr<T> r, /*memory_order mo*/ M ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    atomic_store( p, r ); // std::move( r )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> shared_ptr<T> atomic_exchange( shared_ptr<T> * p, shared_ptr<T> r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> shared_ptr<T> atomic_exchange( shared_ptr<T> * p, shared_ptr<T> r ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    boost::detail::spinlock & sp = boost::detail::spinlock_pool<2>::spinlock_for( p );
 | 
			
		||||
 | 
			
		||||
@@ -1116,12 +887,12 @@ template<class T> shared_ptr<T> atomic_exchange( shared_ptr<T> * p, shared_ptr<T
 | 
			
		||||
    return r; // return std::move( r )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class M> shared_ptr<T> inline atomic_exchange_explicit( shared_ptr<T> * p, shared_ptr<T> r, /*memory_order mo*/ M ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class M> shared_ptr<T> inline atomic_exchange_explicit( shared_ptr<T> * p, shared_ptr<T> r, /*memory_order mo*/ M ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return atomic_exchange( p, r ); // std::move( r )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> bool atomic_compare_exchange( shared_ptr<T> * p, shared_ptr<T> * v, shared_ptr<T> w ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> bool atomic_compare_exchange( shared_ptr<T> * p, shared_ptr<T> * v, shared_ptr<T> w ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    boost::detail::spinlock & sp = boost::detail::spinlock_pool<2>::spinlock_for( p );
 | 
			
		||||
 | 
			
		||||
@@ -1146,7 +917,7 @@ template<class T> bool atomic_compare_exchange( shared_ptr<T> * p, shared_ptr<T>
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class M> inline bool atomic_compare_exchange_explicit( shared_ptr<T> * p, shared_ptr<T> * v, shared_ptr<T> w, /*memory_order success*/ M, /*memory_order failure*/ M ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class M> inline bool atomic_compare_exchange_explicit( shared_ptr<T> * p, shared_ptr<T> * v, shared_ptr<T> w, /*memory_order success*/ M, /*memory_order failure*/ M ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return atomic_compare_exchange( p, v, w ); // std::move( w )
 | 
			
		||||
}
 | 
			
		||||
@@ -1157,7 +928,7 @@ template<class T, class M> inline bool atomic_compare_exchange_explicit( shared_
 | 
			
		||||
 | 
			
		||||
template< class T > struct hash;
 | 
			
		||||
 | 
			
		||||
template< class T > std::size_t hash_value( boost::shared_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template< class T > std::size_t hash_value( boost::shared_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return boost::hash< typename boost::shared_ptr<T>::element_type* >()( p.get() );
 | 
			
		||||
}
 | 
			
		||||
@@ -1166,14 +937,12 @@ template< class T > std::size_t hash_value( boost::shared_ptr<T> const & p ) BOO
 | 
			
		||||
 | 
			
		||||
// std::hash
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
 | 
			
		||||
 | 
			
		||||
namespace std
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<class T> struct hash< ::boost::shared_ptr<T> >
 | 
			
		||||
{
 | 
			
		||||
    std::size_t operator()( ::boost::shared_ptr<T> const & p ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    std::size_t operator()( ::boost::shared_ptr<T> const & p ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return std::hash< typename ::boost::shared_ptr<T>::element_type* >()( p.get() );
 | 
			
		||||
    }
 | 
			
		||||
@@ -1181,8 +950,6 @@ template<class T> struct hash< ::boost::shared_ptr<T> >
 | 
			
		||||
 | 
			
		||||
} // namespace std
 | 
			
		||||
 | 
			
		||||
#endif // #if !defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/local_sp_deleter.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
@@ -1191,12 +958,12 @@ namespace boost
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<class D, class T> D * basic_get_local_deleter( D *, shared_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class D, class T> D * basic_get_local_deleter( D *, shared_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return static_cast<D *>( p._internal_get_local_deleter( BOOST_SP_TYPEID_(local_sp_deleter<D>) ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class D, class T> D const * basic_get_local_deleter( D const *, shared_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class D, class T> D const * basic_get_local_deleter( D const *, shared_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return static_cast<D *>( p._internal_get_local_deleter( BOOST_SP_TYPEID_(local_sp_deleter<D>) ) );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,6 @@
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/shared_count.hpp>
 | 
			
		||||
#include <boost/smart_ptr/shared_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
@@ -33,29 +32,24 @@ public:
 | 
			
		||||
 | 
			
		||||
    typedef typename boost::detail::sp_element< T >::type element_type;
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR weak_ptr() BOOST_SP_NOEXCEPT : px(0), pn()
 | 
			
		||||
    constexpr weak_ptr() noexcept : px(0), pn()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
//  generated copy constructor, assignment, destructor are fine...
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
// ... except in C++0x, move disables the implicit copy
 | 
			
		||||
 | 
			
		||||
    weak_ptr( weak_ptr const & r ) BOOST_SP_NOEXCEPT : px( r.px ), pn( r.pn )
 | 
			
		||||
    weak_ptr( weak_ptr const & r ) noexcept : px( r.px ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_ptr & operator=( weak_ptr const & r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    weak_ptr & operator=( weak_ptr const & r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        px = r.px;
 | 
			
		||||
        pn = r.pn;
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  The "obvious" converting constructor implementation:
 | 
			
		||||
//
 | 
			
		||||
@@ -74,33 +68,15 @@ public:
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
    weak_ptr( weak_ptr<Y> const & r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() )
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    weak_ptr( weak_ptr<Y> const & r )
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    BOOST_SP_NOEXCEPT : px(r.lock().get()), pn(r.pn)
 | 
			
		||||
    noexcept : px(r.lock().get()), pn(r.pn)
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y, T >();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
    weak_ptr( weak_ptr<Y> && r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() )
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    weak_ptr( weak_ptr<Y> && r )
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    BOOST_SP_NOEXCEPT : px( r.lock().get() ), pn( static_cast< boost::detail::weak_count && >( r.pn ) )
 | 
			
		||||
    noexcept : px( r.lock().get() ), pn( static_cast< boost::detail::weak_count && >( r.pn ) )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y, T >();
 | 
			
		||||
        r.px = 0;
 | 
			
		||||
@@ -108,57 +84,41 @@ public:
 | 
			
		||||
 | 
			
		||||
    // for better efficiency in the T == Y case
 | 
			
		||||
    weak_ptr( weak_ptr && r )
 | 
			
		||||
    BOOST_SP_NOEXCEPT : px( r.px ), pn( static_cast< boost::detail::weak_count && >( r.pn ) )
 | 
			
		||||
    noexcept : px( r.px ), pn( static_cast< boost::detail::weak_count && >( r.pn ) )
 | 
			
		||||
    {
 | 
			
		||||
        r.px = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // for better efficiency in the T == Y case
 | 
			
		||||
    weak_ptr & operator=( weak_ptr && r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    weak_ptr & operator=( weak_ptr && r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type( static_cast< weak_ptr && >( r ) ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
    weak_ptr( shared_ptr<Y> const & r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() )
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    weak_ptr( shared_ptr<Y> const & r )
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    BOOST_SP_NOEXCEPT : px( r.px ), pn( r.pn )
 | 
			
		||||
    noexcept : px( r.px ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y, T >();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // aliasing
 | 
			
		||||
    template<class Y> weak_ptr(shared_ptr<Y> const & r, element_type * p) BOOST_SP_NOEXCEPT: px( p ), pn( r.pn )
 | 
			
		||||
    template<class Y> weak_ptr(shared_ptr<Y> const & r, element_type * p) noexcept: px( p ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> weak_ptr(weak_ptr<Y> const & r, element_type * p) BOOST_SP_NOEXCEPT: px( p ), pn( r.pn )
 | 
			
		||||
    template<class Y> weak_ptr(weak_ptr<Y> const & r, element_type * p) noexcept: px( p ), pn( r.pn )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    template<class Y> weak_ptr(weak_ptr<Y> && r, element_type * p) BOOST_SP_NOEXCEPT: px( p ), pn( std::move( r.pn ) )
 | 
			
		||||
    template<class Y> weak_ptr(weak_ptr<Y> && r, element_type * p) noexcept: px( p ), pn( std::move( r.pn ) )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_MSVC) || (BOOST_MSVC >= 1300)
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    weak_ptr & operator=( weak_ptr<Y> const & r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    weak_ptr & operator=( weak_ptr<Y> const & r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y, T >();
 | 
			
		||||
 | 
			
		||||
@@ -168,19 +128,15 @@ public:
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    weak_ptr & operator=( weak_ptr<Y> && r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    weak_ptr & operator=( weak_ptr<Y> && r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type( static_cast< weak_ptr<Y> && >( r ) ).swap( *this );
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    weak_ptr & operator=( shared_ptr<Y> const & r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    weak_ptr & operator=( shared_ptr<Y> const & r ) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_assert_convertible< Y, T >();
 | 
			
		||||
 | 
			
		||||
@@ -190,92 +146,83 @@ public:
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    shared_ptr<T> lock() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    shared_ptr<T> lock() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return shared_ptr<T>( *this, boost::detail::sp_nothrow_tag() );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    long use_count() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn.use_count();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool expired() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool expired() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn.use_count() == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool _empty() const BOOST_SP_NOEXCEPT // extension, not in std::weak_ptr
 | 
			
		||||
    bool _empty() const noexcept // extension, not in std::weak_ptr
 | 
			
		||||
    {
 | 
			
		||||
        return pn.empty();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool empty() const BOOST_SP_NOEXCEPT // extension, not in std::weak_ptr
 | 
			
		||||
    bool empty() const noexcept // extension, not in std::weak_ptr
 | 
			
		||||
    {
 | 
			
		||||
        return pn.empty();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void reset() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void reset() noexcept
 | 
			
		||||
    {
 | 
			
		||||
        this_type().swap(*this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void swap(this_type & other) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void swap(this_type & other) noexcept
 | 
			
		||||
    {
 | 
			
		||||
        std::swap(px, other.px);
 | 
			
		||||
        pn.swap(other.pn);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_before( weak_ptr<Y> const & rhs ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class Y> bool owner_before( weak_ptr<Y> const & rhs ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn < rhs.pn;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_before( shared_ptr<Y> const & rhs ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class Y> bool owner_before( shared_ptr<Y> const & rhs ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn < rhs.pn;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_equals( weak_ptr<Y> const & rhs ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class Y> bool owner_equals( weak_ptr<Y> const & rhs ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn == rhs.pn;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_equals( shared_ptr<Y> const & rhs ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    template<class Y> bool owner_equals( shared_ptr<Y> const & rhs ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn == rhs.pn;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::size_t owner_hash_value() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    std::size_t owner_hash_value() const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return pn.hash_value();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
// Tasteless as this may seem, making all members public allows member templates
 | 
			
		||||
// to work in the absence of member template friends. (Matthew Langston)
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    template<class Y> friend class weak_ptr;
 | 
			
		||||
    template<class Y> friend class shared_ptr;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    element_type * px;            // contained pointer
 | 
			
		||||
    boost::detail::weak_count pn; // reference counter
 | 
			
		||||
 | 
			
		||||
};  // weak_ptr
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator<(weak_ptr<T> const & a, weak_ptr<U> const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T, class U> inline bool operator<(weak_ptr<T> const & a, weak_ptr<U> const & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return a.owner_before( b );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> void swap(weak_ptr<T> & a, weak_ptr<T> & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
template<class T> void swap(weak_ptr<T> & a, weak_ptr<T> & b) noexcept
 | 
			
		||||
{
 | 
			
		||||
    a.swap(b);
 | 
			
		||||
}
 | 
			
		||||
@@ -288,7 +235,7 @@ template<class T> weak_ptr( shared_ptr<T> ) -> weak_ptr<T>;
 | 
			
		||||
 | 
			
		||||
// hash_value
 | 
			
		||||
 | 
			
		||||
template< class T > std::size_t hash_value( boost::weak_ptr<T> const & p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
template< class T > std::size_t hash_value( boost::weak_ptr<T> const & p ) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return p.owner_hash_value();
 | 
			
		||||
}
 | 
			
		||||
@@ -300,21 +247,17 @@ template< class T > std::size_t hash_value( boost::weak_ptr<T> const & p ) BOOST
 | 
			
		||||
namespace std
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
 | 
			
		||||
 | 
			
		||||
template<class T> struct hash< ::boost::weak_ptr<T> >
 | 
			
		||||
{
 | 
			
		||||
    std::size_t operator()( ::boost::weak_ptr<T> const & p ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    std::size_t operator()( ::boost::weak_ptr<T> const & p ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return p.owner_hash_value();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // #if !defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
 | 
			
		||||
 | 
			
		||||
template<class T> struct equal_to< ::boost::weak_ptr<T> >
 | 
			
		||||
{
 | 
			
		||||
    bool operator()( ::boost::weak_ptr<T> const & a, ::boost::weak_ptr<T> const & b ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool operator()( ::boost::weak_ptr<T> const & a, ::boost::weak_ptr<T> const & b ) const noexcept
 | 
			
		||||
    {
 | 
			
		||||
        return a.owner_equals( b );
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@
 | 
			
		||||
        "Memory"
 | 
			
		||||
    ],
 | 
			
		||||
    "maintainers": [
 | 
			
		||||
        "Peter Dimov <pdimov -at- pdimov.com>"
 | 
			
		||||
    ]
 | 
			
		||||
        "Peter Dimov <pdimov -at- gmail.com>"
 | 
			
		||||
    ],
 | 
			
		||||
    "cxxstd": "11"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,6 @@ if(HAVE_BOOST_TEST)
 | 
			
		||||
set(THREADS_PREFER_PTHREAD_FLAG ON)
 | 
			
		||||
find_package(Threads)
 | 
			
		||||
 | 
			
		||||
boost_test_jamfile(FILE Jamfile LINK_LIBRARIES Boost::smart_ptr Boost::core Boost::align Boost::atomic Boost::container_hash Boost::bind Threads::Threads)
 | 
			
		||||
boost_test_jamfile(FILE Jamfile LINK_LIBRARIES Boost::smart_ptr Boost::core Boost::align Boost::atomic Boost::container_hash Boost::bind Boost::move Threads::Threads)
 | 
			
		||||
 | 
			
		||||
endif()
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user