mirror of
				https://github.com/boostorg/smart_ptr.git
				synced 2025-11-03 01:01:54 +01:00 
			
		
		
		
	Compare commits
	
		
			198 Commits
		
	
	
		
			boost-1.70
			...
			boost-1.82
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					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 | ||
| 
						 | 
					d38f64ded9 | ||
| 
						 | 
					b66fe51566 | ||
| 
						 | 
					1b5568d585 | ||
| 
						 | 
					fad0c20263 | ||
| 
						 | 
					1c61e54b13 | ||
| 
						 | 
					a0fc1e6daa | ||
| 
						 | 
					5dd84ea389 | ||
| 
						 | 
					bc677e9098 | ||
| 
						 | 
					688cfed63e | ||
| 
						 | 
					c63dc266b9 | ||
| 
						 | 
					6c181a0707 | ||
| 
						 | 
					4047290b85 | ||
| 
						 | 
					dc6c76d7e9 | ||
| 
						 | 
					5a18ffdc56 | ||
| 
						 | 
					09fdd5ebfd | ||
| 
						 | 
					911874e139 | ||
| 
						 | 
					c7c0eacb74 | ||
| 
						 | 
					9ed9f43ca8 | ||
| 
						 | 
					0ddf990869 | ||
| 
						 | 
					a08a5f3d41 | ||
| 
						 | 
					77c2d4cad7 | ||
| 
						 | 
					fd612dc114 | ||
| 
						 | 
					e67ebef9a7 | ||
| 
						 | 
					6f5b9c7b37 | ||
| 
						 | 
					91f3aa0386 | ||
| 
						 | 
					686a354f21 | ||
| 
						 | 
					efceb04665 | ||
| 
						 | 
					ca57860ae2 | ||
| 
						 | 
					9dcd05f918 | ||
| 
						 | 
					4b724ab3f8 | ||
| 
						 | 
					58915ca2fe | ||
| 
						 | 
					62b0e5cdf4 | ||
| 
						 | 
					951ff783b5 | ||
| 
						 | 
					6421394e70 | ||
| 
						 | 
					121312cc22 | ||
| 
						 | 
					1e5df9d551 | ||
| 
						 | 
					496127ab99 | ||
| 
						 | 
					2af343a2cb | ||
| 
						 | 
					c6b3700ef1 | ||
| 
						 | 
					2a93d30e73 | ||
| 
						 | 
					02cc561248 | ||
| 
						 | 
					066b398114 | ||
| 
						 | 
					9c43c69c14 | ||
| 
						 | 
					eb8998cd91 | ||
| 
						 | 
					df06c324a7 | ||
| 
						 | 
					0ddfab493c | ||
| 
						 | 
					a2732e207a | ||
| 
						 | 
					5be7523ebe | ||
| 
						 | 
					2320dafc03 | ||
| 
						 | 
					7ab4093f46 | ||
| 
						 | 
					296c203135 | ||
| 
						 | 
					2dd35e5fbc | ||
| 
						 | 
					977544feda | ||
| 
						 | 
					54b5498208 | ||
| 
						 | 
					da81452f1f | ||
| 
						 | 
					7b9a969215 | ||
| 
						 | 
					cd562eb053 | ||
| 
						 | 
					91cd83e5bf | ||
| 
						 | 
					2fdb8c4b0a | ||
| 
						 | 
					e806b53433 | ||
| 
						 | 
					e0c7bd9a7e | ||
| 
						 | 
					766ab05a12 | ||
| 
						 | 
					05cbefd28e | ||
| 
						 | 
					bfbdf4f45f | ||
| 
						 | 
					169c0cd52a | ||
| 
						 | 
					7d70691a16 | ||
| 
						 | 
					90c27d7cfa | ||
| 
						 | 
					43d1fe12c5 | ||
| 
						 | 
					a2749dddb4 | ||
| 
						 | 
					a71e62146c | ||
| 
						 | 
					274ec17836 | ||
| 
						 | 
					a7341070f1 | ||
| 
						 | 
					a6323354cd | ||
| 
						 | 
					f788448101 | ||
| 
						 | 
					283f2d2a11 | ||
| 
						 | 
					034f94617d | ||
| 
						 | 
					6a5f67b3a2 | ||
| 
						 | 
					dcd3c8ef80 | ||
| 
						 | 
					bb2a453ff6 | ||
| 
						 | 
					e56eec70ca | ||
| 
						 | 
					60c26acab8 | ||
| 
						 | 
					00f6b5dcb0 | ||
| 
						 | 
					6195ae1eb0 | ||
| 
						 | 
					30291c406a | ||
| 
						 | 
					610f19f247 | ||
| 
						 | 
					876d40a9ab | ||
| 
						 | 
					e4d642c46a | ||
| 
						 | 
					3dffa64f58 | ||
| 
						 | 
					af92bd89ef | ||
| 
						 | 
					4742143605 | ||
| 
						 | 
					872bf10347 | ||
| 
						 | 
					c0ae9b3728 | ||
| 
						 | 
					1298c2e8e5 | ||
| 
						 | 
					d593061b15 | ||
| 
						 | 
					5072045f12 | ||
| 
						 | 
					442e179920 | ||
| 
						 | 
					9544a8cb91 | ||
| 
						 | 
					5823d6bcc9 | ||
| 
						 | 
					f56e609757 | ||
| 
						 | 
					8df63a3d0e | ||
| 
						 | 
					4b6cb1223b | ||
| 
						 | 
					719e819570 | ||
| 
						 | 
					a571b3a250 | ||
| 
						 | 
					f17c5e8e3b | ||
| 
						 | 
					e306b30dcf | ||
| 
						 | 
					b6b49ef591 | ||
| 
						 | 
					2122c7753c | ||
| 
						 | 
					7c76fb385d | ||
| 
						 | 
					372fac679b | ||
| 
						 | 
					e3adcaed1e | ||
| 
						 | 
					016e682af6 | ||
| 
						 | 
					78e095d761 | ||
| 
						 | 
					eb8a91cb46 | ||
| 
						 | 
					513cd15378 | ||
| 
						 | 
					7bfa6a1f3d | ||
| 
						 | 
					8120bb44cb | ||
| 
						 | 
					18974ea2db | ||
| 
						 | 
					2a4aca403a | ||
| 
						 | 
					4d0d81477c | ||
| 
						 | 
					1725e26f70 | ||
| 
						 | 
					47fffaf11c | ||
| 
						 | 
					7f0323a347 | ||
| 
						 | 
					6d8ea0f0c4 | ||
| 
						 | 
					d10299159a | ||
| 
						 | 
					adcab0e313 | 
							
								
								
									
										381
									
								
								.drone.jsonnet
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										381
									
								
								.drone.jsonnet
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,381 @@
 | 
			
		||||
# 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',
 | 
			
		||||
                '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.4",
 | 
			
		||||
        "cppalliance/droneubuntu1404:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-4.4', CXXSTD: '98,0x' },
 | 
			
		||||
        "g++-4.4",
 | 
			
		||||
        [ "ppa:ubuntu-toolchain-r/test" ],
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 14.04 GCC 4.6",
 | 
			
		||||
        "cppalliance/droneubuntu1404:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-4.6', CXXSTD: '98,0x' },
 | 
			
		||||
        "g++-4.6",
 | 
			
		||||
        [ "ppa:ubuntu-toolchain-r/test" ],
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 14.04 GCC 4.7",
 | 
			
		||||
        "cppalliance/droneubuntu1404:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-4.7', CXXSTD: '98,0x' },
 | 
			
		||||
        "g++-4.7",
 | 
			
		||||
        [ "ppa:ubuntu-toolchain-r/test" ],
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 14.04 GCC 4.8*",
 | 
			
		||||
        "cppalliance/droneubuntu1404:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11' },
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 14.04 GCC 4.9",
 | 
			
		||||
        "cppalliance/droneubuntu1404:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-4.9', CXXSTD: '03,11' },
 | 
			
		||||
        "g++-4.9",
 | 
			
		||||
        [ "ppa:ubuntu-toolchain-r/test" ],
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 16.04 GCC 5*",
 | 
			
		||||
        "cppalliance/droneubuntu1604:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14' },
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 18.04 GCC 6",
 | 
			
		||||
        "cppalliance/droneubuntu1804:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-6', CXXSTD: '03,11,14' },
 | 
			
		||||
        "g++-6",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 18.04 GCC 7* 32/64",
 | 
			
		||||
        "cppalliance/droneubuntu1804:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14,17', ADDRMD: '32,64' },
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 18.04 GCC 8 32/64",
 | 
			
		||||
        "cppalliance/droneubuntu1804:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-8', CXXSTD: '03,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: '03,11,14,17,2a', ADDRMD: '32,64' },
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 GCC 9* ARM64",
 | 
			
		||||
        "cppalliance/droneubuntu2004:multiarch",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14,17,2a' },
 | 
			
		||||
        arch="arm64",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 GCC 9* S390x",
 | 
			
		||||
        "cppalliance/droneubuntu2004:multiarch",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++', CXXSTD: '03,11,14,17,2a' },
 | 
			
		||||
        arch="s390x",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 GCC 10 32/64",
 | 
			
		||||
        "cppalliance/droneubuntu2004:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-10', CXXSTD: '03,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: '03,11,14,17,2a', ADDRMD: '32,64' },
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 22.04 GCC 12 32 ASAN",
 | 
			
		||||
        "cppalliance/droneubuntu2204:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '03,11,14,17,20,2b', ADDRMD: '32' } + asan,
 | 
			
		||||
        "g++-12-multilib",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 22.04 GCC 12 64 ASAN",
 | 
			
		||||
        "cppalliance/droneubuntu2204:1",
 | 
			
		||||
        { TOOLSET: 'gcc', COMPILER: 'g++-12', CXXSTD: '03,11,14,17,20,2b', ADDRMD: '64' } + asan,
 | 
			
		||||
        "g++-12-multilib",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 16.04 Clang 3.5",
 | 
			
		||||
        "cppalliance/droneubuntu1604:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-3.5', CXXSTD: '03,11' },
 | 
			
		||||
        "clang-3.5",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 16.04 Clang 3.6",
 | 
			
		||||
        "cppalliance/droneubuntu1604:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-3.6', CXXSTD: '03,11,14' },
 | 
			
		||||
        "clang-3.6",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 16.04 Clang 3.7",
 | 
			
		||||
        "cppalliance/droneubuntu1604:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-3.7', CXXSTD: '03,11,14' },
 | 
			
		||||
        "clang-3.7",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 16.04 Clang 3.8",
 | 
			
		||||
        "cppalliance/droneubuntu1604:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-3.8', CXXSTD: '03,11,14' },
 | 
			
		||||
        "clang-3.8",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 18.04 Clang 3.9",
 | 
			
		||||
        "cppalliance/droneubuntu1804:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-3.9', CXXSTD: '03,11,14' },
 | 
			
		||||
        "clang-3.9",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 18.04 Clang 4.0",
 | 
			
		||||
        "cppalliance/droneubuntu1804:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-4.0', CXXSTD: '03,11,14' },
 | 
			
		||||
        "clang-4.0",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 18.04 Clang 5.0",
 | 
			
		||||
        "cppalliance/droneubuntu1804:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-5.0', CXXSTD: '03,11,14' },
 | 
			
		||||
        "clang-5.0",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 Clang 6.0",
 | 
			
		||||
        "cppalliance/droneubuntu2004:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-6.0', CXXSTD: '03,11,14,17' },
 | 
			
		||||
        "clang-6.0",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 Clang 7",
 | 
			
		||||
        "cppalliance/droneubuntu2004:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-7', CXXSTD: '03,11,14,17' },
 | 
			
		||||
        "clang-7",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 Clang 8",
 | 
			
		||||
        "cppalliance/droneubuntu2004:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-8', CXXSTD: '03,11,14,17' },
 | 
			
		||||
        "clang-8",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 Clang 9",
 | 
			
		||||
        "cppalliance/droneubuntu2004:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-9', CXXSTD: '03,11,14,17,2a' },
 | 
			
		||||
        "clang-9",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 Clang 10",
 | 
			
		||||
        "cppalliance/droneubuntu2004:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-10', CXXSTD: '03,11,14,17,2a' },
 | 
			
		||||
        "clang-10",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 Clang 11",
 | 
			
		||||
        "cppalliance/droneubuntu2004:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-11', CXXSTD: '03,11,14,17,2a' },
 | 
			
		||||
        "clang-11",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 20.04 Clang 12",
 | 
			
		||||
        "cppalliance/droneubuntu2004:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-12', CXXSTD: '03,11,14,17,20' },
 | 
			
		||||
        "clang-12",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 22.04 Clang 13",
 | 
			
		||||
        "cppalliance/droneubuntu2204:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-13', CXXSTD: '03,11,14,17,20,2b' },
 | 
			
		||||
        "clang-13",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 22.04 Clang 14",
 | 
			
		||||
        "cppalliance/droneubuntu2204:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-14', CXXSTD: '03,11,14,17,20,2b' },
 | 
			
		||||
        "clang-14",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 22.04 Clang 15 UBSAN",
 | 
			
		||||
        "cppalliance/droneubuntu2204:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-15', CXXSTD: '03,11,14,17,20,2b' } + ubsan,
 | 
			
		||||
        "clang-15",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    linux_pipeline(
 | 
			
		||||
        "Linux 22.04 Clang 15 ASAN",
 | 
			
		||||
        "cppalliance/droneubuntu2204:1",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++-15', CXXSTD: '03,11,14,17,20,2b' } + asan,
 | 
			
		||||
        "clang-15",
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    macos_pipeline(
 | 
			
		||||
        "MacOS 10.15 Xcode 12.2 UBSAN",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '03,11,14,1z' } + ubsan,
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    macos_pipeline(
 | 
			
		||||
        "MacOS 10.15 Xcode 12.2 ASAN",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '03,11,14,1z' } + asan,
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    macos_pipeline(
 | 
			
		||||
        "MacOS 12.4 Xcode 13.4.1 UBSAN",
 | 
			
		||||
        { TOOLSET: 'clang', COMPILER: 'clang++', CXXSTD: '03,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: '03,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' },
 | 
			
		||||
    ),
 | 
			
		||||
 | 
			
		||||
    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}
 | 
			
		||||
							
								
								
									
										589
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										589
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,589 @@
 | 
			
		||||
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: "03,11"
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            container: ubuntu:18.04
 | 
			
		||||
            install: g++-4.8-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-5
 | 
			
		||||
            cxxstd: "03,11,14,1z"
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            container: ubuntu:18.04
 | 
			
		||||
            install: g++-5-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-6
 | 
			
		||||
            cxxstd: "03,11,14,1z"
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            container: ubuntu:18.04
 | 
			
		||||
            install: g++-6-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-7
 | 
			
		||||
            cxxstd: "03,11,14,17"
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            container: ubuntu:18.04
 | 
			
		||||
            install: g++-7-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-8
 | 
			
		||||
            cxxstd: "03,11,14,17,2a"
 | 
			
		||||
            os: ubuntu-20.04
 | 
			
		||||
            install: g++-8-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-9
 | 
			
		||||
            cxxstd: "03,11,14,17,2a"
 | 
			
		||||
            os: ubuntu-20.04
 | 
			
		||||
            install: g++-9-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-10
 | 
			
		||||
            cxxstd: "03,11,14,17,2a"
 | 
			
		||||
            os: ubuntu-20.04
 | 
			
		||||
            install: g++-10-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-11
 | 
			
		||||
            cxxstd: "03,11,14,17,20"
 | 
			
		||||
            os: ubuntu-20.04
 | 
			
		||||
            install: g++-11-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: gcc-12
 | 
			
		||||
            cxxstd: "03,11,14,17,20,2b"
 | 
			
		||||
            os: ubuntu-22.04
 | 
			
		||||
            install: g++-12-multilib
 | 
			
		||||
            address-model: 32,64
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-3.9
 | 
			
		||||
            cxxstd: "03,11,14"
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            container: ubuntu:18.04
 | 
			
		||||
            install: clang-3.9
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-4.0
 | 
			
		||||
            cxxstd: "03,11,14"
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            container: ubuntu:18.04
 | 
			
		||||
            install: clang-4.0
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-5.0
 | 
			
		||||
            cxxstd: "03,11,14,1z"
 | 
			
		||||
            os: ubuntu-latest
 | 
			
		||||
            container: ubuntu:18.04
 | 
			
		||||
            install: clang-5.0
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-6.0
 | 
			
		||||
            cxxstd: "03,11,14,17"
 | 
			
		||||
            os: ubuntu-20.04
 | 
			
		||||
            install: clang-6.0
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-7
 | 
			
		||||
            cxxstd: "03,11,14,17"
 | 
			
		||||
            os: ubuntu-20.04
 | 
			
		||||
            install: clang-7
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-8
 | 
			
		||||
            cxxstd: "03,11,14,17"
 | 
			
		||||
            os: ubuntu-20.04
 | 
			
		||||
            install: clang-8
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-9
 | 
			
		||||
            cxxstd: "03,11,14,17,2a"
 | 
			
		||||
            os: ubuntu-20.04
 | 
			
		||||
            install: clang-9
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-10
 | 
			
		||||
            cxxstd: "03,11,14,17,2a"
 | 
			
		||||
            os: ubuntu-20.04
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-11
 | 
			
		||||
            cxxstd: "03,11,14,17,2a"
 | 
			
		||||
            os: ubuntu-20.04
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-12
 | 
			
		||||
            cxxstd: "03,11,14,17,20"
 | 
			
		||||
            os: ubuntu-20.04
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-13
 | 
			
		||||
            cxxstd: "03,11,14,17,20,2b"
 | 
			
		||||
            os: ubuntu-22.04
 | 
			
		||||
            install: clang-13
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-14
 | 
			
		||||
            cxxstd: "03,11,14,17,20,2b"
 | 
			
		||||
            os: ubuntu-22.04
 | 
			
		||||
            install: clang-14
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            compiler: clang++-15
 | 
			
		||||
            cxxstd: "03,11,14,17,20,2b"
 | 
			
		||||
            os: ubuntu-22.04
 | 
			
		||||
            install: clang-15
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            cxxstd: "03,11,14,17,2a"
 | 
			
		||||
            os: macos-11
 | 
			
		||||
          - toolset: clang
 | 
			
		||||
            cxxstd: "03,11,14,17,20,2b"
 | 
			
		||||
            os: macos-12
 | 
			
		||||
 | 
			
		||||
    runs-on: ${{matrix.os}}
 | 
			
		||||
    container: ${{matrix.container}}
 | 
			
		||||
 | 
			
		||||
    defaults:
 | 
			
		||||
      run:
 | 
			
		||||
        shell: bash
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - name: Setup container environment
 | 
			
		||||
        if: matrix.container
 | 
			
		||||
        run: |
 | 
			
		||||
          apt-get update
 | 
			
		||||
          apt-get -y install sudo python git g++
 | 
			
		||||
 | 
			
		||||
      - 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
 | 
			
		||||
          ./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.0
 | 
			
		||||
            cxxstd: 14,latest
 | 
			
		||||
            addrmd: 32,64
 | 
			
		||||
            os: windows-2019
 | 
			
		||||
          - toolset: msvc-14.2
 | 
			
		||||
            cxxstd: "14,17,20,latest"
 | 
			
		||||
            addrmd: 32,64
 | 
			
		||||
            os: windows-2019
 | 
			
		||||
          - toolset: msvc-14.3
 | 
			
		||||
            cxxstd: "14,17,20,latest"
 | 
			
		||||
            addrmd: 32,64
 | 
			
		||||
            os: windows-2022
 | 
			
		||||
          - toolset: clang-win
 | 
			
		||||
            cxxstd: "14,17,latest"
 | 
			
		||||
            addrmd: 32,64
 | 
			
		||||
            os: windows-2022
 | 
			
		||||
          - toolset: gcc
 | 
			
		||||
            cxxstd: "03,11,14,17,2a"
 | 
			
		||||
            addrmd: 64
 | 
			
		||||
            os: windows-2019
 | 
			
		||||
 | 
			
		||||
    runs-on: ${{matrix.os}}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - 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-20.04
 | 
			
		||||
          - os: ubuntu-22.04
 | 
			
		||||
          - os: macos-11
 | 
			
		||||
          - os: macos-12
 | 
			
		||||
 | 
			
		||||
    runs-on: ${{matrix.os}}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - 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-20.04
 | 
			
		||||
          - os: ubuntu-22.04
 | 
			
		||||
          - os: macos-11
 | 
			
		||||
          - os: macos-12
 | 
			
		||||
 | 
			
		||||
    runs-on: ${{matrix.os}}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - 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-20.04
 | 
			
		||||
          - os: ubuntu-22.04
 | 
			
		||||
          - os: macos-11
 | 
			
		||||
          - os: macos-12
 | 
			
		||||
 | 
			
		||||
    runs-on: ${{matrix.os}}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - 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-2019
 | 
			
		||||
          - os: windows-2022
 | 
			
		||||
 | 
			
		||||
    runs-on: ${{matrix.os}}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - 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-2019
 | 
			
		||||
          - os: windows-2022
 | 
			
		||||
 | 
			
		||||
    runs-on: ${{matrix.os}}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - 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-2019
 | 
			
		||||
          - os: windows-2022
 | 
			
		||||
 | 
			
		||||
    runs-on: ${{matrix.os}}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - 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
 | 
			
		||||
							
								
								
									
										287
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										287
									
								
								.travis.yml
									
									
									
									
									
								
							@@ -1,10 +1,10 @@
 | 
			
		||||
# Copyright 2016-2019 Peter Dimov
 | 
			
		||||
# Copyright 2016-2020 Peter Dimov
 | 
			
		||||
# Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 | 
			
		||||
language: cpp
 | 
			
		||||
 | 
			
		||||
sudo: false
 | 
			
		||||
dist: xenial
 | 
			
		||||
 | 
			
		||||
branches:
 | 
			
		||||
  only:
 | 
			
		||||
@@ -23,12 +23,47 @@ matrix:
 | 
			
		||||
 | 
			
		||||
  include:
 | 
			
		||||
    - os: linux
 | 
			
		||||
      dist: trusty
 | 
			
		||||
      compiler: g++
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++ CXXSTD=03,11
 | 
			
		||||
      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 CXXSTD=03,11,14
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      arch: ppc64le
 | 
			
		||||
      compiler: g++
 | 
			
		||||
      env: TOOLSET=gcc CXXSTD=03,11,14
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      arch: s390x
 | 
			
		||||
      compiler: g++
 | 
			
		||||
      env: TOOLSET=gcc CXXSTD=03,11,14
 | 
			
		||||
 | 
			
		||||
    - os: freebsd
 | 
			
		||||
      compiler: clang++
 | 
			
		||||
      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:
 | 
			
		||||
@@ -38,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:
 | 
			
		||||
@@ -47,227 +82,59 @@ matrix:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: g++-4.7
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=03,11
 | 
			
		||||
      dist: bionic
 | 
			
		||||
      compiler: g++-10
 | 
			
		||||
      env: UBSAN=1 TOOLSET=gcc CXXSTD=03,11,14 UBSAN_OPTIONS=print_stacktrace=1 LINKFLAGS=-fuse-ld=gold
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-4.7
 | 
			
		||||
            - g++-10
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: g++-4.8
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=03,11
 | 
			
		||||
      dist: bionic
 | 
			
		||||
      compiler: g++-10
 | 
			
		||||
      env: UBSAN=1 TOOLSET=gcc CXXSTD=17,2a UBSAN_OPTIONS=print_stacktrace=1 LINKFLAGS=-fuse-ld=gold
 | 
			
		||||
      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
 | 
			
		||||
            - g++-10
 | 
			
		||||
          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,17,2a
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-8
 | 
			
		||||
          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
 | 
			
		||||
      compiler: clang++
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11
 | 
			
		||||
 | 
			
		||||
    - 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:
 | 
			
		||||
            - clang-3.3
 | 
			
		||||
 | 
			
		||||
    - 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,14,1z
 | 
			
		||||
      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
 | 
			
		||||
            - libstdc++-4.9-dev
 | 
			
		||||
            - clang-11
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
            - llvm-toolchain-precise-3.5
 | 
			
		||||
 | 
			
		||||
    - 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
 | 
			
		||||
            - llvm-toolchain-precise-3.6
 | 
			
		||||
 | 
			
		||||
    - 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
 | 
			
		||||
            - llvm-toolchain-precise-3.7
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: clang++-3.8
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=03,11,14,1z
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-3.8
 | 
			
		||||
            - libstdc++-4.9-dev
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
            - llvm-toolchain-precise-3.8
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: clang++-3.9
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=03,11,14,1z
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-3.9
 | 
			
		||||
            - libstdc++-4.9-dev
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
            - llvm-toolchain-precise-3.9
 | 
			
		||||
 | 
			
		||||
    - 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
 | 
			
		||||
            - llvm-toolchain-trusty-4.0
 | 
			
		||||
 | 
			
		||||
    - 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
 | 
			
		||||
            - llvm-toolchain-trusty-5.0
 | 
			
		||||
 | 
			
		||||
    - 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
 | 
			
		||||
            - llvm-toolchain-trusty-6.0
 | 
			
		||||
 | 
			
		||||
    - 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-trusty-7
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: clang++-7
 | 
			
		||||
      env: UBSAN=1 TOOLSET=clang COMPILER=clang++-7 CXXSTD=03,11,14,17,2a UBSAN_OPTIONS=print_stacktrace=1
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-7
 | 
			
		||||
            - libstdc++-5-dev
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
            - llvm-toolchain-trusty-7
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      compiler: clang++-libc++
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-libc++ CXXSTD=03,11,14,1z
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - libc++-dev
 | 
			
		||||
            - 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: trusty
 | 
			
		||||
      compiler: clang++-libc++
 | 
			
		||||
      env: UBSAN=1 TOOLSET=clang COMPILER=clang++-libc++ CXXSTD=03,11,14,1z UBSAN_OPTIONS=print_stacktrace=1
 | 
			
		||||
      addons:
 | 
			
		||||
@@ -275,9 +142,26 @@ matrix:
 | 
			
		||||
          packages:
 | 
			
		||||
            - libc++-dev
 | 
			
		||||
 | 
			
		||||
    - 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++
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z
 | 
			
		||||
      env: UBSAN=1 TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z UBSAN_OPTIONS=print_stacktrace=1
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: CMAKE_TEST=1
 | 
			
		||||
      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
 | 
			
		||||
      compiler: g++
 | 
			
		||||
@@ -288,6 +172,18 @@ matrix:
 | 
			
		||||
      - cmake --build .
 | 
			
		||||
      - cmake --build . --target check
 | 
			
		||||
 | 
			
		||||
    - 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
 | 
			
		||||
        - cd ../libs/smart_ptr/test/cmake_install_test && mkdir __build__ && cd __build__
 | 
			
		||||
        - cmake -DCMAKE_INSTALL_PREFIX=~/.local ..
 | 
			
		||||
        - cmake --build .
 | 
			
		||||
        - cmake --build . --target check
 | 
			
		||||
 | 
			
		||||
install:
 | 
			
		||||
  - BOOST_BRANCH=develop && [ "$TRAVIS_BRANCH" == "master" ] && BOOST_BRANCH=master || true
 | 
			
		||||
  - cd ..
 | 
			
		||||
@@ -309,14 +205,17 @@ install:
 | 
			
		||||
  - git submodule init tools/build
 | 
			
		||||
  - git submodule init libs/headers
 | 
			
		||||
  - git submodule init tools/boost_install
 | 
			
		||||
  - git submodule update --jobs 3
 | 
			
		||||
  - git submodule init tools/cmake
 | 
			
		||||
  - git submodule init libs/preprocessor
 | 
			
		||||
  - git submodule init libs/bind
 | 
			
		||||
  - git submodule update # no --jobs 3 on non-amd64
 | 
			
		||||
  - cp -r $TRAVIS_BUILD_DIR/* libs/smart_ptr
 | 
			
		||||
  - ./bootstrap.sh
 | 
			
		||||
  - ./b2 headers
 | 
			
		||||
 | 
			
		||||
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,12 +1,10 @@
 | 
			
		||||
# Copyright 2018 Mike Dev
 | 
			
		||||
# Copyright 2018-2020 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
 | 
			
		||||
 | 
			
		||||
# Partial (add_subdirectory only) and experimental CMake support
 | 
			
		||||
# Subject to change; please do not rely on the contents of this file yet
 | 
			
		||||
cmake_minimum_required(VERSION 3.5...3.16)
 | 
			
		||||
 | 
			
		||||
cmake_minimum_required(VERSION 3.5)
 | 
			
		||||
project(BoostSmartPtr LANGUAGES CXX)
 | 
			
		||||
project(boost_smart_ptr VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
 | 
			
		||||
 | 
			
		||||
add_library(boost_smart_ptr INTERFACE)
 | 
			
		||||
add_library(Boost::smart_ptr ALIAS boost_smart_ptr)
 | 
			
		||||
@@ -14,13 +12,18 @@ add_library(Boost::smart_ptr ALIAS boost_smart_ptr)
 | 
			
		||||
target_include_directories(boost_smart_ptr INTERFACE include)
 | 
			
		||||
 | 
			
		||||
target_link_libraries(boost_smart_ptr
 | 
			
		||||
    INTERFACE
 | 
			
		||||
        Boost::assert
 | 
			
		||||
        Boost::config
 | 
			
		||||
        Boost::core
 | 
			
		||||
        Boost::move
 | 
			
		||||
        Boost::predef
 | 
			
		||||
        Boost::static_assert
 | 
			
		||||
        Boost::throw_exception
 | 
			
		||||
        Boost::type_traits
 | 
			
		||||
  INTERFACE
 | 
			
		||||
    Boost::assert
 | 
			
		||||
    Boost::config
 | 
			
		||||
    Boost::core
 | 
			
		||||
    Boost::move
 | 
			
		||||
    Boost::static_assert
 | 
			
		||||
    Boost::throw_exception
 | 
			
		||||
    Boost::type_traits
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
if(BUILD_TESTING)
 | 
			
		||||
 | 
			
		||||
  add_subdirectory(test)
 | 
			
		||||
 | 
			
		||||
endif()
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										42
									
								
								appveyor.yml
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								appveyor.yml
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
# Copyright 2016-2018 Peter Dimov
 | 
			
		||||
# Copyright 2016-2019 Peter Dimov
 | 
			
		||||
# Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 | 
			
		||||
@@ -14,28 +14,33 @@ branches:
 | 
			
		||||
 | 
			
		||||
environment:
 | 
			
		||||
  matrix:
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
 | 
			
		||||
      TOOLSET: msvc-9.0,msvc-10.0,msvc-11.0,msvc-12.0
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
 | 
			
		||||
      TOOLSET: msvc-14.0
 | 
			
		||||
      TOOLSET: msvc-9.0,msvc-10.0,msvc-11.0
 | 
			
		||||
      ADDRMD: 32
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
 | 
			
		||||
      TOOLSET: msvc-12.0,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 2013
 | 
			
		||||
    - 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
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
 | 
			
		||||
      ADDPATH: C:\cygwin64\bin;
 | 
			
		||||
      TOOLSET: gcc
 | 
			
		||||
      CXXSTD: 03,11,14,1z
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
 | 
			
		||||
      ADDPATH: C:\mingw\bin;
 | 
			
		||||
      TOOLSET: gcc
 | 
			
		||||
      CXXSTD: 03,11,14,1z
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
 | 
			
		||||
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
 | 
			
		||||
      ADDPATH: C:\mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev1\mingw64\bin;
 | 
			
		||||
      TOOLSET: gcc
 | 
			
		||||
      CXXSTD: 03,11,14,1z
 | 
			
		||||
@@ -46,24 +51,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 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
 | 
			
		||||
 | 
			
		||||
@@ -73,4 +63,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
 | 
			
		||||
 
 | 
			
		||||
@@ -5,8 +5,6 @@
 | 
			
		||||
# See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
# http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
project doc/smart_ptr ;
 | 
			
		||||
 | 
			
		||||
import asciidoctor ;
 | 
			
		||||
 | 
			
		||||
html smart_ptr.html : smart_ptr.adoc ;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
<style>
 | 
			
		||||
 | 
			
		||||
*:not(pre)>code { background: none; color: #600000; }
 | 
			
		||||
:not(pre):not([class^=L])>code { background: none; color: #600000; }
 | 
			
		||||
table tr.even, table tr.alt, table tr:nth-of-type(even) { background: none; }
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -14,38 +14,32 @@ Greg Colvin, Beman Dawes, Peter Dimov, Glen Fernandes
 | 
			
		||||
:idprefix:
 | 
			
		||||
:listing-caption: Code Example
 | 
			
		||||
:docinfo: private-footer
 | 
			
		||||
:source-highlighter: rouge
 | 
			
		||||
:source-language: c++
 | 
			
		||||
 | 
			
		||||
:leveloffset: +1
 | 
			
		||||
 | 
			
		||||
include::smart_ptr/introduction.adoc[]
 | 
			
		||||
 | 
			
		||||
include::smart_ptr/changelog.adoc[]
 | 
			
		||||
include::smart_ptr/scoped_ptr.adoc[]
 | 
			
		||||
 | 
			
		||||
include::smart_ptr/scoped_array.adoc[]
 | 
			
		||||
 | 
			
		||||
include::smart_ptr/shared_ptr.adoc[]
 | 
			
		||||
 | 
			
		||||
include::smart_ptr/weak_ptr.adoc[]
 | 
			
		||||
 | 
			
		||||
include::smart_ptr/make_shared.adoc[]
 | 
			
		||||
 | 
			
		||||
include::smart_ptr/enable_shared_from_this.adoc[]
 | 
			
		||||
 | 
			
		||||
include::smart_ptr/enable_shared_from.adoc[]
 | 
			
		||||
include::smart_ptr/make_unique.adoc[]
 | 
			
		||||
 | 
			
		||||
include::smart_ptr/allocate_unique.adoc[]
 | 
			
		||||
include::smart_ptr/intrusive_ptr.adoc[]
 | 
			
		||||
 | 
			
		||||
include::smart_ptr/intrusive_ref_counter.adoc[]
 | 
			
		||||
 | 
			
		||||
include::smart_ptr/local_shared_ptr.adoc[]
 | 
			
		||||
 | 
			
		||||
include::smart_ptr/make_local_shared.adoc[]
 | 
			
		||||
 | 
			
		||||
include::smart_ptr/pointer_cast.adoc[]
 | 
			
		||||
 | 
			
		||||
include::smart_ptr/pointer_to_other.adoc[]
 | 
			
		||||
 | 
			
		||||
include::smart_ptr/atomic_shared_ptr.adoc[]
 | 
			
		||||
include::smart_ptr/owner_less.adoc[]
 | 
			
		||||
include::smart_ptr/owner_equal_to.adoc[]
 | 
			
		||||
include::smart_ptr/owner_hash.adoc[]
 | 
			
		||||
 | 
			
		||||
// appendix
 | 
			
		||||
include::smart_ptr/techniques.adoc[]
 | 
			
		||||
@@ -67,7 +61,7 @@ This documentation is
 | 
			
		||||
* Copyright 1999 Greg Colvin
 | 
			
		||||
* Copyright 1999 Beman Dawes
 | 
			
		||||
* Copyright 2002 Darin Adler
 | 
			
		||||
* Copyright 2003-2017 Peter Dimov
 | 
			
		||||
* Copyright 2003-2020 Peter Dimov
 | 
			
		||||
* Copyright 2005, 2006 Ion Gaztañaga
 | 
			
		||||
* Copyright 2008 Frank Mori Hess
 | 
			
		||||
* Copyright 2012-2017 Glen Fernandes
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										335
									
								
								doc/smart_ptr/allocate_unique.adoc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										335
									
								
								doc/smart_ptr/allocate_unique.adoc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,335 @@
 | 
			
		||||
////
 | 
			
		||||
Copyright 2019-2021 Glen Joseph Fernandes (glenjofe@gmail.com)
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
////
 | 
			
		||||
 | 
			
		||||
[#allocate_unique]
 | 
			
		||||
# allocate_unique: Creating unique_ptr
 | 
			
		||||
:toc:
 | 
			
		||||
:toc-title:
 | 
			
		||||
:idprefix: allocate_unique_
 | 
			
		||||
 | 
			
		||||
## Description
 | 
			
		||||
 | 
			
		||||
The `allocate_unique` family of function templates provide convenient and safe
 | 
			
		||||
ways to obtain a `std::unique_ptr` that manages a new object created using an
 | 
			
		||||
allocator.
 | 
			
		||||
 | 
			
		||||
## Rationale
 | 
			
		||||
 | 
			
		||||
The {cpp}14 standard introduced `std::make_unique` which used operator `new` to
 | 
			
		||||
create new objects. However, there is no convenient facility in the standard
 | 
			
		||||
library to use an allocator for the creation of the objects managed by
 | 
			
		||||
`std::unique_ptr`. Users writing allocator aware code have often requested an
 | 
			
		||||
`allocate_unique` factory function. This function is to `std::unique_ptr` what
 | 
			
		||||
`std::allocate_shared` is to `std::shared_ptr`.
 | 
			
		||||
 | 
			
		||||
## Synopsis
 | 
			
		||||
 | 
			
		||||
`allocate_unique` is defined in `<boost/smart_ptr/allocate_unique.hpp>`.
 | 
			
		||||
 | 
			
		||||
[subs=+quotes]
 | 
			
		||||
```
 | 
			
		||||
namespace boost {
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
  class alloc_deleter;
 | 
			
		||||
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
  using alloc_noinit_deleter = alloc_deleter<T, noinit_adaptor<A>>;
 | 
			
		||||
 | 
			
		||||
  `// T is not an array`
 | 
			
		||||
  template<class T, class A, class... Args>
 | 
			
		||||
    std::unique_ptr<T, alloc_deleter<T, A>>
 | 
			
		||||
      allocate_unique(const A& a, Args&&... args);
 | 
			
		||||
 | 
			
		||||
  `// T is not an array`
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
    std::unique_ptr<T, alloc_deleter<T, A>>
 | 
			
		||||
      allocate_unique(const A& a, type_identity_t<T>&& v);
 | 
			
		||||
 | 
			
		||||
  `// T is an array of unknown bounds`
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
    std::unique_ptr<T, alloc_deleter<T, A>>
 | 
			
		||||
      allocate_unique(const A& a, std::size_t n);
 | 
			
		||||
 | 
			
		||||
  `// T is an array of known bounds`
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
    std::unique_ptr<remove_extent_t<T>[], alloc_deleter<T, A>>
 | 
			
		||||
      allocate_unique(const A& a);
 | 
			
		||||
 | 
			
		||||
  `// T is an array of unknown bounds`
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
    std::unique_ptr<T, alloc_deleter<T, A>>
 | 
			
		||||
      allocate_unique(const A& a, std::size_t n, const remove_extent_t<T>& v);
 | 
			
		||||
 | 
			
		||||
  `// T is an array of known bounds`
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
    std::unique_ptr<remove_extent_t<T>[], alloc_deleter<T, A>>
 | 
			
		||||
      allocate_unique(const A& a, const remove_extent_t<T>& v);
 | 
			
		||||
 | 
			
		||||
  `// T is not an array`
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
    std::unique_ptr<T, alloc_noinit_deleter<T, A>>
 | 
			
		||||
      allocate_unique_noinit(const A& a);
 | 
			
		||||
 | 
			
		||||
  `// T is an array of unknown bounds`
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
    std::unique_ptr<T, alloc_noinit_deleter<T, A>>
 | 
			
		||||
      allocate_unique_noinit(const A& a, std::size_t n);
 | 
			
		||||
 | 
			
		||||
  `// T is an array of known bounds`
 | 
			
		||||
  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;
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Common Requirements
 | 
			
		||||
 | 
			
		||||
The common requirements that apply to all `allocate_unique` and
 | 
			
		||||
`allocate_unique_noinit` overloads, unless specified otherwise, are described
 | 
			
		||||
below.
 | 
			
		||||
 | 
			
		||||
Requires:: `A` shall be an _allocator_. The copy constructor and destructor
 | 
			
		||||
of `A` shall not throw exceptions.
 | 
			
		||||
 | 
			
		||||
Effects:: Allocates memory for an object of type `T` or `n` objects of `U`
 | 
			
		||||
(if `T` is an array type of the form `U[]` and  `n` is determined by
 | 
			
		||||
arguments, as specified by the concrete overload). The object is initialized
 | 
			
		||||
from arguments as specified by the concrete overload. Uses a rebound copy of
 | 
			
		||||
`a` (for an unspecified `value_type`) to allocate memory. If an exception is
 | 
			
		||||
thrown, the functions have no effect.
 | 
			
		||||
 | 
			
		||||
Returns:: A `std::unique_ptr` instance that stores and owns the address of the
 | 
			
		||||
newly constructed object.
 | 
			
		||||
 | 
			
		||||
Postconditions:: `r.get() != 0`, where `r` is the return value.
 | 
			
		||||
 | 
			
		||||
Throws:: An exception thrown from `A::allocate`, or from the initialization of
 | 
			
		||||
the object.
 | 
			
		||||
 | 
			
		||||
Remarks::
 | 
			
		||||
* When an object of an array type is specified to be initialized to a value of
 | 
			
		||||
the same type `v`, this shall be interpreted to mean that each array element
 | 
			
		||||
of the object is initialized to the corresponding element from `v`.
 | 
			
		||||
* When an object of an array type is specified to be value-initialized, this
 | 
			
		||||
shall be interpreted to mean that each array element of the object is
 | 
			
		||||
value-initialized.
 | 
			
		||||
* When a (sub)object of non-array type `U` is specified to be initialized to a
 | 
			
		||||
value `v`, or constructed from `args\...`, `allocate_unique` shall perform this
 | 
			
		||||
initialization via the expression
 | 
			
		||||
`std::allocator_traits<A2>::construct(a2, p, expr)` (where `_expr_` is `v` or
 | 
			
		||||
`std::forward<Args>(args)\...)` respectively), `p` points to storage suitable
 | 
			
		||||
to hold an object of type `U`, and `a2` of type `A2` is a potentially rebound
 | 
			
		||||
copy of `a`.
 | 
			
		||||
* When a (sub)object of non-array type `U` is specified to be
 | 
			
		||||
default-initialized, `allocate_unique_noinit` shall perform this initialization
 | 
			
		||||
via the expression `::new(p) U`, where `p` has type `void*` and points to
 | 
			
		||||
storage suitable to hold an object of type `U`.
 | 
			
		||||
* When a (sub)object of non-array type `U` is specified to be
 | 
			
		||||
value-initialized, `allocate_unique` shall perform this initialization via the
 | 
			
		||||
expression `std::allocator_traits<A2>::construct(a2, p)`, where `p` points to
 | 
			
		||||
storage suitable to hold an object of type `U` and `a2` of type `A2` is a
 | 
			
		||||
potentially rebound copy of `a`.
 | 
			
		||||
* Array elements are initialized in ascending order of their addresses.
 | 
			
		||||
* When the lifetime of the object managed by the return value ends, or when the
 | 
			
		||||
initialization of an array element throws an exception, the initialized
 | 
			
		||||
elements should be destroyed in the reverse order of their construction.
 | 
			
		||||
 | 
			
		||||
## Free Functions
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class A, class... Args>
 | 
			
		||||
  std::unique_ptr<T, alloc_deleter<T, A>>
 | 
			
		||||
    allocate_unique(const A& a, Args&&... args);
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is not an array.
 | 
			
		||||
Returns:: A `std::unique_ptr` to an object of type `T`, constructed from
 | 
			
		||||
`args\...`.
 | 
			
		||||
Examples::
 | 
			
		||||
* `auto p = allocate_unique<int>(a);`
 | 
			
		||||
* `auto p = allocate_unique<std::vector<int>>(a, 16, 1);`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
  std::unique_ptr<T, alloc_deleter<T, A>>
 | 
			
		||||
    allocate_unique(const A& a, type_identity_t<T>&& v);
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is not an array.
 | 
			
		||||
Returns:: A `std::unique_ptr` to an object of type `T`, constructed from `v`.
 | 
			
		||||
Example:: `auto p = allocate_unique<std::vector<int>>(a, {1, 2});`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
  std::unique_ptr<T, alloc_deleter<T, A>>
 | 
			
		||||
    allocate_unique(const A& a, std::size_t n);
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is an array of unknown bounds.
 | 
			
		||||
Returns:: A `std::unique_ptr` to a sequence of `n` value-initialized objects of
 | 
			
		||||
type `remove_extent_t<T>`.
 | 
			
		||||
Examples::
 | 
			
		||||
* `auto p = allocate_unique<double[]>(a, 1024);`
 | 
			
		||||
* `auto p = allocate_unique<double[][2][2]>(a, 6);`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
  std::unique_ptr<remove_extent_t<T>[], alloc_deleter<T, A>>
 | 
			
		||||
    allocate_unique(const A& a);
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is an array of known bounds.
 | 
			
		||||
Returns:: A `std::unique_ptr` to a sequence of `extent_v<T>` value-initialized
 | 
			
		||||
objects of type `remove_extent_t<T>`.
 | 
			
		||||
Examples::
 | 
			
		||||
* `auto p = allocate_unique<double[1024]>(a);`
 | 
			
		||||
* `auto p = allocate_unique<double[6][2][2]>(a);`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
  std::unique_ptr<T, alloc_deleter<T, A>>
 | 
			
		||||
    allocate_unique(const A& a, std::size_t n, const remove_extent_t<T>& v);
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is an array of unknown bounds.
 | 
			
		||||
Returns:: A `std::unique_ptr` to a sequence of `n` objects of type
 | 
			
		||||
`remove_extent_t<T>`, each initialized to `v`.
 | 
			
		||||
Examples::
 | 
			
		||||
* `auto p = allocate_unique<double[]>(a, 1024, 1.0);`
 | 
			
		||||
* `auto p = allocate_unique<double[][2]>(a, 6, {1.0, 0.0});`
 | 
			
		||||
* `auto p = allocate_unique<std::vector<int>[]>(a, 4, {1, 2});`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
  std::unique_ptr<remove_extent_t<T>[], alloc_deleter<T, A>>
 | 
			
		||||
    allocate_unique(const A& a, const remove_extent_t<T>& v);
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is an array of known bounds.
 | 
			
		||||
Returns:: A `std::unique_ptr` to a sequence of `extent_v<T>` objects of type
 | 
			
		||||
`remove_extent_t<T>`, each initialized to `v`.
 | 
			
		||||
Examples::
 | 
			
		||||
* `auto p = allocate_unique<double[1024]>(a, 1.0);`
 | 
			
		||||
* `auto p = allocate_unique<double[6][2]>(a, {1.0, 0.0});`
 | 
			
		||||
* `auto p = allocate_unique<std::vector<int>[4]>(a, {1, 2});`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
  std::unique_ptr<T, alloc_noinit_deleter<T, A>>
 | 
			
		||||
    allocate_unique_noinit(const A& a);
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is not an array.
 | 
			
		||||
Returns:: A `std::unique_ptr` to a default-initialized object of type `T`.
 | 
			
		||||
Example:: `auto p = allocate_unique_noinit<double>(a);`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
  std::unique_ptr<T, alloc_noinit_deleter<T, A>>
 | 
			
		||||
    allocate_unique_noinit(const A& a, std::size_t n);
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is an array of unknown bounds.
 | 
			
		||||
Returns:: A `std::unique_ptr` to a sequence of `n` default-initialized objects
 | 
			
		||||
of type `remove_extent_t<T>`.
 | 
			
		||||
Example:: `auto p = allocate_unique_noinit<double[]>(a, 1024);`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
  std::unique_ptr<remove_extent_t<T>, alloc_noinit_deleter<T, A>>
 | 
			
		||||
    allocate_unique_noinit(const A& a);
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is an array of known bounds.
 | 
			
		||||
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`
 | 
			
		||||
functions.
 | 
			
		||||
 | 
			
		||||
### Synopsis
 | 
			
		||||
 | 
			
		||||
[subs=+quotes]
 | 
			
		||||
```
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
class alloc_deleter {
 | 
			
		||||
public:
 | 
			
		||||
  using pointer = `unspecified`;
 | 
			
		||||
 | 
			
		||||
  explicit alloc_deleter(const A& a) noexcept;
 | 
			
		||||
 | 
			
		||||
  void operator()(pointer p);
 | 
			
		||||
};
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Members
 | 
			
		||||
 | 
			
		||||
[subs=+quotes]
 | 
			
		||||
```
 | 
			
		||||
using pointer = `unspecified`;
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
A type that satisfies _NullablePointer_.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
explicit alloc_deleter(const A& a) noexcept;
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Initializes the stored allocator from `a`.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
void operator()(pointer p);
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Destroys the objects and deallocates the storage referenced by `p`,
 | 
			
		||||
using the stored allocator.
 | 
			
		||||
							
								
								
									
										42
									
								
								doc/smart_ptr/changelog.adoc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								doc/smart_ptr/changelog.adoc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
////
 | 
			
		||||
Copyright 2019, 2020 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
 | 
			
		||||
////
 | 
			
		||||
 | 
			
		||||
[#changelog]
 | 
			
		||||
# Revision History
 | 
			
		||||
:toc:
 | 
			
		||||
:toc-title:
 | 
			
		||||
:idprefix: changelog_
 | 
			
		||||
 | 
			
		||||
## 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`
 | 
			
		||||
* Added `owner_hash_value` to `shared_ptr`, `weak_ptr`
 | 
			
		||||
* Added `owner_equal_to`, `owner_hash`
 | 
			
		||||
* Added `std::hash` specializations for `shared_ptr`, `local_shared_ptr`
 | 
			
		||||
* Added `boost::hash` support to, and `std::hash`, `std::equal_to`
 | 
			
		||||
  specializations for, `weak_ptr`
 | 
			
		||||
 | 
			
		||||
## Changes in 1.72.0
 | 
			
		||||
 | 
			
		||||
* Added `allocate_unique`
 | 
			
		||||
 | 
			
		||||
## Changes in 1.71.0
 | 
			
		||||
 | 
			
		||||
* Added aliasing constructors to `weak_ptr`
 | 
			
		||||
* Added `weak_ptr<T>::empty()`
 | 
			
		||||
* Added `enable_shared_from`, `shared_from`, and `weak_from`
 | 
			
		||||
 | 
			
		||||
## Changes in 1.65.0
 | 
			
		||||
 | 
			
		||||
* Added `atomic_shared_ptr`
 | 
			
		||||
* Added `local_shared_ptr`, `make_local_shared`
 | 
			
		||||
							
								
								
									
										89
									
								
								doc/smart_ptr/enable_shared_from.adoc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								doc/smart_ptr/enable_shared_from.adoc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,89 @@
 | 
			
		||||
////
 | 
			
		||||
Copyright 2002, 2003, 2015, 2017, 2019 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
 | 
			
		||||
////
 | 
			
		||||
 | 
			
		||||
[#enable_shared_from]
 | 
			
		||||
# enable_shared_from
 | 
			
		||||
:toc:
 | 
			
		||||
:toc-title:
 | 
			
		||||
:idprefix: enable_shared_from_
 | 
			
		||||
 | 
			
		||||
## Description
 | 
			
		||||
 | 
			
		||||
`enable_shared_from` is used as a base class that allows a `shared_ptr` or a
 | 
			
		||||
`weak_ptr` to be obtained given a raw pointer to the object, by using the
 | 
			
		||||
functions `shared_from` and `weak_from`.
 | 
			
		||||
 | 
			
		||||
`enable_shared_from` differs from `enable_shared_from_this<T>` by the fact
 | 
			
		||||
that it's not a template, and is its recommended replacement for new code.
 | 
			
		||||
 | 
			
		||||
## Example
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
#include <boost/smart_ptr/enable_shared_from.hpp>
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
#include <cassert>
 | 
			
		||||
 | 
			
		||||
class Y: public boost::enable_shared_from
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    boost::shared_ptr<Y> f()
 | 
			
		||||
    {
 | 
			
		||||
        return boost::shared_from( this );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr<Y> p(new Y);
 | 
			
		||||
    boost::shared_ptr<Y> q = p->f();
 | 
			
		||||
    assert(p == q);
 | 
			
		||||
    assert(!(p < q || q < p)); // p and q must share ownership
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Synopsis
 | 
			
		||||
 | 
			
		||||
`enable_shared_from` is defined in `<boost/smart_ptr/enable_shared_from.hpp>`.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
  class enable_shared_from: public enable_shared_from_this<enable_shared_from>
 | 
			
		||||
  {
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  template<class T> shared_ptr<T> shared_from( T * p );
 | 
			
		||||
  template<class T> weak_ptr<T> weak_from( T * p ) noexcept;
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Functions
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T> shared_ptr<T> shared_from( T * p );
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `shared_ptr<T>( p\->enable_shared_from::shared_from_this(), p )`.
 | 
			
		||||
 | 
			
		||||
NOTE: Throws `bad_weak_ptr` when `p` is not owned by a `shared_ptr`.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T> weak_ptr<T> weak_from( T * p ) noexcept;
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `weak_ptr<T>( p\->enable_shared_from::weak_from_this(), p )`.
 | 
			
		||||
 | 
			
		||||
NOTE: Unlike `shared_from(this)`, `weak_from(this)` is valid in a destructor
 | 
			
		||||
      and returns a `weak_ptr` that is `expired()` but still shares ownership
 | 
			
		||||
      with other `weak_ptr` instances (if any) that refer to the object.
 | 
			
		||||
@@ -142,3 +142,7 @@ template<class T> weak_ptr<T const> weak_from_this() const noexcept;
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `weak_this_`.
 | 
			
		||||
 | 
			
		||||
NOTE: Unlike `shared_from_this()`, `weak_from_this()` is valid in a destructor
 | 
			
		||||
      and returns a `weak_ptr` that is `expired()` but still shares ownership
 | 
			
		||||
      with other `weak_ptr` instances (if any) that refer to the object.
 | 
			
		||||
 
 | 
			
		||||
@@ -111,3 +111,7 @@ Glen Fernandes rewrote `allocate_shared` and `make_shared` for arrays for a more
 | 
			
		||||
Peter Dimov and Glen Fernandes rewrote the documentation in Asciidoc format.
 | 
			
		||||
 | 
			
		||||
Peter Dimov added `atomic_shared_ptr` and `local_shared_ptr`.
 | 
			
		||||
 | 
			
		||||
## August 2019
 | 
			
		||||
 | 
			
		||||
Glen Fernandes implemented `allocate_unique` for scalars and arrays.
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,9 @@ http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
[#introduction]
 | 
			
		||||
# Introduction
 | 
			
		||||
:idprefix: intro
 | 
			
		||||
:toc:
 | 
			
		||||
:toc-title:
 | 
			
		||||
:idprefix: intro_
 | 
			
		||||
 | 
			
		||||
Smart pointers are objects which store pointers to dynamically allocated (heap) objects.
 | 
			
		||||
They behave much like built-in {cpp} pointers except that they automatically delete the object
 | 
			
		||||
@@ -29,7 +31,7 @@ This library provides six smart pointer class templates:
 | 
			
		||||
* `<<scoped_ptr,scoped_ptr>>`, used to contain ownership of a dynamically allocated object to the current scope;
 | 
			
		||||
* `<<scoped_array,scoped_array>>`, which provides scoped ownership for a dynamically allocated array;
 | 
			
		||||
* `<<shared_ptr,shared_ptr>>`, a versatile tool for managing shared ownership of an object or array;
 | 
			
		||||
* `<<weak_ptr,weak_ptr>>`, a non-owning observer to a shared_ptr-managed object that can be promoted temporarily to shared_ptr;
 | 
			
		||||
* `<<weak_ptr,weak_ptr>>`, a non-owning observer to a `shared_ptr`-managed object that can be promoted temporarily to `shared_ptr`;
 | 
			
		||||
* `<<intrusive_ptr,intrusive_ptr>>`, a pointer to objects with an embedded reference count;
 | 
			
		||||
* `<<local_shared_ptr,local_shared_ptr>>`, providing shared ownership within a single thread.
 | 
			
		||||
 | 
			
		||||
@@ -37,9 +39,11 @@ This library provides six smart pointer class templates:
 | 
			
		||||
 | 
			
		||||
In addition, the library contains the following supporting utility functions and classes:
 | 
			
		||||
 | 
			
		||||
* `<<make_shared,make_shared>>`, a factory function for creating objects that returns a `shared_ptr`;
 | 
			
		||||
* `<<make_shared,make_shared>>` and `allocate_shared`, factory functions for creating objects that return a `shared_ptr`;
 | 
			
		||||
* `<<make_unique,make_unique>>`, a factory function returning `std::unique_ptr`;
 | 
			
		||||
* `<<allocate_unique,allocate_unique>>`, a factory function for creating objects using an allocator that returns a `std::unique_ptr`;
 | 
			
		||||
* `<<enable_shared_from_this,enable_shared_from_this>>`, a helper base class that enables the acquisition of a `shared_ptr` pointing to `this`;
 | 
			
		||||
* `<<enable_shared_from,enable_shared_from>>`, a newer and better replacement for `enable_shared_from_this`;
 | 
			
		||||
* `<<pointer_to_other,pointer_to_other>>`, a helper trait for converting one smart pointer type to another;
 | 
			
		||||
* `<<pointer_cast,static_pointer_cast>>` and companions, generic smart pointer casts;
 | 
			
		||||
* `<<intrusive_ref_counter,intrusive_ref_counter>>`, a helper base class containing a reference count.
 | 
			
		||||
 
 | 
			
		||||
@@ -77,7 +77,7 @@ namespace boost {
 | 
			
		||||
 | 
			
		||||
    explicit operator bool () const noexcept;
 | 
			
		||||
 | 
			
		||||
    void swap(intrusive_ptr & b) noexept;
 | 
			
		||||
    void swap(intrusive_ptr & b) noexcept;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  template<class T, class U>
 | 
			
		||||
@@ -174,7 +174,8 @@ template<class Y> intrusive_ptr(intrusive_ptr<Y> && r);
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Postconditions:: `get()` equals the old value of `r.get()`. `r.get() == 0`.
 | 
			
		||||
Postconditions::
 | 
			
		||||
  `get()` equals the old value of `r.get()`. `r.get() == 0`.
 | 
			
		||||
 | 
			
		||||
### destructor
 | 
			
		||||
 | 
			
		||||
@@ -185,7 +186,8 @@ Postconditions:: `get()` equals the old value of `r.get()`. `r.get() == 0`.
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: `if(get() != 0) intrusive_ptr_release(get());`.
 | 
			
		||||
Effects::
 | 
			
		||||
  `if(get() != 0) intrusive_ptr_release(get());`.
 | 
			
		||||
 | 
			
		||||
### assignment
 | 
			
		||||
 | 
			
		||||
@@ -245,7 +247,8 @@ void reset(T * r, bool add_ref);
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Equivalent to `intrusive_ptr(r, add_ref).swap(*this)`.
 | 
			
		||||
Effects::
 | 
			
		||||
  Equivalent to `intrusive_ptr(r, add_ref).swap(*this)`.
 | 
			
		||||
 | 
			
		||||
### indirection
 | 
			
		||||
 | 
			
		||||
@@ -278,7 +281,8 @@ T * get() const noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: the stored pointer.
 | 
			
		||||
Returns::
 | 
			
		||||
  the stored pointer.
 | 
			
		||||
 | 
			
		||||
### detach
 | 
			
		||||
 | 
			
		||||
@@ -325,7 +329,8 @@ void swap(intrusive_ptr & b) noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Exchanges the contents of the two smart pointers.
 | 
			
		||||
Effects::
 | 
			
		||||
  Exchanges the contents of the two smart pointers.
 | 
			
		||||
 | 
			
		||||
## Free Functions
 | 
			
		||||
 | 
			
		||||
@@ -412,7 +417,8 @@ template<class T> void swap(intrusive_ptr<T> & a, intrusive_ptr<T> & b) noexcept
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Equivalent to `a.swap(b)`.
 | 
			
		||||
Effects::
 | 
			
		||||
  Equivalent to `a.swap(b)`.
 | 
			
		||||
 | 
			
		||||
### get_pointer
 | 
			
		||||
 | 
			
		||||
@@ -437,7 +443,8 @@ template<class T, class U>
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `intrusive_ptr<T>(static_cast<T*>(r.get()))`.
 | 
			
		||||
Returns::
 | 
			
		||||
  `intrusive_ptr<T>(static_cast<T*>(r.get()))`.
 | 
			
		||||
 | 
			
		||||
### const_pointer_cast
 | 
			
		||||
 | 
			
		||||
@@ -449,7 +456,8 @@ template<class T, class U>
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `intrusive_ptr<T>(const_cast<T*>(r.get()))`.
 | 
			
		||||
Returns::
 | 
			
		||||
  `intrusive_ptr<T>(const_cast<T*>(r.get()))`.
 | 
			
		||||
 | 
			
		||||
### dynamic_pointer_cast
 | 
			
		||||
 | 
			
		||||
@@ -461,7 +469,8 @@ template<class T, class U>
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `intrusive_ptr<T>(dynamic_cast<T*>(r.get()))`.
 | 
			
		||||
Returns::
 | 
			
		||||
  `intrusive_ptr<T>(dynamic_cast<T*>(r.get()))`.
 | 
			
		||||
 | 
			
		||||
### operator<<
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -78,12 +78,13 @@ namespace boost {
 | 
			
		||||
```
 | 
			
		||||
intrusive_ref_counter() noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
```
 | 
			
		||||
intrusive_ref_counter(const intrusive_ref_counter&) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Postconditions::: `use_count() == 0`.
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Postconditions:: `use_count() == 0`.
 | 
			
		||||
 | 
			
		||||
NOTE: The pointer to the constructed object is expected to be passed to
 | 
			
		||||
`intrusive_ptr` constructor, assignment operator or `reset` method, which
 | 
			
		||||
@@ -94,8 +95,10 @@ would increment the reference counter.
 | 
			
		||||
```
 | 
			
		||||
~intrusive_ref_counter();
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Effects::: Destroys the counter object.
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Destroys the counter object.
 | 
			
		||||
 | 
			
		||||
NOTE: The destructor is protected so that the object can only be destroyed
 | 
			
		||||
through the `Derived` class.
 | 
			
		||||
@@ -105,16 +108,21 @@ through the `Derived` class.
 | 
			
		||||
```
 | 
			
		||||
intrusive_ref_counter& operator=(const intrusive_ref_counter& v) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Effects::: Does nothing, reference counter is not modified.
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects::
 | 
			
		||||
  Does nothing, reference counter is not modified.
 | 
			
		||||
 | 
			
		||||
### use_count
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
unsigned int use_count() const noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Returns::: The current value of the reference counter.
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: The current value of the reference counter.
 | 
			
		||||
 | 
			
		||||
NOTE: The returned value may not be actual in multi-threaded applications.
 | 
			
		||||
 | 
			
		||||
@@ -127,8 +135,11 @@ template<class Derived, class CounterPolicy>
 | 
			
		||||
  void intrusive_ptr_add_ref(
 | 
			
		||||
    const intrusive_ref_counter<Derived, CounterPolicy>* p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Effects::: Increments the reference counter.
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects::
 | 
			
		||||
  Increments the reference counter.
 | 
			
		||||
 | 
			
		||||
### intrusive_ptr_release
 | 
			
		||||
 | 
			
		||||
@@ -137,6 +148,8 @@ template<class Derived, class CounterPolicy>
 | 
			
		||||
  void intrusive_ptr_release(
 | 
			
		||||
    const intrusive_ref_counter<Derived, CounterPolicy>* p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Effects::: Decrements the reference counter. If the reference counter reaches
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Decrements the reference counter. If the reference counter reaches
 | 
			
		||||
0, calls `delete static_cast<const Derived*>(p)`.
 | 
			
		||||
 
 | 
			
		||||
@@ -124,7 +124,7 @@ namespace boost {
 | 
			
		||||
    template<class Y> void reset(local_shared_ptr<Y> && r, element_type * p) noexcept;
 | 
			
		||||
 | 
			
		||||
    // accessors
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    T & operator*() const noexcept; // only valid when T is not an array type
 | 
			
		||||
    T * operator->() const noexcept; // only valid when T is not an array type
 | 
			
		||||
 | 
			
		||||
@@ -143,12 +143,16 @@ namespace boost {
 | 
			
		||||
    template<class Y> operator weak_ptr<Y>() const noexcept;
 | 
			
		||||
 | 
			
		||||
    // swap
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    void swap(local_shared_ptr & b) noexcept;
 | 
			
		||||
 | 
			
		||||
    // owner_before
 | 
			
		||||
    
 | 
			
		||||
    template<class Y> bool owner_before(local_shared_ptr<Y> const & rhs) const noexcept;
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_before(local_shared_ptr<Y> const & r) const noexcept;
 | 
			
		||||
 | 
			
		||||
    // owner_equals
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_equals(local_shared_ptr<Y> const & r) const noexcept;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  // comparisons
 | 
			
		||||
@@ -459,7 +463,8 @@ template<class Y> void reset(local_shared_ptr<Y> && r, element_type * p) noexcep
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Equivalent to `local_shared_ptr(std::move(r), p).swap(*this)`.
 | 
			
		||||
Effects::
 | 
			
		||||
  Equivalent to `local_shared_ptr(std::move(r), p).swap(*this)`.
 | 
			
		||||
 | 
			
		||||
### indirection
 | 
			
		||||
```
 | 
			
		||||
@@ -497,7 +502,8 @@ element_type * get() const noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: The stored pointer.
 | 
			
		||||
Returns::
 | 
			
		||||
  The stored pointer.
 | 
			
		||||
 | 
			
		||||
### local_use_count
 | 
			
		||||
```
 | 
			
		||||
@@ -506,7 +512,8 @@ long local_use_count() const noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: The number of `local_shared_ptr` objects, `*this` included, that share ownership with `*this`, or 0 when `*this` is empty.
 | 
			
		||||
Returns::
 | 
			
		||||
  The number of `local_shared_ptr` objects, `*this` included, that share ownership with `*this`, or 0 when `*this` is empty.
 | 
			
		||||
 | 
			
		||||
### conversions
 | 
			
		||||
```
 | 
			
		||||
@@ -538,16 +545,28 @@ void swap(local_shared_ptr & b) noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Exchanges the contents of the two smart pointers.
 | 
			
		||||
Effects::
 | 
			
		||||
  Exchanges the contents of the two smart pointers.
 | 
			
		||||
 | 
			
		||||
### owner_before
 | 
			
		||||
```
 | 
			
		||||
template<class Y> bool owner_before(local_shared_ptr<Y> const & rhs) const noexcept;
 | 
			
		||||
template<class Y> bool owner_before(local_shared_ptr<Y> const & r) const noexcept;
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: See the description of `operator<`.
 | 
			
		||||
Returns::
 | 
			
		||||
  See the description of `operator<`.
 | 
			
		||||
 | 
			
		||||
### owner_equals
 | 
			
		||||
```
 | 
			
		||||
template<class Y> bool owner_equals(local_shared_ptr<Y> const & r) const noexcept;
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns::
 | 
			
		||||
  `true` if and only if `*this` and `r` share ownership or are both empty.
 | 
			
		||||
 | 
			
		||||
## Free Functions
 | 
			
		||||
 | 
			
		||||
@@ -631,7 +650,8 @@ template<class T> void swap(local_shared_ptr<T> & a, local_shared_ptr<T> & b) no
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Equivalent to `a.swap(b)`.
 | 
			
		||||
Effects::
 | 
			
		||||
  Equivalent to `a.swap(b)`.
 | 
			
		||||
 | 
			
		||||
### get_pointer
 | 
			
		||||
```
 | 
			
		||||
@@ -716,4 +736,3 @@ template<class D, class T>
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: If `*this` owns a `shared_ptr` instance `p`, `get_deleter<D>( p )`, otherwise 0.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -27,25 +27,25 @@ are analogous to `make_shared` and `allocate_shared` for `shared_ptr`.
 | 
			
		||||
[subs=+quotes]
 | 
			
		||||
```
 | 
			
		||||
namespace boost {
 | 
			
		||||
  `// only if T is not an array type`
 | 
			
		||||
  `// T is not an array`
 | 
			
		||||
  template<class T, class... Args>
 | 
			
		||||
    local_shared_ptr<T> make_local_shared(Args&&... args);
 | 
			
		||||
  template<class T, class A, class... Args>
 | 
			
		||||
    local_shared_ptr<T> allocate_local_shared(const A& a, Args&&... args);
 | 
			
		||||
 | 
			
		||||
  `// only if T is an array type of the form U[]`
 | 
			
		||||
  `// T is an array of unknown bounds`
 | 
			
		||||
  template<class T>
 | 
			
		||||
    local_shared_ptr<T> make_local_shared(std::size_t n);
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
    local_shared_ptr<T> allocate_local_shared(const A& a, std::size_t n);
 | 
			
		||||
 | 
			
		||||
  `// only if T is an array type of the form U[N]`
 | 
			
		||||
  `// T is an array of known bounds`
 | 
			
		||||
  template<class T>
 | 
			
		||||
    local_shared_ptr<T> make_local_shared();
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
    local_shared_ptr<T> allocate_local_shared(const A& a);
 | 
			
		||||
 | 
			
		||||
  `// only if T is an array type of the form U[]`
 | 
			
		||||
  `// T is an array of unknown bounds`
 | 
			
		||||
  template<class T>
 | 
			
		||||
    local_shared_ptr<T> make_local_shared(std::size_t n,
 | 
			
		||||
      const remove_extent_t<T>& v);
 | 
			
		||||
@@ -53,20 +53,20 @@ namespace boost {
 | 
			
		||||
    local_shared_ptr<T> allocate_local_shared(const A& a, std::size_t n,
 | 
			
		||||
      const remove_extent_t<T>& v);
 | 
			
		||||
 | 
			
		||||
  `// only if T is an array type of the form U[N]`
 | 
			
		||||
  `// T is an array of known bounds`
 | 
			
		||||
  template<class T>
 | 
			
		||||
    local_shared_ptr<T> make_local_shared(const remove_extent_t<T>& v);
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
    local_shared_ptr<T> allocate_local_shared(const A& a,
 | 
			
		||||
      const remove_extent_t<T>& v);
 | 
			
		||||
 | 
			
		||||
  `// only if T is not an array type of the form U[]`
 | 
			
		||||
  `// T is not an array of known bounds`
 | 
			
		||||
  template<class T>
 | 
			
		||||
    local_shared_ptr<T> make_local_shared_noinit();
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
    local_shared_ptr<T> allocate_local_shared_noinit(const A& a);
 | 
			
		||||
 | 
			
		||||
  `// only if T is an array type of the form U[N]`
 | 
			
		||||
  `// T is an array of unknown bounds`
 | 
			
		||||
  template<class T>
 | 
			
		||||
    local_shared_ptr<T> make_local_shared_noinit(std::size_t n);
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
 
 | 
			
		||||
@@ -55,43 +55,43 @@ types.
 | 
			
		||||
[subs=+quotes]
 | 
			
		||||
```
 | 
			
		||||
namespace boost {
 | 
			
		||||
  `// only if T is not an array type`
 | 
			
		||||
  `// T is not an array`
 | 
			
		||||
  template<class T, class... Args>
 | 
			
		||||
    shared_ptr<T> make_shared(Args&&... args);
 | 
			
		||||
  template<class T, class A, class... Args>
 | 
			
		||||
    shared_ptr<T> allocate_shared(const A& a, Args&&... args);
 | 
			
		||||
 | 
			
		||||
  `// only if T is an array type of the form U[]`
 | 
			
		||||
  `// T is an array of unknown bounds`
 | 
			
		||||
  template<class T>
 | 
			
		||||
    shared_ptr<T> make_shared(std::size_t n);
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
    shared_ptr<T> allocate_shared(const A& a, std::size_t n);
 | 
			
		||||
 | 
			
		||||
  `// only if T is an array type of the form U[N]`
 | 
			
		||||
  `// T is an array of known bounds`
 | 
			
		||||
  template<class T>
 | 
			
		||||
    shared_ptr<T> make_shared();
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
    shared_ptr<T> allocate_shared(const A& a);
 | 
			
		||||
 | 
			
		||||
  `// only if T is an array type of the form U[]`
 | 
			
		||||
  `// T is an array of unknown bounds`
 | 
			
		||||
  template<class T> shared_ptr<T>
 | 
			
		||||
    make_shared(std::size_t n, const remove_extent_t<T>& v);
 | 
			
		||||
  template<class T, class A> shared_ptr<T>
 | 
			
		||||
    allocate_shared(const A& a, std::size_t n, const remove_extent_t<T>& v);
 | 
			
		||||
 | 
			
		||||
  `// only if T is an array type of the form U[N]`
 | 
			
		||||
  `// T is an array of known bounds`
 | 
			
		||||
  template<class T>
 | 
			
		||||
    shared_ptr<T> make_shared(const remove_extent_t<T>& v);
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
    shared_ptr<T> allocate_shared(const A& a, const remove_extent_t<T>& v);
 | 
			
		||||
 | 
			
		||||
  `// only if T is not an array type of the form U[]`
 | 
			
		||||
  `// T is not an array of unknown bounds`
 | 
			
		||||
  template<class T>
 | 
			
		||||
    shared_ptr<T> make_shared_noinit();
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
    shared_ptr<T> allocate_shared_noinit(const A& a);
 | 
			
		||||
 | 
			
		||||
  `// only if T is an array type of the form U[N]`
 | 
			
		||||
  `// T is an array of unknown bounds`
 | 
			
		||||
  template<class T>
 | 
			
		||||
    shared_ptr<T> make_shared_noinit(std::size_t n);
 | 
			
		||||
  template<class T, class A>
 | 
			
		||||
@@ -144,7 +144,7 @@ perform this initialization via the expression
 | 
			
		||||
`std::allocator_traits<A2>::construct(a2, p, expr)` (where
 | 
			
		||||
`_expr_` is `v` or `std::forward<Args>(args)\...)` respectively), `p`
 | 
			
		||||
points to storage suitable to hold an object of type `U`, and `a2` of
 | 
			
		||||
type `A2` is a rebound copy `a` such that its `value_type` is `U`.
 | 
			
		||||
type `A2` is a potentially rebound copy of `a`.
 | 
			
		||||
* When a (sub)object of non-array type `U` is specified to be
 | 
			
		||||
default-initialized, `make_shared_noinit` and `allocate_shared_noinit` shall
 | 
			
		||||
perform this initialization via the expression `::new(p) U`, where
 | 
			
		||||
@@ -158,7 +158,7 @@ storage suitable to hold an object of type `U`.
 | 
			
		||||
value-initialized, `allocate_shared` shall perform this initialization via the
 | 
			
		||||
expression `std::allocator_traits<A2>::construct(a2, p)`, where
 | 
			
		||||
`p` points to storage suitable to hold an object of type `U` and `a2` of
 | 
			
		||||
type `A2` is a rebound copy of `a` such that its value_type is `U`.
 | 
			
		||||
type `A2` is a potentially rebound copy of `a`.
 | 
			
		||||
* Array elements are initialized in ascending order of their addresses.
 | 
			
		||||
* When the lifetime of the object managed by the return value ends, or when
 | 
			
		||||
the initialization of an array element throws an exception, the initialized
 | 
			
		||||
@@ -174,17 +174,17 @@ the reference counts.
 | 
			
		||||
template<class T, class... Args>
 | 
			
		||||
  shared_ptr<T> make_shared(Args&&... args);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
```
 | 
			
		||||
template<class T, class A, class... Args>
 | 
			
		||||
  shared_ptr<T> allocate_shared(const A& a, Args&&... args);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Remarks::: These overloads shall only participate in overload resolution when
 | 
			
		||||
`T` is not an array type.
 | 
			
		||||
Returns::: A `shared_ptr` to an object of type `T`, constructed from
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is not an array.
 | 
			
		||||
Returns:: A `shared_ptr` to an object of type `T`, constructed from
 | 
			
		||||
`args\...`.
 | 
			
		||||
Examples:::
 | 
			
		||||
Examples::
 | 
			
		||||
* `auto p = make_shared<int>();`
 | 
			
		||||
* `auto p = make_shared<std::vector<int> >(16, 1);`
 | 
			
		||||
 | 
			
		||||
@@ -192,17 +192,17 @@ Examples:::
 | 
			
		||||
template<class T>
 | 
			
		||||
  shared_ptr<T> make_shared(std::size_t n);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
```
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
  shared_ptr<T> allocate_shared(const A& a, std::size_t n);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Remarks::: These overloads shall only participate in overload resolution when
 | 
			
		||||
`T` is an array type of the form `U[]`.
 | 
			
		||||
Returns::: A `shared_ptr` to a sequence of `n` value-initialized objects of
 | 
			
		||||
type `U`.
 | 
			
		||||
Examples:::
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is an array of unknown bounds.
 | 
			
		||||
Returns:: A `shared_ptr` to a sequence of `n` value-initialized objects of
 | 
			
		||||
type `remove_extent_t<T>`.
 | 
			
		||||
Examples::
 | 
			
		||||
* `auto p = make_shared<double[]>(1024);`
 | 
			
		||||
* `auto p = make_shared<double[][2][2]>(6);`
 | 
			
		||||
 | 
			
		||||
@@ -210,17 +210,17 @@ Examples:::
 | 
			
		||||
template<class T>
 | 
			
		||||
  shared_ptr<T> make_shared();
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
```
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
  shared_ptr<T> allocate_shared(const A& a);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Remarks::: These overloads shall only participate in overload resolution when
 | 
			
		||||
`T` is an array type of the form `U[N]`.
 | 
			
		||||
Returns::: A `shared_ptr` to a sequence of `N` value-initialized objects of
 | 
			
		||||
type `U`.
 | 
			
		||||
Examples:::
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is an array of known bounds.
 | 
			
		||||
Returns:: A `shared_ptr` to a sequence of `extent_v<T>` value-initialized
 | 
			
		||||
objects of type `remove_extent_t<T>`.
 | 
			
		||||
Examples::
 | 
			
		||||
* `auto p = make_shared<double[1024]>();`
 | 
			
		||||
* `auto p = make_shared<double[6][2][2]>();`
 | 
			
		||||
 | 
			
		||||
@@ -228,17 +228,17 @@ Examples:::
 | 
			
		||||
template<class T> shared_ptr<T>
 | 
			
		||||
  make_shared(std::size_t n, const remove_extent_t<T>& v);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
```
 | 
			
		||||
template<class T, class A> shared_ptr<T>
 | 
			
		||||
  allocate_shared(const A& a, std::size_t n, const remove_extent_t<T>& v);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Remarks::: These overloads shall only participate in overload resolution when
 | 
			
		||||
`T` is an array type of the form `U[]`.
 | 
			
		||||
Returns::: A `shared_ptr` to a sequence of `n` objects of type `U`, each
 | 
			
		||||
initialized to `v`.
 | 
			
		||||
Examples:::
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is an array of unknown bounds.
 | 
			
		||||
Returns:: A `shared_ptr` to a sequence of `n` objects of type
 | 
			
		||||
`remove_extent_t<T>`, each initialized to `v`.
 | 
			
		||||
Examples::
 | 
			
		||||
* `auto p = make_shared<double[]>(1024, 1.0);`
 | 
			
		||||
* `auto p = make_shared<double[][2]>(6, {1.0, 0.0});`
 | 
			
		||||
* `auto p = make_shared<std::vector<int>[]>(4, {1, 2});`
 | 
			
		||||
@@ -247,17 +247,17 @@ Examples:::
 | 
			
		||||
template<class T>
 | 
			
		||||
  shared_ptr<T> make_shared(const remove_extent_t<T>& v);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
```
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
  shared_ptr<T> allocate_shared(const A& a, const remove_extent_t<T>& v);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Remarks::: These overloads shall only participate in overload resolution when
 | 
			
		||||
`T` is an array type of the form `U[N]`.
 | 
			
		||||
Returns::: A `shared_ptr` to a sequence of `N` objects of type `U`, each
 | 
			
		||||
initialized to `v`.
 | 
			
		||||
Examples:::
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is an array of known bounds.
 | 
			
		||||
Returns:: A `shared_ptr` to a sequence of `extent_v<T>` objects of type
 | 
			
		||||
`remove_extent_t<T>`, each initialized to `v`.
 | 
			
		||||
Examples::
 | 
			
		||||
* `auto p = make_shared<double[1024]>(1.0);`
 | 
			
		||||
* `auto p = make_shared<double[6][2]>({1.0, 0.0});`
 | 
			
		||||
* `auto p = make_shared<std::vector<int>[4]>({1, 2});`
 | 
			
		||||
@@ -266,30 +266,31 @@ Examples:::
 | 
			
		||||
template<class T>
 | 
			
		||||
  shared_ptr<T> make_shared_noinit();
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
```
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
  shared_ptr<T> allocate_shared_noinit(const A& a);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Remarks::: These overloads shall only participate in overload resolution when
 | 
			
		||||
`T` is not an array type, or an array type of the `U[N]`.
 | 
			
		||||
Returns::: A `shared_ptr` to a default-initialized object of type `T`, or a
 | 
			
		||||
sequence of `N` default-initialized objects of type `U`, respectively.
 | 
			
		||||
Example::: `auto p = make_shared_noinit<double[1024]>();`
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is not an array, or is an array of known bounds.
 | 
			
		||||
Returns:: A `shared_ptr` to a default-initialized object of type `T`, or a
 | 
			
		||||
sequence of `extent_v<T>` default-initialized objects of type
 | 
			
		||||
`remove_extent_t<T>`, respectively.
 | 
			
		||||
Example:: `auto p = make_shared_noinit<double[1024]>();`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T>
 | 
			
		||||
  shared_ptr<T> make_shared_noinit(std::size_t n);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
```
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
  shared_ptr<T> allocate_shared_noinit(const A& a, std::size_t n);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Remarks::: These overloads shall only participate in overload resolution when
 | 
			
		||||
`T` is an array type of the form `U[]`.
 | 
			
		||||
Returns::: A `shared_ptr` to a sequence of `_n_` default-initialized objects
 | 
			
		||||
of type `U`.
 | 
			
		||||
Example::: `auto p = make_shared_noinit<double[]>(1024);`
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is an array of unknown bounds.
 | 
			
		||||
Returns:: A `shared_ptr` to a sequence of `_n_` default-initialized objects
 | 
			
		||||
of type `remove_extent_t<T>`.
 | 
			
		||||
Example:: `auto p = make_shared_noinit<double[]>(1024);`
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
@@ -40,23 +40,23 @@ feature with `std::make_unique`.
 | 
			
		||||
[subs=+quotes]
 | 
			
		||||
```
 | 
			
		||||
namespace boost {
 | 
			
		||||
  `// only if T is not an array type`
 | 
			
		||||
  `// T is not an array`
 | 
			
		||||
  template<class T, class... Args>
 | 
			
		||||
    std::unique_ptr<T> make_unique(Args&&... args);
 | 
			
		||||
 | 
			
		||||
  `// only if T is not an array type`
 | 
			
		||||
  `// T is not an array`
 | 
			
		||||
  template<class T>
 | 
			
		||||
    std::unique_ptr<T> make_unique(remove_reference_t<T>&& v);
 | 
			
		||||
    std::unique_ptr<T> make_unique(type_identity_t<T>&& v);
 | 
			
		||||
 | 
			
		||||
  `// only if T is an array type of the form U[]`
 | 
			
		||||
  `// T is an array of unknown bounds`
 | 
			
		||||
  template<class T>
 | 
			
		||||
    std::unique_ptr<T> make_unique(std::size_t n);
 | 
			
		||||
 | 
			
		||||
  `// only if T is not an array type`
 | 
			
		||||
  `// T is not an array`
 | 
			
		||||
  template<class T>
 | 
			
		||||
    std::unique_ptr<T> make_unique_noinit();
 | 
			
		||||
 | 
			
		||||
  `// only if T is an array type of the form U[]`
 | 
			
		||||
  `// T is an array of unknown bounds`
 | 
			
		||||
  template<class T>
 | 
			
		||||
    std::unique_ptr<T> make_unique_noinit(std::size_t n);
 | 
			
		||||
}
 | 
			
		||||
@@ -68,48 +68,53 @@ namespace boost {
 | 
			
		||||
template<class T, class... Args>
 | 
			
		||||
  std::unique_ptr<T> make_unique(Args&&... args);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Remarks::: These overloads shall only participate in overload resolution when
 | 
			
		||||
`T` is not an array type.
 | 
			
		||||
Returns::: `std::unique_ptr<T>(new T(std::forward<Args>(args)\...)`.
 | 
			
		||||
Example::: `auto p = make_unique<int>();`
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is not an array.
 | 
			
		||||
Returns:: `std::unique_ptr<T>(new T(std::forward<Args>(args)\...)`.
 | 
			
		||||
Example:: `auto p = make_unique<int>();`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T>
 | 
			
		||||
  std::unique_ptr<T> make_unique(remove_reference_t<T>&& v);
 | 
			
		||||
  std::unique_ptr<T> make_unique(type_identity_t<T>&& v);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Remarks::: These overloads shall only participate in overload resolution when
 | 
			
		||||
`T` is not an array type.
 | 
			
		||||
Returns::: `std::unique_ptr<T>(new T(std::move(v))`.
 | 
			
		||||
Example::: `auto p = make_unique<std::vector<int> >({1, 2});`
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is not an array.
 | 
			
		||||
Returns:: `std::unique_ptr<T>(new T(std::move(v))`.
 | 
			
		||||
Example:: `auto p = make_unique<std::vector<int> >({1, 2});`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T>
 | 
			
		||||
  std::unique_ptr<T> make_unique(std::size_t n);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Remarks::: These overloads shall only participate in overload resolution when
 | 
			
		||||
`T` is an array type of the form `U[]`.
 | 
			
		||||
Returns::: `std::unique_ptr<U[]>(new U[n]())`.
 | 
			
		||||
Example::: `auto p = make_unique<double[]>(1024);`
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is an array of unknown bounds.
 | 
			
		||||
Returns:: `std::unique_ptr<T>(new remove_extent_t<T>[n]())`.
 | 
			
		||||
Example:: `auto p = make_unique<double[]>(1024);`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T>
 | 
			
		||||
  std::unique_ptr<T> make_unique_noinit();
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Remarks::: These overloads shall only participate in overload resolution when
 | 
			
		||||
`T` is not an array type.
 | 
			
		||||
Returns::: `std::unique_ptr<T>(new T)`.
 | 
			
		||||
Example::: `auto p = make_unique_noinit<double[1024]>();`
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is not an array.
 | 
			
		||||
Returns:: `std::unique_ptr<T>(new T)`.
 | 
			
		||||
Example:: `auto p = make_unique_noinit<std::array<double, 1024> >();`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T>
 | 
			
		||||
  std::unique_ptr<T> make_unique_noinit(std::size_t n);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Remarks::: These overloads shall only participate in overload resolution when
 | 
			
		||||
`T` is an array type of the form `U[]`.
 | 
			
		||||
Returns::: `std::unique_ptr<U[]>(new U[n])`.
 | 
			
		||||
Example::: `auto p = make_unique_noinit<double[]>(1024);`
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Constraints:: `T` is an array of unknown bounds.
 | 
			
		||||
Returns:: `std::unique_ptr<T>(new remove_extent_t<T>[n])`.
 | 
			
		||||
Example:: `auto p = make_unique_noinit<double[]>(1024);`
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										45
									
								
								doc/smart_ptr/owner_equal_to.adoc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								doc/smart_ptr/owner_equal_to.adoc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
////
 | 
			
		||||
Copyright 2020 Peter Dimov
 | 
			
		||||
Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
////
 | 
			
		||||
 | 
			
		||||
[#owner_equal_to]
 | 
			
		||||
# owner_equal_to
 | 
			
		||||
:toc:
 | 
			
		||||
:toc-title:
 | 
			
		||||
:idprefix: owner_equal_to_
 | 
			
		||||
 | 
			
		||||
## Description
 | 
			
		||||
 | 
			
		||||
`owner_equal_to<T>` is a helper function object that compares two smart
 | 
			
		||||
pointer objects using `owner_equals`.
 | 
			
		||||
 | 
			
		||||
## Synopsis
 | 
			
		||||
 | 
			
		||||
`owner_equal_to` is defined in `<boost/smart_ptr/owner_equal_to.hpp>`.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
  template<class T = void> struct owner_equal_to
 | 
			
		||||
  {
 | 
			
		||||
    typedef bool result_type;
 | 
			
		||||
    typedef T first_argument_type;
 | 
			
		||||
    typedef T second_argument_type;
 | 
			
		||||
 | 
			
		||||
    template<class U, class V> bool operator()( U const & u, V const & v ) const noexcept;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Members
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class U, class V> bool operator()( U const & u, V const & v ) const noexcept;
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns::
 | 
			
		||||
  `u.owner_equals( v )`.
 | 
			
		||||
							
								
								
									
										56
									
								
								doc/smart_ptr/owner_hash.adoc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								doc/smart_ptr/owner_hash.adoc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,56 @@
 | 
			
		||||
////
 | 
			
		||||
Copyright 2020 Peter Dimov
 | 
			
		||||
Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
////
 | 
			
		||||
 | 
			
		||||
[#owner_hash]
 | 
			
		||||
# owner_hash
 | 
			
		||||
:toc:
 | 
			
		||||
:toc-title:
 | 
			
		||||
:idprefix: owner_hash_to_
 | 
			
		||||
 | 
			
		||||
## Description
 | 
			
		||||
 | 
			
		||||
`owner_hash<T>` is a helper function object that takes a smart pointer `p`
 | 
			
		||||
and returns `p.owner_hash_value()`. It's useful for creating unordered
 | 
			
		||||
containers of `shared_ptr` that use ownership-based equality, instead of
 | 
			
		||||
the default pointer value equality. (It can be used with `weak_ptr` too,
 | 
			
		||||
but there's no need, because `boost::hash` and `std::hash` for `weak_ptr`
 | 
			
		||||
already use ownership-based equality.)
 | 
			
		||||
 | 
			
		||||
## Example
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
std::unordered_set< boost::shared_ptr<void>,
 | 
			
		||||
  boost::owner_hash< boost::shared_ptr<void> >,
 | 
			
		||||
  boost::owner_equal_to< boost::shared_ptr<void> > > set;
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Synopsis
 | 
			
		||||
 | 
			
		||||
`owner_hash` is defined in `<boost/smart_ptr/owner_hash.hpp>`.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
  template<class T> struct owner_hash
 | 
			
		||||
  {
 | 
			
		||||
    typedef std::size_t result_type;
 | 
			
		||||
    typedef T argument_type;
 | 
			
		||||
 | 
			
		||||
    std::size_t operator()( T const & p ) const noexcept;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Members
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
std::size_t operator()( T const & p ) const noexcept;
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns::
 | 
			
		||||
  `p.owner_hash_value()`.
 | 
			
		||||
							
								
								
									
										50
									
								
								doc/smart_ptr/owner_less.adoc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								doc/smart_ptr/owner_less.adoc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
			
		||||
////
 | 
			
		||||
Copyright 2020 Peter Dimov
 | 
			
		||||
Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
////
 | 
			
		||||
 | 
			
		||||
[#owner_less]
 | 
			
		||||
# owner_less
 | 
			
		||||
:toc:
 | 
			
		||||
:toc-title:
 | 
			
		||||
:idprefix: owner_less_
 | 
			
		||||
 | 
			
		||||
## Description
 | 
			
		||||
 | 
			
		||||
`owner_less<T>` is a helper function object that compares two smart
 | 
			
		||||
pointer objects using `owner_before`. It is only provided for compatibility
 | 
			
		||||
with {cpp}11 and corresponds to the standard component of the same name.
 | 
			
		||||
 | 
			
		||||
When using Boost smart pointers, the use of `owner_less` is unnecessary, as
 | 
			
		||||
the supplied `operator<` overloads (and, correspondingly, `std::less`) return
 | 
			
		||||
the same result.
 | 
			
		||||
 | 
			
		||||
## Synopsis
 | 
			
		||||
 | 
			
		||||
`owner_less` is defined in `<boost/smart_ptr/owner_less.hpp>`.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
  template<class T = void> struct owner_less
 | 
			
		||||
  {
 | 
			
		||||
    typedef bool result_type;
 | 
			
		||||
    typedef T first_argument_type;
 | 
			
		||||
    typedef T second_argument_type;
 | 
			
		||||
 | 
			
		||||
    template<class U, class V> bool operator()( U const & u, V const & v ) const noexcept;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Members
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class U, class V> bool operator()( U const & u, V const & v ) const noexcept;
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns::
 | 
			
		||||
  `u.owner_before( v )`.
 | 
			
		||||
@@ -78,23 +78,29 @@ namespace boost {
 | 
			
		||||
```
 | 
			
		||||
template<class T, class U> T* static_pointer_cast(U* p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Returns::: `static_cast<T*>(p)`
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `static_cast<T*>(p)`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class U> std::shared_ptr<T>
 | 
			
		||||
  static_pointer_cast(const std::shared_ptr<U>& p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Returns::: `std::static_pointer_cast<T>(p)`
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `std::static_pointer_cast<T>(p)`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class U> std::unique_ptr<T>
 | 
			
		||||
  static_pointer_cast(std::unique_ptr<U>&& p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Requires::: The expression `static_cast<T*>((U*)0)` must be well-formed.
 | 
			
		||||
Returns::: `std::unique_ptr<T>(static_cast<typename
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Requires:: The expression `static_cast<T*>((U*)0)` must be well-formed.
 | 
			
		||||
Returns:: `std::unique_ptr<T>(static_cast<typename
 | 
			
		||||
std::unique_ptr<T>::element_type*>(p.release()))`.
 | 
			
		||||
 | 
			
		||||
CAUTION: The seemingly equivalent expression
 | 
			
		||||
@@ -106,25 +112,31 @@ undefined behavior, attempting to delete the same object twice.
 | 
			
		||||
```
 | 
			
		||||
template<class T, class U> T* dynamic_pointer_cast(U* p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Returns::: `dynamic_cast<T*>(p)`
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `dynamic_cast<T*>(p)`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class U> std::shared_ptr<T>
 | 
			
		||||
  dynamic_pointer_cast(const std::shared_ptr<U>& p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Returns::: `std::dynamic_pointer_cast<T>(p)`
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `std::dynamic_pointer_cast<T>(p)`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class U> std::unique_ptr<T>
 | 
			
		||||
  dynamic_pointer_cast(std::unique_ptr<U>&& p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Requires:::
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Requires::
 | 
			
		||||
* The expression `static_cast<T*>((U*)0)` must be well-formed.
 | 
			
		||||
* `T` must have a virtual destructor.
 | 
			
		||||
Returns:::
 | 
			
		||||
Returns::
 | 
			
		||||
* When `dynamic_cast<typename std::unique_ptr<T>::element_type*>(p.get())`
 | 
			
		||||
returns a non-zero value, `std::unique_ptr<T>(dynamic_cast<typename
 | 
			
		||||
std::unique_ptr<T>::element_type*>(p.release()));`.
 | 
			
		||||
@@ -135,23 +147,29 @@ std::unique_ptr<T>::element_type*>(p.release()));`.
 | 
			
		||||
```
 | 
			
		||||
template<class T, class U> T* const_pointer_cast(U* p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Returns::: `const_cast<T*>(p)`
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `const_cast<T*>(p)`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class U> std::shared_ptr<T>
 | 
			
		||||
  const_pointer_cast(const std::shared_ptr<U>& p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Returns::: `std::const_pointer_cast<T>(p)`
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `std::const_pointer_cast<T>(p)`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class U> std::unique_ptr<T>
 | 
			
		||||
  const_pointer_cast(std::unique_ptr<U>&& p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Requires::: The expression `const_cast<T*>((U*)0)` must be well-formed.
 | 
			
		||||
Returns::: `std::unique_ptr<T>(const_cast<typename
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Requires:: The expression `const_cast<T*>((U*)0)` must be well-formed.
 | 
			
		||||
Returns:: `std::unique_ptr<T>(const_cast<typename
 | 
			
		||||
std::unique_ptr<T>::element_type*>(p.release()))`.
 | 
			
		||||
 | 
			
		||||
### reinterpret_pointer_cast
 | 
			
		||||
@@ -159,23 +177,29 @@ std::unique_ptr<T>::element_type*>(p.release()))`.
 | 
			
		||||
```
 | 
			
		||||
template<class T, class U> T* reinterpret_pointer_cast(U* p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Returns::: `reinterpret_cast<T*>(p)`
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `reinterpret_cast<T*>(p)`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class U> std::shared_ptr<T>
 | 
			
		||||
  reinterpret_pointer_cast(const std::shared_ptr<U>& p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Returns::: `std::reinterpret_pointer_cast<T>(p)`
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `std::reinterpret_pointer_cast<T>(p)`
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class T, class U> std::unique_ptr<T>
 | 
			
		||||
  reinterpret_pointer_cast(std::unique_ptr<U>&& p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Requires::: The expression `reinterpret_cast<T*>((U*)0)` must be well-formed.
 | 
			
		||||
Returns::: `std::unique_ptr<T>(reinterpret_cast<typename
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Requires:: The expression `reinterpret_cast<T*>((U*)0)` must be well-formed.
 | 
			
		||||
Returns:: `std::unique_ptr<T>(reinterpret_cast<typename
 | 
			
		||||
std::unique_ptr<T>::element_type*>(p.release()))`.
 | 
			
		||||
 | 
			
		||||
## Example
 | 
			
		||||
@@ -210,4 +234,4 @@ int main()
 | 
			
		||||
 | 
			
		||||
  delete ptr;
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
```
 | 
			
		||||
 
 | 
			
		||||
@@ -105,42 +105,50 @@ Type:: Provides the type of the stored pointer.
 | 
			
		||||
```
 | 
			
		||||
explicit shared_array(T* p = 0);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Effects::: Constructs a `shared_array`, storing a copy of `p`, which must be a
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Constructs a `shared_array`, storing a copy of `p`, which must be a
 | 
			
		||||
pointer to an array that was allocated via a C++ `new[]` expression or be 0.
 | 
			
		||||
Afterwards, the use count is 1 (even if `p == 0`; see `~shared_array`).
 | 
			
		||||
Requires::: `T` is a complete type.
 | 
			
		||||
Throws::: `std::bad_alloc`. If an exception is thrown, `delete[] p` is called.
 | 
			
		||||
Requires:: `T` is a complete type.
 | 
			
		||||
Throws:: `std::bad_alloc`. If an exception is thrown, `delete[] p` is called.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class D> shared_array(T* p, D d);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Effects::: Constructs a `shared_array`, storing a copy of `p` and of `d`.
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Constructs a `shared_array`, storing a copy of `p` and of `d`.
 | 
			
		||||
Afterwards, the use count is 1. When the the time comes to delete the array
 | 
			
		||||
pointed to by `p`, the object `d` is used in the statement `d(p)`.
 | 
			
		||||
Requires:::
 | 
			
		||||
Requires::
 | 
			
		||||
* `T` is a complete type.
 | 
			
		||||
* The copy constructor and destructor of `D` must not throw.
 | 
			
		||||
* Invoking the object `d` with parameter `p` must not throw.
 | 
			
		||||
Throws::: `std::bad_alloc`. If an exception is thrown, `d(p)` is called.
 | 
			
		||||
Throws:: `std::bad_alloc`. If an exception is thrown, `d(p)` is called.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
shared_array(const shared_array& v) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Effects::: Constructs a `shared_array`, as if by storing a copy of the pointer
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Constructs a `shared_array`, as if by storing a copy of the pointer
 | 
			
		||||
stored in `v`. Afterwards, the use count for all copies is 1 more than the
 | 
			
		||||
initial use count.
 | 
			
		||||
Requires::: `T` is a complete type.
 | 
			
		||||
Requires:: `T` is a complete type.
 | 
			
		||||
 | 
			
		||||
### Destructor
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
~shared_array() noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Effects::: Decrements the use count. Then, if the use count is 0, deletes the
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Decrements the use count. Then, if the use count is 0, deletes the
 | 
			
		||||
array pointed to by the stored pointer. Note that `delete[]` on a pointer with
 | 
			
		||||
a value of 0 is harmless. 
 | 
			
		||||
 | 
			
		||||
@@ -149,60 +157,70 @@ a value of 0 is harmless.
 | 
			
		||||
```
 | 
			
		||||
shared_array& operator=(const shared_array& v) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Effects::: Constructs a new `shared_array` as described above, then replaces
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Constructs a new `shared_array` as described above, then replaces
 | 
			
		||||
this `shared_array` with the new one, destroying the replaced object.
 | 
			
		||||
Requires::: `T` is a complete type.
 | 
			
		||||
Returns::: `*this`.
 | 
			
		||||
Requires:: `T` is a complete type.
 | 
			
		||||
Returns:: `*this`.
 | 
			
		||||
 | 
			
		||||
### reset
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
void reset(T* p = 0);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Effects::: Constructs a new `shared_array` as described above, then replaces
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Constructs a new `shared_array` as described above, then replaces
 | 
			
		||||
this `shared_array` with the new one, destroying the replaced object.
 | 
			
		||||
Requires::: `T` is a complete type.
 | 
			
		||||
Throws::: `std::bad_alloc`. If an exception is thrown, `delete[] p` is called.
 | 
			
		||||
Requires:: `T` is a complete type.
 | 
			
		||||
Throws:: `std::bad_alloc`. If an exception is thrown, `delete[] p` is called.
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
template<class D> void reset(T* p, D d);
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Effects::: Constructs a new `shared_array` as described above, then replaces
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Constructs a new `shared_array` as described above, then replaces
 | 
			
		||||
this `shared_array` with the new one, destroying the replaced object.
 | 
			
		||||
Requires:::
 | 
			
		||||
Requires::
 | 
			
		||||
* `T` is a complete type.
 | 
			
		||||
* The copy constructor of `D` must not throw.
 | 
			
		||||
Throws::: `std::bad_alloc`. If an exception is thrown, `d(p)` is called.
 | 
			
		||||
Throws:: `std::bad_alloc`. If an exception is thrown, `d(p)` is called.
 | 
			
		||||
 | 
			
		||||
### Indexing
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
T& operator[](std::ptrdiff_t n) const noexcept;
 | 
			
		||||
```
 | 
			
		||||
Returns::: A reference to element `n` of the array pointed to by the stored
 | 
			
		||||
Returns:: A reference to element `n` of the array pointed to by the stored
 | 
			
		||||
pointer. Behavior is undefined and almost certainly undesirable if the stored
 | 
			
		||||
pointer is 0, or if `n` is less than 0 or is greater than or equal to the
 | 
			
		||||
number of elements in the array.
 | 
			
		||||
Requires::: `T` is a complete type.
 | 
			
		||||
Requires:: `T` is a complete type.
 | 
			
		||||
 | 
			
		||||
### get
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
T* get() const noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Returns::: The stored pointer.
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: The stored pointer.
 | 
			
		||||
 | 
			
		||||
### unique
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
bool unique() const noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Returns::: `true` if no other `shared_array` is sharing ownership of the
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `true` if no other `shared_array` is sharing ownership of the
 | 
			
		||||
stored pointer, `false` otherwise.
 | 
			
		||||
 | 
			
		||||
### use_count
 | 
			
		||||
@@ -210,8 +228,10 @@ stored pointer, `false` otherwise.
 | 
			
		||||
```
 | 
			
		||||
long use_count() const noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Returns::: The number of `shared_array` objects sharing ownership of the
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: The number of `shared_array` objects sharing ownership of the
 | 
			
		||||
stored pointer.
 | 
			
		||||
 | 
			
		||||
### Conversions
 | 
			
		||||
@@ -219,17 +239,21 @@ stored pointer.
 | 
			
		||||
```
 | 
			
		||||
explicit operator bool() const noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Returns::: `get() != 0`.
 | 
			
		||||
Requires::: `T` is a complete type.
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `get() != 0`.
 | 
			
		||||
Requires:: `T` is a complete type.
 | 
			
		||||
 | 
			
		||||
### swap
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
void swap(shared_array<T>& b) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Effects::: Exchanges the contents of the two smart pointers.
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Exchanges the contents of the two smart pointers.
 | 
			
		||||
 | 
			
		||||
## Free Functions
 | 
			
		||||
 | 
			
		||||
@@ -247,8 +271,10 @@ template<class T> bool
 | 
			
		||||
template<class T> bool
 | 
			
		||||
  operator<(const shared_array<T>& a, const shared_array<T>& b) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Returns::: The result of comparing the stored pointers of the two smart
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: The result of comparing the stored pointers of the two smart
 | 
			
		||||
pointers.
 | 
			
		||||
 | 
			
		||||
NOTE: The `operator<` overload is provided to define an ordering so that
 | 
			
		||||
@@ -265,6 +291,8 @@ mandates that relational operations on pointers are unspecified (5.9
 | 
			
		||||
template<class T>
 | 
			
		||||
  void swap(shared_array<T>& a, shared_array<T>& b) noexcept;
 | 
			
		||||
```
 | 
			
		||||
::
 | 
			
		||||
Returns::: `a.swap(b)`.
 | 
			
		||||
Requires::: `T` is a complete type.
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `a.swap(b)`.
 | 
			
		||||
Requires:: `T` is a complete type.
 | 
			
		||||
 
 | 
			
		||||
@@ -132,7 +132,6 @@ namespace boost {
 | 
			
		||||
    template<class Y> shared_ptr(shared_ptr<Y> && r) noexcept;
 | 
			
		||||
 | 
			
		||||
    template<class Y> shared_ptr(shared_ptr<Y> const & r, element_type * p) noexcept;
 | 
			
		||||
 | 
			
		||||
    template<class Y> shared_ptr(shared_ptr<Y> && r, element_type * p) noexcept;
 | 
			
		||||
 | 
			
		||||
    template<class Y> explicit shared_ptr(weak_ptr<Y> const & r);
 | 
			
		||||
@@ -179,8 +178,13 @@ namespace boost {
 | 
			
		||||
 | 
			
		||||
    void swap(shared_ptr & b) noexcept;
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_before(shared_ptr<Y> const & rhs) const noexcept;
 | 
			
		||||
    template<class Y> bool owner_before(weak_ptr<Y> const & rhs) const noexcept;
 | 
			
		||||
    template<class Y> bool owner_before(shared_ptr<Y> const & r) const noexcept;
 | 
			
		||||
    template<class Y> bool owner_before(weak_ptr<Y> const & r) const noexcept;
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_equals(shared_ptr<Y> const & r) const noexcept;
 | 
			
		||||
    template<class Y> bool owner_equals(weak_ptr<Y> const & r) const noexcept;
 | 
			
		||||
 | 
			
		||||
    std::size_t owner_hash_value() const noexcept;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  template<class T, class U>
 | 
			
		||||
@@ -373,7 +377,7 @@ template<class Y> shared_ptr(shared_ptr<Y> const & r, element_type * p) noexcept
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: constructs a `shared_ptr` that shares ownership with `r` and stores `p`.
 | 
			
		||||
Effects:: Copy-constructs a `shared_ptr` from `r`, while storing `p` instead.
 | 
			
		||||
 | 
			
		||||
Postconditions:: `get() == p && use_count() == r.use_count()`.
 | 
			
		||||
 | 
			
		||||
@@ -561,7 +565,8 @@ template<class Y> void reset(shared_ptr<Y> && r, element_type * p) noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Equivalent to `shared_ptr(std::move(r), p).swap(*this)`.
 | 
			
		||||
Effects::
 | 
			
		||||
  Equivalent to `shared_ptr(std::move(r), p).swap(*this)`.
 | 
			
		||||
 | 
			
		||||
### indirection
 | 
			
		||||
```
 | 
			
		||||
@@ -599,7 +604,8 @@ element_type * get() const noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: The stored pointer.
 | 
			
		||||
Returns::
 | 
			
		||||
  The stored pointer.
 | 
			
		||||
 | 
			
		||||
### unique
 | 
			
		||||
```
 | 
			
		||||
@@ -608,7 +614,8 @@ bool unique() const noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `use_count() == 1`.
 | 
			
		||||
Returns::
 | 
			
		||||
  `use_count() == 1`.
 | 
			
		||||
 | 
			
		||||
### use_count
 | 
			
		||||
```
 | 
			
		||||
@@ -617,7 +624,8 @@ long use_count() const noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: The number of `shared_ptr` objects, `*this` included, that share ownership with `*this`, or 0 when `*this` is empty.
 | 
			
		||||
Returns::
 | 
			
		||||
  The number of `shared_ptr` objects, `*this` included, that share ownership with `*this`, or 0 when `*this` is empty.
 | 
			
		||||
 | 
			
		||||
### conversions
 | 
			
		||||
```
 | 
			
		||||
@@ -642,19 +650,45 @@ void swap(shared_ptr & b) noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Exchanges the contents of the two smart pointers.
 | 
			
		||||
Effects::
 | 
			
		||||
  Exchanges the contents of the two smart pointers.
 | 
			
		||||
 | 
			
		||||
### owner_before
 | 
			
		||||
```
 | 
			
		||||
template<class Y> bool owner_before(shared_ptr<Y> const & rhs) const noexcept;
 | 
			
		||||
template<class Y> bool owner_before(shared_ptr<Y> const & r) const noexcept;
 | 
			
		||||
```
 | 
			
		||||
```
 | 
			
		||||
template<class Y> bool owner_before(weak_ptr<Y> const & rhs) const noexcept;
 | 
			
		||||
template<class Y> bool owner_before(weak_ptr<Y> const & r) const noexcept;
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: See the description of `operator<`.
 | 
			
		||||
Returns::
 | 
			
		||||
  See the description of `operator<`.
 | 
			
		||||
 | 
			
		||||
### owner_equals
 | 
			
		||||
```
 | 
			
		||||
template<class Y> bool owner_equals(shared_ptr<Y> const & r) const noexcept;
 | 
			
		||||
```
 | 
			
		||||
```
 | 
			
		||||
template<class Y> bool owner_equals(weak_ptr<Y> const & r) const noexcept;
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns::
 | 
			
		||||
  `true` if and only if `*this` and `r` share ownership or are both empty.
 | 
			
		||||
 | 
			
		||||
### owner_hash_value
 | 
			
		||||
```
 | 
			
		||||
std::size_t owner_hash_value() const noexcept;
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns::
 | 
			
		||||
  An unspecified hash value such that two instances that share ownership
 | 
			
		||||
  have the same hash value.
 | 
			
		||||
 | 
			
		||||
## Free Functions
 | 
			
		||||
 | 
			
		||||
@@ -722,7 +756,8 @@ template<class T> void swap(shared_ptr<T> & a, shared_ptr<T> & b) noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Equivalent to `a.swap(b)`.
 | 
			
		||||
Effects::
 | 
			
		||||
  Equivalent to `a.swap(b)`.
 | 
			
		||||
 | 
			
		||||
### get_pointer
 | 
			
		||||
```
 | 
			
		||||
@@ -806,7 +841,8 @@ template<class D, class T>
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: If `*this` owns a deleter `d` of type (cv-unqualified) `D`, returns `&d`; otherwise returns 0.
 | 
			
		||||
Returns::
 | 
			
		||||
  If `*this` owns a deleter `d` of type (cv-unqualified) `D`, returns `&d`; otherwise returns 0.
 | 
			
		||||
 | 
			
		||||
### Atomic Access
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -88,6 +88,10 @@ namespace boost {
 | 
			
		||||
 | 
			
		||||
    weak_ptr(weak_ptr && r) noexcept;
 | 
			
		||||
 | 
			
		||||
    template<class Y> weak_ptr(shared_ptr<Y> const & r, element_type * p) noexcept;
 | 
			
		||||
    template<class Y> weak_ptr(weak_ptr<Y> const & r, element_type * p) noexcept;
 | 
			
		||||
    template<class Y> weak_ptr(weak_ptr<Y> && r, element_type * p) noexcept;
 | 
			
		||||
 | 
			
		||||
    ~weak_ptr() noexcept;
 | 
			
		||||
 | 
			
		||||
    weak_ptr & operator=(weak_ptr const & r) noexcept;
 | 
			
		||||
@@ -98,6 +102,8 @@ namespace boost {
 | 
			
		||||
    long use_count() const noexcept;
 | 
			
		||||
    bool expired() const noexcept;
 | 
			
		||||
 | 
			
		||||
    bool empty() const noexcept;
 | 
			
		||||
 | 
			
		||||
    shared_ptr<T> lock() const noexcept;
 | 
			
		||||
 | 
			
		||||
    void reset() noexcept;
 | 
			
		||||
@@ -106,6 +112,11 @@ namespace boost {
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_before( weak_ptr<Y> const & r ) const noexcept;
 | 
			
		||||
    template<class Y> bool owner_before( shared_ptr<Y> const & r ) const noexcept;
 | 
			
		||||
 | 
			
		||||
    template<class Y> bool owner_equals( weak_ptr<Y> const & r ) const noexcept;
 | 
			
		||||
    template<class Y> bool owner_equals( shared_ptr<Y> const & r ) const noexcept;
 | 
			
		||||
 | 
			
		||||
    std::size_t owner_hash_value() const noexcept;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  template<class T, class U>
 | 
			
		||||
@@ -157,6 +168,21 @@ weak_ptr(weak_ptr && r) noexcept;
 | 
			
		||||
Effects:: Constructs a `weak_ptr` that has the value `r` held.
 | 
			
		||||
Postconditions:: `r` is empty.
 | 
			
		||||
 | 
			
		||||
### aliasing constructors
 | 
			
		||||
```
 | 
			
		||||
template<class Y> weak_ptr(shared_ptr<Y> const & r, element_type * p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
```
 | 
			
		||||
template<class Y> weak_ptr(weak_ptr<Y> const & r, element_type * p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
```
 | 
			
		||||
template<class Y> weak_ptr(weak_ptr<Y> && r, element_type * p) noexcept;
 | 
			
		||||
```
 | 
			
		||||
Effects:: Constructs a `weak_ptr` from `r` as if by using the corresponding converting/copy/move constructor, but stores `p` instead.
 | 
			
		||||
Postconditions:: `use_count() == r.use_count()`. When `!expired()`, `shared_ptr<T>(*this).get() == p`.
 | 
			
		||||
 | 
			
		||||
NOTE: These constructors are an extension, not present in `std::weak_ptr`.
 | 
			
		||||
 | 
			
		||||
### destructor
 | 
			
		||||
```
 | 
			
		||||
~weak_ptr() noexcept;
 | 
			
		||||
@@ -164,7 +190,8 @@ Postconditions:: `r` is empty.
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Destroys this `weak_ptr` but has no effect on the object its stored pointer points to.
 | 
			
		||||
Effects::
 | 
			
		||||
  Destroys this `weak_ptr` but has no effect on the object its stored pointer points to.
 | 
			
		||||
 | 
			
		||||
### assignment
 | 
			
		||||
```
 | 
			
		||||
@@ -193,7 +220,8 @@ long use_count() const noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: 0 if `*this` is empty; otherwise, the number of `shared_ptr` objects that share ownership with `*this`.
 | 
			
		||||
Returns::
 | 
			
		||||
  0 if `*this` is empty; otherwise, the number of `shared_ptr` objects that share ownership with `*this`.
 | 
			
		||||
 | 
			
		||||
### expired
 | 
			
		||||
```
 | 
			
		||||
@@ -202,7 +230,19 @@ bool expired() const noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `use_count() == 0`.
 | 
			
		||||
Returns::
 | 
			
		||||
  `use_count() == 0`.
 | 
			
		||||
 | 
			
		||||
### empty
 | 
			
		||||
```
 | 
			
		||||
bool empty() const noexcept;
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `true` when `*this` is empty, `false` otherwise.
 | 
			
		||||
 | 
			
		||||
NOTE: This function is an extension, not present in `std::weak_ptr`.
 | 
			
		||||
 | 
			
		||||
### lock
 | 
			
		||||
```
 | 
			
		||||
@@ -211,7 +251,8 @@ shared_ptr<T> lock() const noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: `expired()? shared_ptr<T>(): shared_ptr<T>(*this)`.
 | 
			
		||||
Returns::
 | 
			
		||||
  `expired()? shared_ptr<T>(): shared_ptr<T>(*this)`.
 | 
			
		||||
 | 
			
		||||
### reset
 | 
			
		||||
```
 | 
			
		||||
@@ -220,7 +261,8 @@ void reset() noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Equivalent to `weak_ptr().swap(*this)`.
 | 
			
		||||
Effects::
 | 
			
		||||
  Equivalent to `weak_ptr().swap(*this)`.
 | 
			
		||||
 | 
			
		||||
### swap
 | 
			
		||||
```
 | 
			
		||||
@@ -229,8 +271,10 @@ void swap(weak_ptr & b) noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Exchanges the contents of the two smart pointers.
 | 
			
		||||
Effects::
 | 
			
		||||
  Exchanges the contents of the two smart pointers.
 | 
			
		||||
 | 
			
		||||
### owner_before
 | 
			
		||||
```
 | 
			
		||||
template<class Y> bool owner_before( weak_ptr<Y> const & r ) const noexcept;
 | 
			
		||||
```
 | 
			
		||||
@@ -240,7 +284,32 @@ template<class Y> bool owner_before( shared_ptr<Y> const & r ) const noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns:: See the description of `operator<`.
 | 
			
		||||
Returns::
 | 
			
		||||
  See the description of `operator<`.
 | 
			
		||||
 | 
			
		||||
### owner_equals
 | 
			
		||||
```
 | 
			
		||||
template<class Y> bool owner_equals( weak_ptr<Y> const & r ) const noexcept;
 | 
			
		||||
```
 | 
			
		||||
```
 | 
			
		||||
template<class Y> bool owner_equals( shared_ptr<Y> const & r ) const noexcept;
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns::
 | 
			
		||||
  `true` if and only if `*this` and `r` share ownership or are both empty.
 | 
			
		||||
 | 
			
		||||
### owner_hash_value
 | 
			
		||||
```
 | 
			
		||||
std::size_t owner_hash_value() const noexcept;
 | 
			
		||||
```
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Returns::
 | 
			
		||||
  An unspecified hash value such that two instances that share ownership
 | 
			
		||||
  have the same hash value.
 | 
			
		||||
 | 
			
		||||
## Free Functions
 | 
			
		||||
 | 
			
		||||
@@ -266,7 +335,8 @@ template<class T> void swap(weak_ptr<T> & a, weak_ptr<T> & b) noexcept;
 | 
			
		||||
[none]
 | 
			
		||||
* {blank}
 | 
			
		||||
+
 | 
			
		||||
Effects:: Equivalent to `a.swap(b)`.
 | 
			
		||||
Effects::
 | 
			
		||||
  Equivalent to `a.swap(b)`.
 | 
			
		||||
 | 
			
		||||
## Frequently Asked Questions
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -73,7 +73,7 @@ void * operator new(size_t n) throw(bad_alloc)
 | 
			
		||||
    return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(__BORLANDC__) || (__BORLANDC__ > 0x551)
 | 
			
		||||
#if !defined(BOOST_BORLANDC) || (BOOST_BORLANDC > 0x551)
 | 
			
		||||
 | 
			
		||||
void * operator new(size_t n, nothrow_t const &) throw()
 | 
			
		||||
{
 | 
			
		||||
@@ -95,7 +95,7 @@ void * operator new[](size_t n) throw(bad_alloc)
 | 
			
		||||
    return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(__BORLANDC__) || (__BORLANDC__ > 0x551)
 | 
			
		||||
#if !defined(BOOST_BORLANDC) || (BOOST_BORLANDC > 0x551)
 | 
			
		||||
 | 
			
		||||
void * operator new[](size_t n, nothrow_t const &) throw()
 | 
			
		||||
{
 | 
			
		||||
@@ -205,7 +205,7 @@ void operator delete(void * p) throw()
 | 
			
		||||
    free(pm);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(__BORLANDC__) || (__BORLANDC__ > 0x551)
 | 
			
		||||
#if !defined(BOOST_BORLANDC) || (BOOST_BORLANDC > 0x551)
 | 
			
		||||
 | 
			
		||||
void operator delete(void * p, nothrow_t const &) throw()
 | 
			
		||||
{
 | 
			
		||||
@@ -231,7 +231,7 @@ void operator delete[](void * p) throw()
 | 
			
		||||
    free(pm);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(__BORLANDC__) || (__BORLANDC__ > 0x551)
 | 
			
		||||
#if !defined(BOOST_BORLANDC) || (BOOST_BORLANDC > 0x551)
 | 
			
		||||
 | 
			
		||||
void operator delete[](void * p, nothrow_t const &) throw()
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -21,168 +21,6 @@
 | 
			
		||||
//  template<class F> int lw_thread_create( lw_thread_t & th, F f );
 | 
			
		||||
//  void lw_thread_join( lw_thread_t th );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <cerrno>
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_HAS_PTHREADS )
 | 
			
		||||
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
typedef ::pthread_t lw_thread_t;
 | 
			
		||||
 | 
			
		||||
inline int lw_thread_create_( lw_thread_t* thread, const pthread_attr_t* attr, void* (*start_routine)( void* ), void* arg )
 | 
			
		||||
{
 | 
			
		||||
    return ::pthread_create( thread, attr, start_routine, arg );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void lw_thread_join( lw_thread_t th )
 | 
			
		||||
{
 | 
			
		||||
    ::pthread_join( th, 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#else // defined( BOOST_HAS_PTHREADS )
 | 
			
		||||
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
#include <process.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
typedef HANDLE lw_thread_t;
 | 
			
		||||
 | 
			
		||||
inline int lw_thread_create_( lw_thread_t * thread, void const *, unsigned (__stdcall * start_routine) (void*), void* arg )
 | 
			
		||||
{
 | 
			
		||||
    HANDLE h = (HANDLE)_beginthreadex( 0, 0, start_routine, arg, 0, 0 );
 | 
			
		||||
 | 
			
		||||
    if( h != 0 )
 | 
			
		||||
    {
 | 
			
		||||
        *thread = h;
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        return EAGAIN;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void lw_thread_join( lw_thread_t thread )
 | 
			
		||||
{
 | 
			
		||||
    ::WaitForSingleObject( thread, INFINITE );
 | 
			
		||||
    ::CloseHandle( thread );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // defined( BOOST_HAS_PTHREADS )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class lw_abstract_thread
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    virtual ~lw_abstract_thread() {}
 | 
			
		||||
    virtual void run() = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_HAS_PTHREADS )
 | 
			
		||||
 | 
			
		||||
extern "C" 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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class F> class lw_thread_impl: public lw_abstract_thread
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit lw_thread_impl( F f ): f_( f )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void run()
 | 
			
		||||
    {
 | 
			
		||||
        f_();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    F f_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
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 )
 | 
			
		||||
    {
 | 
			
		||||
        p.release();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return r;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
#include <boost/smart_ptr/detail/lightweight_thread.hpp>
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,7 @@ Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
#ifndef BOOST_SMART_PTR_ALLOCATE_LOCAL_SHARED_ARRAY_HPP
 | 
			
		||||
#define BOOST_SMART_PTR_ALLOCATE_LOCAL_SHARED_ARRAY_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/requires_cxx11.hpp>
 | 
			
		||||
#include <boost/smart_ptr/allocate_shared_array.hpp>
 | 
			
		||||
#include <boost/smart_ptr/local_shared_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
@@ -21,11 +22,12 @@ public:
 | 
			
		||||
        count_ = shared_count(base);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void local_cb_destroy() BOOST_SP_NOEXCEPT {
 | 
			
		||||
    void local_cb_destroy() BOOST_SP_NOEXCEPT BOOST_OVERRIDE {
 | 
			
		||||
        shared_count().swap(count_);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual shared_count local_cb_get_shared_count() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
    shared_count local_cb_get_shared_count() const
 | 
			
		||||
        BOOST_SP_NOEXCEPT BOOST_OVERRIDE {
 | 
			
		||||
        return count_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -72,21 +74,19 @@ inline typename enable_if_<is_unbounded_array<T>::value,
 | 
			
		||||
    local_shared_ptr<T> >::type
 | 
			
		||||
allocate_local_shared(const A& allocator, std::size_t count)
 | 
			
		||||
{
 | 
			
		||||
    typedef typename remove_extent<T>::type type;
 | 
			
		||||
    typedef typename detail::sp_array_scalar<T>::type scalar;
 | 
			
		||||
    typedef typename detail::sp_bind_allocator<A, scalar>::type other;
 | 
			
		||||
    typedef typename detail::sp_array_element<T>::type element;
 | 
			
		||||
    typedef typename allocator_rebind<A, element>::type other;
 | 
			
		||||
    typedef detail::lsp_array_state<other> state;
 | 
			
		||||
    typedef detail::sp_array_base<state> base;
 | 
			
		||||
    std::size_t size = count * detail::sp_array_count<type, scalar>::value;
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, size);
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, count);
 | 
			
		||||
    base* node = result.get();
 | 
			
		||||
    scalar* start = detail::sp_array_start<base, scalar>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(allocator, size, start);
 | 
			
		||||
    element* start = detail::sp_array_start<element>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(allocator, start, count);
 | 
			
		||||
    detail::lsp_array_base& local = node->state().base();
 | 
			
		||||
    local.set(node);
 | 
			
		||||
    result.release();
 | 
			
		||||
    return local_shared_ptr<T>(detail::lsp_internal_constructor_tag(),
 | 
			
		||||
        reinterpret_cast<type*>(start), &local);
 | 
			
		||||
    return local_shared_ptr<T>(detail::lsp_internal_constructor_tag(), start,
 | 
			
		||||
        &local);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
@@ -94,23 +94,22 @@ inline typename enable_if_<is_bounded_array<T>::value,
 | 
			
		||||
    local_shared_ptr<T> >::type
 | 
			
		||||
allocate_local_shared(const A& allocator)
 | 
			
		||||
{
 | 
			
		||||
    typedef typename remove_extent<T>::type type;
 | 
			
		||||
    typedef typename detail::sp_array_scalar<T>::type scalar;
 | 
			
		||||
    typedef typename detail::sp_bind_allocator<A, scalar>::type other;
 | 
			
		||||
    enum {
 | 
			
		||||
        size = detail::sp_array_count<T, scalar>::value
 | 
			
		||||
        count = extent<T>::value
 | 
			
		||||
    };
 | 
			
		||||
    typedef detail::lsp_size_array_state<other, size> state;
 | 
			
		||||
    typedef typename detail::sp_array_element<T>::type element;
 | 
			
		||||
    typedef typename allocator_rebind<A, element>::type other;
 | 
			
		||||
    typedef detail::lsp_size_array_state<other, count> state;
 | 
			
		||||
    typedef detail::sp_array_base<state> base;
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, size);
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, count);
 | 
			
		||||
    base* node = result.get();
 | 
			
		||||
    scalar* start = detail::sp_array_start<base, scalar>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(allocator, size, start);
 | 
			
		||||
    element* start = detail::sp_array_start<element>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(allocator, start, count);
 | 
			
		||||
    detail::lsp_array_base& local = node->state().base();
 | 
			
		||||
    local.set(node);
 | 
			
		||||
    result.release();
 | 
			
		||||
    return local_shared_ptr<T>(detail::lsp_internal_constructor_tag(),
 | 
			
		||||
        reinterpret_cast<type*>(start), &local);
 | 
			
		||||
    return local_shared_ptr<T>(detail::lsp_internal_constructor_tag(), start,
 | 
			
		||||
        &local);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
@@ -119,25 +118,19 @@ inline typename enable_if_<is_unbounded_array<T>::value,
 | 
			
		||||
allocate_local_shared(const A& allocator, std::size_t count,
 | 
			
		||||
    const typename remove_extent<T>::type& value)
 | 
			
		||||
{
 | 
			
		||||
    typedef typename remove_extent<T>::type type;
 | 
			
		||||
    typedef typename detail::sp_array_scalar<T>::type scalar;
 | 
			
		||||
    typedef typename detail::sp_bind_allocator<A, scalar>::type other;
 | 
			
		||||
    typedef typename detail::sp_array_element<T>::type element;
 | 
			
		||||
    typedef typename allocator_rebind<A, element>::type other;
 | 
			
		||||
    typedef detail::lsp_array_state<other> state;
 | 
			
		||||
    typedef detail::sp_array_base<state> base;
 | 
			
		||||
    enum {
 | 
			
		||||
        total = detail::sp_array_count<type, scalar>::value
 | 
			
		||||
    };
 | 
			
		||||
    std::size_t size = count * total;
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, size);
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, count);
 | 
			
		||||
    base* node = result.get();
 | 
			
		||||
    scalar* start = detail::sp_array_start<base, scalar>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(allocator, size,
 | 
			
		||||
        reinterpret_cast<const scalar*>(&value), total, start);
 | 
			
		||||
    element* start = detail::sp_array_start<element>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(allocator, start, count, value);
 | 
			
		||||
    detail::lsp_array_base& local = node->state().base();
 | 
			
		||||
    local.set(node);
 | 
			
		||||
    result.release();
 | 
			
		||||
    return local_shared_ptr<T>(detail::lsp_internal_constructor_tag(),
 | 
			
		||||
        reinterpret_cast<type*>(start), &local);
 | 
			
		||||
    return local_shared_ptr<T>(detail::lsp_internal_constructor_tag(), start,
 | 
			
		||||
        &local);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
@@ -146,25 +139,22 @@ inline typename enable_if_<is_bounded_array<T>::value,
 | 
			
		||||
allocate_local_shared(const A& allocator,
 | 
			
		||||
    const typename remove_extent<T>::type& value)
 | 
			
		||||
{
 | 
			
		||||
    typedef typename remove_extent<T>::type type;
 | 
			
		||||
    typedef typename detail::sp_array_scalar<T>::type scalar;
 | 
			
		||||
    typedef typename detail::sp_bind_allocator<A, scalar>::type other;
 | 
			
		||||
    enum {
 | 
			
		||||
        size = detail::sp_array_count<T, scalar>::value
 | 
			
		||||
        count = extent<T>::value
 | 
			
		||||
    };
 | 
			
		||||
    typedef detail::lsp_size_array_state<other, size> state;
 | 
			
		||||
    typedef typename detail::sp_array_element<T>::type element;
 | 
			
		||||
    typedef typename allocator_rebind<A, element>::type other;
 | 
			
		||||
    typedef detail::lsp_size_array_state<other, count> state;
 | 
			
		||||
    typedef detail::sp_array_base<state> base;
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, size);
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, count);
 | 
			
		||||
    base* node = result.get();
 | 
			
		||||
    scalar* start = detail::sp_array_start<base, scalar>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(allocator, size,
 | 
			
		||||
        reinterpret_cast<const scalar*>(&value),
 | 
			
		||||
        detail::sp_array_count<type, scalar>::value, start);
 | 
			
		||||
    element* start = detail::sp_array_start<element>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(allocator, start, count, value);
 | 
			
		||||
    detail::lsp_array_base& local = node->state().base();
 | 
			
		||||
    local.set(node);
 | 
			
		||||
    result.release();
 | 
			
		||||
    return local_shared_ptr<T>(detail::lsp_internal_constructor_tag(),
 | 
			
		||||
        reinterpret_cast<type*>(start), &local);
 | 
			
		||||
    return local_shared_ptr<T>(detail::lsp_internal_constructor_tag(), start,
 | 
			
		||||
        &local);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
@@ -172,22 +162,8 @@ inline typename enable_if_<is_unbounded_array<T>::value,
 | 
			
		||||
    local_shared_ptr<T> >::type
 | 
			
		||||
allocate_local_shared_noinit(const A& allocator, std::size_t count)
 | 
			
		||||
{
 | 
			
		||||
    typedef typename remove_extent<T>::type type;
 | 
			
		||||
    typedef typename detail::sp_array_scalar<T>::type scalar;
 | 
			
		||||
    typedef typename detail::sp_bind_allocator<A, scalar>::type other;
 | 
			
		||||
    typedef detail::lsp_array_state<other> state;
 | 
			
		||||
    typedef detail::sp_array_base<state, false> base;
 | 
			
		||||
    std::size_t size = count * detail::sp_array_count<type, scalar>::value;
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, size);
 | 
			
		||||
    base* node = result.get();
 | 
			
		||||
    scalar* start = detail::sp_array_start<base, scalar>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(detail::sp_default(), allocator,
 | 
			
		||||
        size, start);
 | 
			
		||||
    detail::lsp_array_base& local = node->state().base();
 | 
			
		||||
    local.set(node);
 | 
			
		||||
    result.release();
 | 
			
		||||
    return local_shared_ptr<T>(detail::lsp_internal_constructor_tag(),
 | 
			
		||||
        reinterpret_cast<type*>(start), &local);
 | 
			
		||||
    return boost::allocate_local_shared<T>(boost::noinit_adapt(allocator),
 | 
			
		||||
        count);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
@@ -195,24 +171,7 @@ inline typename enable_if_<is_bounded_array<T>::value,
 | 
			
		||||
    local_shared_ptr<T> >::type
 | 
			
		||||
allocate_local_shared_noinit(const A& allocator)
 | 
			
		||||
{
 | 
			
		||||
    typedef typename remove_extent<T>::type type;
 | 
			
		||||
    typedef typename detail::sp_array_scalar<T>::type scalar;
 | 
			
		||||
    typedef typename detail::sp_bind_allocator<A, scalar>::type other;
 | 
			
		||||
    enum {
 | 
			
		||||
        size = detail::sp_array_count<T, scalar>::value
 | 
			
		||||
    };
 | 
			
		||||
    typedef detail::lsp_size_array_state<other, size> state;
 | 
			
		||||
    typedef detail::sp_array_base<state, false> base;
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, size);
 | 
			
		||||
    base* node = result.get();
 | 
			
		||||
    scalar* start = detail::sp_array_start<base, scalar>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(detail::sp_default(), allocator,
 | 
			
		||||
        size, start);
 | 
			
		||||
    detail::lsp_array_base& local = node->state().base();
 | 
			
		||||
    local.set(node);
 | 
			
		||||
    result.release();
 | 
			
		||||
    return local_shared_ptr<T>(detail::lsp_internal_constructor_tag(),
 | 
			
		||||
        reinterpret_cast<type*>(start), &local);
 | 
			
		||||
    return boost::allocate_local_shared<T>(boost::noinit_adapt(allocator));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} /* boost */
 | 
			
		||||
 
 | 
			
		||||
@@ -8,15 +8,16 @@ Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
#ifndef BOOST_SMART_PTR_ALLOCATE_SHARED_ARRAY_HPP
 | 
			
		||||
#define BOOST_SMART_PTR_ALLOCATE_SHARED_ARRAY_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/requires_cxx11.hpp>
 | 
			
		||||
#include <boost/core/allocator_access.hpp>
 | 
			
		||||
#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/has_trivial_assign.hpp>
 | 
			
		||||
#include <boost/type_traits/has_trivial_constructor.hpp>
 | 
			
		||||
#include <boost/type_traits/has_trivial_destructor.hpp>
 | 
			
		||||
#include <boost/type_traits/remove_all_extents.hpp>
 | 
			
		||||
#include <boost/type_traits/remove_cv.hpp>
 | 
			
		||||
#include <boost/type_traits/remove_extent.hpp>
 | 
			
		||||
#include <boost/type_traits/type_with_alignment.hpp>
 | 
			
		||||
@@ -25,15 +26,22 @@ namespace boost {
 | 
			
		||||
namespace detail {
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct sp_array_scalar {
 | 
			
		||||
struct sp_array_element {
 | 
			
		||||
    typedef typename boost::remove_cv<typename
 | 
			
		||||
        boost::remove_all_extents<T>::type>::type type;
 | 
			
		||||
        boost::remove_extent<T>::type>::type type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
template<class T>
 | 
			
		||||
struct sp_array_count {
 | 
			
		||||
    enum {
 | 
			
		||||
        value = sizeof(T) / sizeof(U)
 | 
			
		||||
        value = 1
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, std::size_t N>
 | 
			
		||||
struct sp_array_count<T[N]> {
 | 
			
		||||
    enum {
 | 
			
		||||
        value = N * sp_array_count<T>::value
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -51,18 +59,6 @@ struct sp_align_up {
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
 | 
			
		||||
template<class A, class T>
 | 
			
		||||
struct sp_bind_allocator {
 | 
			
		||||
    typedef typename std::allocator_traits<A>::template rebind_alloc<T> type;
 | 
			
		||||
};
 | 
			
		||||
#else
 | 
			
		||||
template<class A, class T>
 | 
			
		||||
struct sp_bind_allocator {
 | 
			
		||||
    typedef typename A::template rebind<T>::other type;
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
BOOST_CONSTEXPR inline std::size_t
 | 
			
		||||
sp_objects(std::size_t size) BOOST_SP_NOEXCEPT
 | 
			
		||||
@@ -70,154 +66,6 @@ sp_objects(std::size_t size) BOOST_SP_NOEXCEPT
 | 
			
		||||
    return (size + sizeof(T) - 1) / sizeof(T);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<bool E, class A, class T>
 | 
			
		||||
inline typename boost::enable_if_<!E &&
 | 
			
		||||
    boost::has_trivial_destructor<T>::value>::type
 | 
			
		||||
sp_array_destroy(A&, T*, std::size_t) BOOST_SP_NOEXCEPT { }
 | 
			
		||||
 | 
			
		||||
template<bool E, class A, class T>
 | 
			
		||||
inline typename boost::enable_if_<!E &&
 | 
			
		||||
    !boost::has_trivial_destructor<T>::value>::type
 | 
			
		||||
sp_array_destroy(A&, T* ptr, std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
    while (size > 0) {
 | 
			
		||||
        ptr[--size].~T();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
 | 
			
		||||
template<bool E, class A, class T>
 | 
			
		||||
inline typename boost::enable_if_<E>::type
 | 
			
		||||
sp_array_destroy(A& allocator, T* ptr, std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
    while (size > 0) {
 | 
			
		||||
        std::allocator_traits<A>::destroy(allocator, ptr + --size);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<bool E, class A, class T>
 | 
			
		||||
class sp_destroyer {
 | 
			
		||||
public:
 | 
			
		||||
    sp_destroyer(A& allocator, T* ptr) BOOST_SP_NOEXCEPT
 | 
			
		||||
        : allocator_(allocator),
 | 
			
		||||
          ptr_(ptr),
 | 
			
		||||
          size_(0) { }
 | 
			
		||||
 | 
			
		||||
    ~sp_destroyer() {
 | 
			
		||||
        sp_array_destroy<E>(allocator_, ptr_, size_);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::size_t& size() BOOST_SP_NOEXCEPT {
 | 
			
		||||
        return size_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    sp_destroyer(const sp_destroyer&);
 | 
			
		||||
    sp_destroyer& operator=(const sp_destroyer&);
 | 
			
		||||
 | 
			
		||||
    A& allocator_;
 | 
			
		||||
    T* ptr_;
 | 
			
		||||
    std::size_t size_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<bool E, class A, class T>
 | 
			
		||||
inline typename boost::enable_if_<!E &&
 | 
			
		||||
    boost::has_trivial_constructor<T>::value &&
 | 
			
		||||
    boost::has_trivial_assign<T>::value &&
 | 
			
		||||
    boost::has_trivial_destructor<T>::value>::type
 | 
			
		||||
sp_array_construct(A&, T* ptr, std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
    for (std::size_t i = 0; i < size; ++i) {
 | 
			
		||||
        ptr[i] = T();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<bool E, class A, class T>
 | 
			
		||||
inline typename boost::enable_if_<!E &&
 | 
			
		||||
    boost::has_trivial_constructor<T>::value &&
 | 
			
		||||
    boost::has_trivial_assign<T>::value &&
 | 
			
		||||
    boost::has_trivial_destructor<T>::value>::type
 | 
			
		||||
sp_array_construct(A&, T* ptr, std::size_t size, const T* list,
 | 
			
		||||
    std::size_t count)
 | 
			
		||||
{
 | 
			
		||||
    for (std::size_t i = 0; i < size; ++i) {
 | 
			
		||||
        ptr[i] = list[i % count];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<bool E, class A, class T>
 | 
			
		||||
inline typename boost::enable_if_<!E &&
 | 
			
		||||
    !(boost::has_trivial_constructor<T>::value &&
 | 
			
		||||
      boost::has_trivial_assign<T>::value &&
 | 
			
		||||
      boost::has_trivial_destructor<T>::value)>::type
 | 
			
		||||
sp_array_construct(A& none, T* ptr, std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
    sp_destroyer<E, A, T> hold(none, ptr);
 | 
			
		||||
    for (std::size_t& i = hold.size(); i < size; ++i) {
 | 
			
		||||
        ::new(static_cast<void*>(ptr + i)) T();
 | 
			
		||||
    }
 | 
			
		||||
    hold.size() = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<bool E, class A, class T>
 | 
			
		||||
inline typename boost::enable_if_<!E &&
 | 
			
		||||
    !(boost::has_trivial_constructor<T>::value &&
 | 
			
		||||
      boost::has_trivial_assign<T>::value &&
 | 
			
		||||
      boost::has_trivial_destructor<T>::value)>::type
 | 
			
		||||
sp_array_construct(A& none, T* ptr, std::size_t size, const T* list,
 | 
			
		||||
    std::size_t count)
 | 
			
		||||
{
 | 
			
		||||
    sp_destroyer<E, A, T> hold(none, ptr);
 | 
			
		||||
    for (std::size_t& i = hold.size(); i < size; ++i) {
 | 
			
		||||
        ::new(static_cast<void*>(ptr + i)) T(list[i % count]);
 | 
			
		||||
    }
 | 
			
		||||
    hold.size() = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
 | 
			
		||||
template<bool E, class A, class T>
 | 
			
		||||
inline typename boost::enable_if_<E>::type
 | 
			
		||||
sp_array_construct(A& allocator, T* ptr, std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
    sp_destroyer<E, A, T> hold(allocator, ptr);
 | 
			
		||||
    for (std::size_t& i = hold.size(); i < size; ++i) {
 | 
			
		||||
        std::allocator_traits<A>::construct(allocator, ptr + i);
 | 
			
		||||
    }
 | 
			
		||||
    hold.size() = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<bool E, class A, class T>
 | 
			
		||||
inline typename boost::enable_if_<E>::type
 | 
			
		||||
sp_array_construct(A& allocator, T* ptr, std::size_t size, const T* list,
 | 
			
		||||
    std::size_t count)
 | 
			
		||||
{
 | 
			
		||||
    sp_destroyer<E, A, T> hold(allocator, ptr);
 | 
			
		||||
    for (std::size_t& i = hold.size(); i < size; ++i) {
 | 
			
		||||
        std::allocator_traits<A>::construct(allocator, ptr + i,
 | 
			
		||||
            list[i % count]);
 | 
			
		||||
    }
 | 
			
		||||
    hold.size() = 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class A, class T>
 | 
			
		||||
inline typename
 | 
			
		||||
    boost::enable_if_<boost::has_trivial_constructor<T>::value>::type
 | 
			
		||||
sp_array_default(A&, T*, std::size_t) BOOST_SP_NOEXCEPT { }
 | 
			
		||||
 | 
			
		||||
template<class A, class T>
 | 
			
		||||
inline typename
 | 
			
		||||
    boost::enable_if_<!boost::has_trivial_constructor<T>::value>::type
 | 
			
		||||
sp_array_default(A& none, T* ptr, std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
    sp_destroyer<false, A, T> hold(none, ptr);
 | 
			
		||||
    for (std::size_t& i = hold.size(); i < size; ++i) {
 | 
			
		||||
        ::new(static_cast<void*>(ptr + i)) T;
 | 
			
		||||
    }
 | 
			
		||||
    hold.size() = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class A>
 | 
			
		||||
class sp_array_state {
 | 
			
		||||
public:
 | 
			
		||||
@@ -262,29 +110,6 @@ private:
 | 
			
		||||
    A allocator_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
 | 
			
		||||
template<class A>
 | 
			
		||||
struct sp_use_construct {
 | 
			
		||||
    enum {
 | 
			
		||||
        value = true
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct sp_use_construct<std::allocator<T> > {
 | 
			
		||||
    enum {
 | 
			
		||||
        value = false
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
#else
 | 
			
		||||
template<class>
 | 
			
		||||
struct sp_use_construct {
 | 
			
		||||
    enum {
 | 
			
		||||
        value = false
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
struct sp_array_alignment {
 | 
			
		||||
    enum {
 | 
			
		||||
@@ -300,39 +125,32 @@ struct sp_array_offset {
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
struct sp_array_storage {
 | 
			
		||||
    enum {
 | 
			
		||||
        value = sp_array_alignment<T, U>::value
 | 
			
		||||
    };
 | 
			
		||||
    typedef typename boost::type_with_alignment<value>::type type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
template<class U, class T>
 | 
			
		||||
inline U*
 | 
			
		||||
sp_array_start(void* base) BOOST_SP_NOEXCEPT
 | 
			
		||||
sp_array_start(T* base) BOOST_SP_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    enum {
 | 
			
		||||
        size = sp_array_offset<T, U>::value
 | 
			
		||||
    };
 | 
			
		||||
    return reinterpret_cast<U*>(static_cast<char*>(base) + size);
 | 
			
		||||
    return reinterpret_cast<U*>(reinterpret_cast<char*>(base) + size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class A, class T>
 | 
			
		||||
class sp_array_creator {
 | 
			
		||||
    typedef typename A::value_type scalar;
 | 
			
		||||
    typedef typename A::value_type element;
 | 
			
		||||
 | 
			
		||||
    enum {
 | 
			
		||||
        offset = sp_array_offset<T, scalar>::value
 | 
			
		||||
        offset = sp_array_offset<T, element>::value
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    typedef typename sp_array_storage<T, scalar>::type type;
 | 
			
		||||
    typedef typename boost::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
 | 
			
		||||
        : other_(other),
 | 
			
		||||
          size_(sp_objects<type>(offset + sizeof(scalar) * size)) { }
 | 
			
		||||
          size_(sp_objects<type>(offset + sizeof(element) * size)) { }
 | 
			
		||||
 | 
			
		||||
    T* create() {
 | 
			
		||||
        return reinterpret_cast<T*>(other_.allocate(size_));
 | 
			
		||||
@@ -343,13 +161,11 @@ public:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    typename sp_bind_allocator<A, type>::type other_;
 | 
			
		||||
    typename boost::allocator_rebind<A, type>::type other_;
 | 
			
		||||
    std::size_t size_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct sp_default { };
 | 
			
		||||
 | 
			
		||||
template<class T, bool E = sp_use_construct<T>::value>
 | 
			
		||||
template<class T>
 | 
			
		||||
class BOOST_SYMBOL_VISIBLE sp_array_base
 | 
			
		||||
    : public sp_counted_base {
 | 
			
		||||
    typedef typename T::type allocator;
 | 
			
		||||
@@ -358,50 +174,51 @@ public:
 | 
			
		||||
    typedef typename allocator::value_type type;
 | 
			
		||||
 | 
			
		||||
    template<class A>
 | 
			
		||||
    sp_array_base(const A& other, std::size_t size, type* start)
 | 
			
		||||
    sp_array_base(const A& other, type* start, std::size_t size)
 | 
			
		||||
        : state_(other, size) {
 | 
			
		||||
        sp_array_construct<E>(state_.allocator(), start, state_.size());
 | 
			
		||||
        boost::alloc_construct_n(state_.allocator(),
 | 
			
		||||
            boost::first_scalar(start),
 | 
			
		||||
            state_.size() * sp_array_count<type>::value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class A>
 | 
			
		||||
    sp_array_base(const A& other, std::size_t size, const type* list,
 | 
			
		||||
        std::size_t count, type* start)
 | 
			
		||||
    template<class A, class U>
 | 
			
		||||
    sp_array_base(const A& other, type* start, std::size_t size, const U& list)
 | 
			
		||||
        : state_(other, size) {
 | 
			
		||||
        sp_array_construct<E>(state_.allocator(), start, state_.size(), list,
 | 
			
		||||
            count);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class A>
 | 
			
		||||
    sp_array_base(sp_default, const A& other, std::size_t size, type* start)
 | 
			
		||||
        : state_(other, size) {
 | 
			
		||||
        sp_array_default(state_.allocator(), start, state_.size());
 | 
			
		||||
        enum {
 | 
			
		||||
            count = sp_array_count<type>::value
 | 
			
		||||
        };
 | 
			
		||||
        boost::alloc_construct_n(state_.allocator(),
 | 
			
		||||
            boost::first_scalar(start), state_.size() * count,
 | 
			
		||||
            boost::first_scalar(&list), count);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T& state() BOOST_SP_NOEXCEPT {
 | 
			
		||||
        return state_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() BOOST_SP_NOEXCEPT {
 | 
			
		||||
        sp_array_destroy<E>(state_.allocator(),
 | 
			
		||||
            sp_array_start<sp_array_base, type>(this), state_.size());
 | 
			
		||||
    void dispose() BOOST_SP_NOEXCEPT BOOST_OVERRIDE {
 | 
			
		||||
        boost::alloc_destroy_n(state_.allocator(),
 | 
			
		||||
            boost::first_scalar(sp_array_start<type>(this)),
 | 
			
		||||
            state_.size() * sp_array_count<type>::value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() BOOST_SP_NOEXCEPT {
 | 
			
		||||
    void destroy() BOOST_SP_NOEXCEPT BOOST_OVERRIDE {
 | 
			
		||||
        sp_array_creator<allocator, sp_array_base> other(state_.allocator(),
 | 
			
		||||
            state_.size());
 | 
			
		||||
        this->~sp_array_base();
 | 
			
		||||
        other.destroy(this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void* get_deleter(const sp_typeinfo&) BOOST_SP_NOEXCEPT {
 | 
			
		||||
    void* get_deleter(const sp_typeinfo_&) BOOST_SP_NOEXCEPT BOOST_OVERRIDE {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void* get_local_deleter(const sp_typeinfo&) BOOST_SP_NOEXCEPT {
 | 
			
		||||
    void* get_local_deleter(const sp_typeinfo_&)
 | 
			
		||||
        BOOST_SP_NOEXCEPT BOOST_OVERRIDE {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void* get_untyped_deleter() BOOST_SP_NOEXCEPT {
 | 
			
		||||
    void* get_untyped_deleter() BOOST_SP_NOEXCEPT BOOST_OVERRIDE {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -423,11 +240,11 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T* get() const {
 | 
			
		||||
    T* get() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
        return result_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() {
 | 
			
		||||
    void release() BOOST_SP_NOEXCEPT {
 | 
			
		||||
        result_ = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -445,40 +262,37 @@ template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
allocate_shared(const A& allocator, std::size_t count)
 | 
			
		||||
{
 | 
			
		||||
    typedef typename remove_extent<T>::type type;
 | 
			
		||||
    typedef typename detail::sp_array_scalar<T>::type scalar;
 | 
			
		||||
    typedef typename detail::sp_bind_allocator<A, scalar>::type other;
 | 
			
		||||
    typedef typename detail::sp_array_element<T>::type element;
 | 
			
		||||
    typedef typename allocator_rebind<A, element>::type other;
 | 
			
		||||
    typedef detail::sp_array_state<other> state;
 | 
			
		||||
    typedef detail::sp_array_base<state> base;
 | 
			
		||||
    std::size_t size = count * detail::sp_array_count<type, scalar>::value;
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, size);
 | 
			
		||||
    detail::sp_counted_base* node = result.get();
 | 
			
		||||
    scalar* start = detail::sp_array_start<base, scalar>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(allocator, size, start);
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, count);
 | 
			
		||||
    base* node = result.get();
 | 
			
		||||
    element* start = detail::sp_array_start<element>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(allocator, start, count);
 | 
			
		||||
    result.release();
 | 
			
		||||
    return shared_ptr<T>(detail::sp_internal_constructor_tag(),
 | 
			
		||||
        reinterpret_cast<type*>(start), detail::shared_count(node));
 | 
			
		||||
    return shared_ptr<T>(detail::sp_internal_constructor_tag(), start,
 | 
			
		||||
        detail::shared_count(static_cast<detail::sp_counted_base*>(node)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_bounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
allocate_shared(const A& allocator)
 | 
			
		||||
{
 | 
			
		||||
    typedef typename remove_extent<T>::type type;
 | 
			
		||||
    typedef typename detail::sp_array_scalar<T>::type scalar;
 | 
			
		||||
    typedef typename detail::sp_bind_allocator<A, scalar>::type other;
 | 
			
		||||
    enum {
 | 
			
		||||
        size = detail::sp_array_count<T, scalar>::value
 | 
			
		||||
        count = extent<T>::value
 | 
			
		||||
    };
 | 
			
		||||
    typedef detail::sp_size_array_state<other, size> state;
 | 
			
		||||
    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_array_base<state> base;
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, size);
 | 
			
		||||
    detail::sp_counted_base* node = result.get();
 | 
			
		||||
    scalar* start = detail::sp_array_start<base, scalar>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(allocator, size, start);
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, count);
 | 
			
		||||
    base* node = result.get();
 | 
			
		||||
    element* start = detail::sp_array_start<element>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(allocator, start, count);
 | 
			
		||||
    result.release();
 | 
			
		||||
    return shared_ptr<T>(detail::sp_internal_constructor_tag(),
 | 
			
		||||
        reinterpret_cast<type*>(start), detail::shared_count(node));
 | 
			
		||||
    return shared_ptr<T>(detail::sp_internal_constructor_tag(), start,
 | 
			
		||||
        detail::shared_count(static_cast<detail::sp_counted_base*>(node)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
@@ -486,23 +300,17 @@ inline typename enable_if_<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)
 | 
			
		||||
{
 | 
			
		||||
    typedef typename remove_extent<T>::type type;
 | 
			
		||||
    typedef typename detail::sp_array_scalar<T>::type scalar;
 | 
			
		||||
    typedef typename detail::sp_bind_allocator<A, scalar>::type other;
 | 
			
		||||
    typedef typename detail::sp_array_element<T>::type element;
 | 
			
		||||
    typedef typename allocator_rebind<A, element>::type other;
 | 
			
		||||
    typedef detail::sp_array_state<other> state;
 | 
			
		||||
    typedef detail::sp_array_base<state> base;
 | 
			
		||||
    enum {
 | 
			
		||||
        total = detail::sp_array_count<type, scalar>::value
 | 
			
		||||
    };
 | 
			
		||||
    std::size_t size = count * total;
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, size);
 | 
			
		||||
    detail::sp_counted_base* node = result.get();
 | 
			
		||||
    scalar* start = detail::sp_array_start<base, scalar>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(allocator, size,
 | 
			
		||||
        reinterpret_cast<const scalar*>(&value), total, start);
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, count);
 | 
			
		||||
    base* node = result.get();
 | 
			
		||||
    element* start = detail::sp_array_start<element>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(allocator, start, count, value);
 | 
			
		||||
    result.release();
 | 
			
		||||
    return shared_ptr<T>(detail::sp_internal_constructor_tag(),
 | 
			
		||||
        reinterpret_cast<type*>(start), detail::shared_count(node));
 | 
			
		||||
    return shared_ptr<T>(detail::sp_internal_constructor_tag(), start,
 | 
			
		||||
        detail::shared_count(static_cast<detail::sp_counted_base*>(node)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
@@ -510,65 +318,34 @@ inline typename enable_if_<is_bounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
allocate_shared(const A& allocator,
 | 
			
		||||
    const typename remove_extent<T>::type& value)
 | 
			
		||||
{
 | 
			
		||||
    typedef typename remove_extent<T>::type type;
 | 
			
		||||
    typedef typename detail::sp_array_scalar<T>::type scalar;
 | 
			
		||||
    typedef typename detail::sp_bind_allocator<A, scalar>::type other;
 | 
			
		||||
    enum {
 | 
			
		||||
        size = detail::sp_array_count<T, scalar>::value
 | 
			
		||||
        count = extent<T>::value
 | 
			
		||||
    };
 | 
			
		||||
    typedef detail::sp_size_array_state<other, size> state;
 | 
			
		||||
    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_array_base<state> base;
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, size);
 | 
			
		||||
    detail::sp_counted_base* node = result.get();
 | 
			
		||||
    scalar* start = detail::sp_array_start<base, scalar>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(allocator, size,
 | 
			
		||||
        reinterpret_cast<const scalar*>(&value),
 | 
			
		||||
        detail::sp_array_count<type, scalar>::value, start);
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, count);
 | 
			
		||||
    base* node = result.get();
 | 
			
		||||
    element* start = detail::sp_array_start<element>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(allocator, start, count, value);
 | 
			
		||||
    result.release();
 | 
			
		||||
    return shared_ptr<T>(detail::sp_internal_constructor_tag(),
 | 
			
		||||
        reinterpret_cast<type*>(start), detail::shared_count(node));
 | 
			
		||||
    return shared_ptr<T>(detail::sp_internal_constructor_tag(), start,
 | 
			
		||||
        detail::shared_count(static_cast<detail::sp_counted_base*>(node)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value, shared_ptr<T> >::type
 | 
			
		||||
allocate_shared_noinit(const A& allocator, std::size_t count)
 | 
			
		||||
{
 | 
			
		||||
    typedef typename remove_extent<T>::type type;
 | 
			
		||||
    typedef typename detail::sp_array_scalar<T>::type scalar;
 | 
			
		||||
    typedef typename detail::sp_bind_allocator<A, scalar>::type other;
 | 
			
		||||
    typedef detail::sp_array_state<other> state;
 | 
			
		||||
    typedef detail::sp_array_base<state, false> base;
 | 
			
		||||
    std::size_t size = count * detail::sp_array_count<type, scalar>::value;
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, size);
 | 
			
		||||
    detail::sp_counted_base* node = result.get();
 | 
			
		||||
    scalar* start = detail::sp_array_start<base, scalar>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(detail::sp_default(), allocator,
 | 
			
		||||
        size, start);
 | 
			
		||||
    result.release();
 | 
			
		||||
    return shared_ptr<T>(detail::sp_internal_constructor_tag(),
 | 
			
		||||
        reinterpret_cast<type*>(start), detail::shared_count(node));
 | 
			
		||||
    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
 | 
			
		||||
allocate_shared_noinit(const A& allocator)
 | 
			
		||||
{
 | 
			
		||||
    typedef typename remove_extent<T>::type type;
 | 
			
		||||
    typedef typename detail::sp_array_scalar<T>::type scalar;
 | 
			
		||||
    typedef typename detail::sp_bind_allocator<A, scalar>::type other;
 | 
			
		||||
    enum {
 | 
			
		||||
        size = detail::sp_array_count<T, scalar>::value
 | 
			
		||||
    };
 | 
			
		||||
    typedef detail::sp_size_array_state<other, size> state;
 | 
			
		||||
    typedef detail::sp_array_base<state, false> base;
 | 
			
		||||
    detail::sp_array_result<other, base> result(allocator, size);
 | 
			
		||||
    detail::sp_counted_base* node = result.get();
 | 
			
		||||
    scalar* start = detail::sp_array_start<base, scalar>(node);
 | 
			
		||||
    ::new(static_cast<void*>(node)) base(detail::sp_default(), allocator,
 | 
			
		||||
        size, start);
 | 
			
		||||
    result.release();
 | 
			
		||||
    return shared_ptr<T>(detail::sp_internal_constructor_tag(),
 | 
			
		||||
        reinterpret_cast<type*>(start), detail::shared_count(node));
 | 
			
		||||
    return boost::allocate_shared<T>(boost::noinit_adapt(allocator));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} /* boost */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										492
									
								
								include/boost/smart_ptr/allocate_unique.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										492
									
								
								include/boost/smart_ptr/allocate_unique.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,492 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2019-2021 Glen Joseph Fernandes
 | 
			
		||||
(glenjofe@gmail.com)
 | 
			
		||||
 | 
			
		||||
Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
(http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
*/
 | 
			
		||||
#ifndef BOOST_SMART_PTR_ALLOCATE_UNIQUE_HPP
 | 
			
		||||
#define BOOST_SMART_PTR_ALLOCATE_UNIQUE_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/requires_cxx11.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/config.hpp>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <utility>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
namespace detail {
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct sp_alloc_size {
 | 
			
		||||
    BOOST_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;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct sp_alloc_result {
 | 
			
		||||
    typedef T type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, std::size_t N>
 | 
			
		||||
struct sp_alloc_result<T[N]> {
 | 
			
		||||
    typedef T type[];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct sp_alloc_value {
 | 
			
		||||
    typedef typename boost::remove_cv<typename
 | 
			
		||||
        boost::remove_extent<T>::type>::type type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class P>
 | 
			
		||||
class sp_alloc_ptr {
 | 
			
		||||
public:
 | 
			
		||||
    typedef T element_type;
 | 
			
		||||
 | 
			
		||||
    sp_alloc_ptr() BOOST_SP_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)) { }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    sp_alloc_ptr(std::size_t, P p) BOOST_SP_NOEXCEPT
 | 
			
		||||
        : p_(p) { }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_NULLPTR)
 | 
			
		||||
    sp_alloc_ptr(detail::sp_nullptr_t) BOOST_SP_NOEXCEPT
 | 
			
		||||
        : p_() { }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    T& operator*() const {
 | 
			
		||||
        return *p_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T* operator->() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
        return boost::to_address(p_);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
 | 
			
		||||
    explicit operator bool() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
        return !!p_;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    bool operator!() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
        return !p_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    P ptr() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
        return p_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    BOOST_STATIC_CONSTEXPR std::size_t size() BOOST_SP_NOEXCEPT {
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC) && BOOST_MSVC < 1910
 | 
			
		||||
    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)));
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    P p_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class P>
 | 
			
		||||
class sp_alloc_ptr<T[], P> {
 | 
			
		||||
public:
 | 
			
		||||
    typedef T element_type;
 | 
			
		||||
 | 
			
		||||
    sp_alloc_ptr() BOOST_SP_NOEXCEPT
 | 
			
		||||
        : p_() { }
 | 
			
		||||
 | 
			
		||||
    sp_alloc_ptr(std::size_t n, P p) BOOST_SP_NOEXCEPT
 | 
			
		||||
        : p_(p)
 | 
			
		||||
        , n_(n) { }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_NULLPTR)
 | 
			
		||||
    sp_alloc_ptr(detail::sp_nullptr_t) BOOST_SP_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 {
 | 
			
		||||
        return !!p_;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    bool operator!() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
        return !p_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    P ptr() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
        return p_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::size_t size() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
        return n_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC) && BOOST_MSVC < 1910
 | 
			
		||||
    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)));
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    P p_;
 | 
			
		||||
    std::size_t n_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, std::size_t N, class P>
 | 
			
		||||
class sp_alloc_ptr<T[N], P> {
 | 
			
		||||
public:
 | 
			
		||||
    typedef T element_type;
 | 
			
		||||
 | 
			
		||||
    sp_alloc_ptr() BOOST_SP_NOEXCEPT
 | 
			
		||||
        : p_() { }
 | 
			
		||||
 | 
			
		||||
    sp_alloc_ptr(std::size_t, P p) BOOST_SP_NOEXCEPT
 | 
			
		||||
        : p_(p) { }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_NULLPTR)
 | 
			
		||||
    sp_alloc_ptr(detail::sp_nullptr_t) BOOST_SP_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 {
 | 
			
		||||
        return !!p_;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    bool operator!() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
        return !p_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    P ptr() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
        return p_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    BOOST_STATIC_CONSTEXPR std::size_t size() BOOST_SP_NOEXCEPT {
 | 
			
		||||
        return N;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC) && BOOST_MSVC < 1910
 | 
			
		||||
    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)));
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    P p_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class P>
 | 
			
		||||
inline bool
 | 
			
		||||
operator==(const sp_alloc_ptr<T, P>& lhs, const sp_alloc_ptr<T, P>& rhs)
 | 
			
		||||
{
 | 
			
		||||
    return lhs.ptr() == rhs.ptr();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class P>
 | 
			
		||||
inline bool
 | 
			
		||||
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
 | 
			
		||||
{
 | 
			
		||||
    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
 | 
			
		||||
{
 | 
			
		||||
    return !rhs.ptr();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class P>
 | 
			
		||||
inline bool
 | 
			
		||||
operator!=(const sp_alloc_ptr<T, P>& lhs,
 | 
			
		||||
    detail::sp_nullptr_t) BOOST_SP_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
 | 
			
		||||
{
 | 
			
		||||
    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)
 | 
			
		||||
{
 | 
			
		||||
    boost::alloc_destroy(a, boost::to_address(p));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class A>
 | 
			
		||||
inline void
 | 
			
		||||
sp_alloc_clear(A& a, typename boost::allocator_pointer<A>::type p,
 | 
			
		||||
    std::size_t n, boost::true_type)
 | 
			
		||||
{
 | 
			
		||||
#if defined(BOOST_MSVC) && BOOST_MSVC < 1800
 | 
			
		||||
    if (!p) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
    boost::alloc_destroy_n(a, boost::first_scalar(boost::to_address(p)),
 | 
			
		||||
        n * sp_alloc_size<typename A::value_type>::value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} /* detail */
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
class alloc_deleter
 | 
			
		||||
    : empty_value<typename allocator_rebind<A,
 | 
			
		||||
        typename detail::sp_alloc_value<T>::type>::type> {
 | 
			
		||||
    typedef typename allocator_rebind<A,
 | 
			
		||||
        typename detail::sp_alloc_value<T>::type>::type allocator;
 | 
			
		||||
    typedef empty_value<allocator> base;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    typedef detail::sp_alloc_ptr<T,
 | 
			
		||||
        typename allocator_pointer<allocator>::type> pointer;
 | 
			
		||||
 | 
			
		||||
    explicit alloc_deleter(const allocator& a) BOOST_SP_NOEXCEPT
 | 
			
		||||
        : base(empty_init_t(), a) { }
 | 
			
		||||
 | 
			
		||||
    void operator()(pointer p) {
 | 
			
		||||
        detail::sp_alloc_clear(base::get(), p.ptr(), p.size(), 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 {
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
class sp_alloc_make {
 | 
			
		||||
public:
 | 
			
		||||
    typedef typename boost::allocator_rebind<A,
 | 
			
		||||
        typename sp_alloc_value<T>::type>::type allocator;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    typedef boost::alloc_deleter<T, A> deleter;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    typedef std::unique_ptr<typename sp_alloc_result<T>::type, deleter> type;
 | 
			
		||||
 | 
			
		||||
    sp_alloc_make(const A& a, std::size_t n)
 | 
			
		||||
        : a_(a)
 | 
			
		||||
        , n_(n)
 | 
			
		||||
        , p_(a_.allocate(n)) { }
 | 
			
		||||
 | 
			
		||||
    ~sp_alloc_make() {
 | 
			
		||||
        if (p_) {
 | 
			
		||||
            a_.deallocate(p_, n_);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    typename allocator::value_type* get() const BOOST_SP_NOEXCEPT {
 | 
			
		||||
        return boost::to_address(p_);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    allocator& state() BOOST_SP_NOEXCEPT {
 | 
			
		||||
        return a_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    type release() BOOST_SP_NOEXCEPT {
 | 
			
		||||
        pointer p = p_;
 | 
			
		||||
        p_ = pointer();
 | 
			
		||||
        return type(typename deleter::pointer(n_, p), deleter(a_));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    typedef typename boost::allocator_pointer<allocator>::type pointer;
 | 
			
		||||
 | 
			
		||||
    allocator a_;
 | 
			
		||||
    std::size_t n_;
 | 
			
		||||
    pointer p_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} /* detail */
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<!is_array<T>::value,
 | 
			
		||||
    std::unique_ptr<T, alloc_deleter<T, A> > >::type
 | 
			
		||||
allocate_unique(const A& alloc)
 | 
			
		||||
{
 | 
			
		||||
    detail::sp_alloc_make<T, A> c(alloc, 1);
 | 
			
		||||
    boost::alloc_construct(c.state(), c.get());
 | 
			
		||||
    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,
 | 
			
		||||
    std::unique_ptr<T, alloc_deleter<T, A> > >::type
 | 
			
		||||
allocate_unique(const A& alloc, Args&&... args)
 | 
			
		||||
{
 | 
			
		||||
    detail::sp_alloc_make<T, A> c(alloc, 1);
 | 
			
		||||
    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,
 | 
			
		||||
    std::unique_ptr<T, alloc_deleter<T, A> > >::type
 | 
			
		||||
allocate_unique(const A& alloc, typename type_identity<T>::type&& value)
 | 
			
		||||
{
 | 
			
		||||
    detail::sp_alloc_make<T, A> c(alloc, 1);
 | 
			
		||||
    boost::alloc_construct(c.state(), c.get(), std::move(value));
 | 
			
		||||
    return c.release();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<!is_array<T>::value,
 | 
			
		||||
    std::unique_ptr<T, alloc_deleter<T, noinit_adaptor<A> > > >::type
 | 
			
		||||
allocate_unique_noinit(const A& alloc)
 | 
			
		||||
{
 | 
			
		||||
    return boost::allocate_unique<T, noinit_adaptor<A> >(alloc);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<is_unbounded_array<T>::value,
 | 
			
		||||
    std::unique_ptr<T, alloc_deleter<T, A> > >::type
 | 
			
		||||
allocate_unique(const A& alloc, std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
    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);
 | 
			
		||||
    return c.release();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<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);
 | 
			
		||||
    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,
 | 
			
		||||
    std::unique_ptr<T, alloc_deleter<T, noinit_adaptor<A> > > >::type
 | 
			
		||||
allocate_unique_noinit(const A& alloc, std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
    return boost::allocate_unique<T, noinit_adaptor<A> >(alloc, size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<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)
 | 
			
		||||
{
 | 
			
		||||
    return boost::allocate_unique<T, noinit_adaptor<A> >(alloc);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<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)
 | 
			
		||||
{
 | 
			
		||||
    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);
 | 
			
		||||
    return c.release();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class A>
 | 
			
		||||
inline typename enable_if_<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)
 | 
			
		||||
{
 | 
			
		||||
    detail::sp_alloc_make<T, A> c(alloc, 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);
 | 
			
		||||
    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) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get().ptr();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} /* boost */
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -13,6 +13,7 @@
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/ for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/requires_cxx11.hpp>
 | 
			
		||||
#include <boost/smart_ptr/shared_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/spinlock.hpp>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
@@ -63,6 +64,11 @@ public:
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    atomic_shared_ptr( shared_ptr<T> p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
        : p_( std::move( p ) ), l_ BOOST_DETAIL_SPINLOCK_INIT
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    atomic_shared_ptr() BOOST_SP_NOEXCEPT
 | 
			
		||||
@@ -71,8 +77,6 @@ public:
 | 
			
		||||
        std::memcpy( &l_, &init, sizeof( init ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    atomic_shared_ptr( shared_ptr<T> p ) BOOST_SP_NOEXCEPT
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
        : p_( std::move( p ) )
 | 
			
		||||
@@ -84,6 +88,8 @@ public:
 | 
			
		||||
        std::memcpy( &l_, &init, sizeof( init ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    atomic_shared_ptr& operator=( shared_ptr<T> r ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::spinlock::scoped_lock lock( l_ );
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <exception>
 | 
			
		||||
 | 
			
		||||
#ifdef __BORLANDC__
 | 
			
		||||
#ifdef BOOST_BORLANDC
 | 
			
		||||
# pragma warn -8026     // Functions with excep. spec. are not expanded inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -33,7 +33,7 @@ namespace boost
 | 
			
		||||
// is compiled with -ps, the compiler issues an error.
 | 
			
		||||
// Hence, the temporary #pragma option -pc below.
 | 
			
		||||
 | 
			
		||||
#if defined(__BORLANDC__) && __BORLANDC__ <= 0x564
 | 
			
		||||
#if defined(BOOST_BORLANDC) && BOOST_BORLANDC <= 0x564
 | 
			
		||||
# pragma option push -pc
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -47,7 +47,7 @@ class bad_weak_ptr: public std::exception
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    virtual char const * what() const BOOST_NOEXCEPT_OR_NOTHROW
 | 
			
		||||
    char const * what() const BOOST_NOEXCEPT_OR_NOTHROW BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        return "tr1::bad_weak_ptr";
 | 
			
		||||
    }
 | 
			
		||||
@@ -57,13 +57,13 @@ public:
 | 
			
		||||
# pragma clang diagnostic pop
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(__BORLANDC__) && __BORLANDC__ <= 0x564
 | 
			
		||||
#if defined(BOOST_BORLANDC) && BOOST_BORLANDC <= 0x564
 | 
			
		||||
# pragma option pop
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#ifdef __BORLANDC__
 | 
			
		||||
#ifdef BOOST_BORLANDC
 | 
			
		||||
# pragma warn .8026     // Functions with excep. spec. are not expanded inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -43,8 +43,9 @@
 | 
			
		||||
//    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/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 +74,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>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,13 @@
 | 
			
		||||
# include <bits/atomicity.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using libstdc++ atomic_count")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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,17 @@
 | 
			
		||||
//  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>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using g++/x86 atomic_count")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,13 @@
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using single-threaded, non-atomic atomic_count")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,13 @@
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using pthread_mutex atomic_count")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  The generic pthread_mutex-based implementation sometimes leads to
 | 
			
		||||
//    inefficiencies. Example: a class with two atomic_count members
 | 
			
		||||
 
 | 
			
		||||
@@ -1,59 +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>
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
@@ -13,6 +13,13 @@
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/spinlock_pool.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using spinlock-based atomic_count")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,13 @@
 | 
			
		||||
#include <atomic>
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using std::atomic atomic_count")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -26,7 +33,7 @@ class atomic_count
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count( long v ): value_( v )
 | 
			
		||||
    explicit atomic_count( long v ): value_( static_cast< std::int_least32_t >( v ) )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -15,10 +15,19 @@
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/cstdint.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined( __ia64__ ) && defined( __INTEL_COMPILER )
 | 
			
		||||
# include <ia64intrin.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using __sync atomic_count")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -29,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++()
 | 
			
		||||
    {
 | 
			
		||||
@@ -51,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
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,13 @@
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_interlocked.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using Win32 atomic_count")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -28,15 +28,12 @@
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_HAS_THREADS)
 | 
			
		||||
#  include <boost/smart_ptr/detail/lwm_nop.hpp>
 | 
			
		||||
#elif defined(BOOST_HAS_PTHREADS)
 | 
			
		||||
#  include <boost/smart_ptr/detail/lwm_pthreads.hpp>
 | 
			
		||||
#elif defined(BOOST_HAS_WINTHREADS) || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_HDR_MUTEX )
 | 
			
		||||
#  include <boost/smart_ptr/detail/lwm_std_mutex.hpp>
 | 
			
		||||
#elif defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
 | 
			
		||||
#  include <boost/smart_ptr/detail/lwm_win32_cs.hpp>
 | 
			
		||||
#else
 | 
			
		||||
// Use #define BOOST_DISABLE_THREADS to avoid the error
 | 
			
		||||
#  error Unrecognized threading platform
 | 
			
		||||
#  include <boost/smart_ptr/detail/lwm_pthreads.hpp>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										188
									
								
								include/boost/smart_ptr/detail/lightweight_thread.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										188
									
								
								include/boost/smart_ptr/detail/lightweight_thread.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,188 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  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 );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <cerrno>
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_HAS_PTHREADS )
 | 
			
		||||
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
typedef ::pthread_t lw_thread_t;
 | 
			
		||||
 | 
			
		||||
inline int lw_thread_create_( lw_thread_t* thread, const pthread_attr_t* attr, void* (*start_routine)( void* ), void* arg )
 | 
			
		||||
{
 | 
			
		||||
    return ::pthread_create( thread, attr, start_routine, arg );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void lw_thread_join( lw_thread_t th )
 | 
			
		||||
{
 | 
			
		||||
    ::pthread_join( th, 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#else // defined( BOOST_HAS_PTHREADS )
 | 
			
		||||
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
#include <process.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
typedef HANDLE lw_thread_t;
 | 
			
		||||
 | 
			
		||||
inline int lw_thread_create_( lw_thread_t * thread, void const *, unsigned (__stdcall * start_routine) (void*), void* arg )
 | 
			
		||||
{
 | 
			
		||||
    HANDLE h = (HANDLE)_beginthreadex( 0, 0, start_routine, arg, 0, 0 );
 | 
			
		||||
 | 
			
		||||
    if( h != 0 )
 | 
			
		||||
    {
 | 
			
		||||
        *thread = h;
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        return EAGAIN;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void lw_thread_join( lw_thread_t thread )
 | 
			
		||||
{
 | 
			
		||||
    ::WaitForSingleObject( thread, INFINITE );
 | 
			
		||||
    ::CloseHandle( thread );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // defined( BOOST_HAS_PTHREADS )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class lw_abstract_thread
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    virtual ~lw_abstract_thread() {}
 | 
			
		||||
    virtual void run() = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_HAS_PTHREADS )
 | 
			
		||||
 | 
			
		||||
extern "C" 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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class F> class lw_thread_impl: public lw_abstract_thread
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit lw_thread_impl( F f ): f_( f )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void run()
 | 
			
		||||
    {
 | 
			
		||||
        f_();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    F f_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
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 )
 | 
			
		||||
    {
 | 
			
		||||
        p.release();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return r;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED
 | 
			
		||||
@@ -113,12 +113,12 @@ public:
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    virtual void local_cb_destroy() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void local_cb_destroy() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual boost::detail::shared_count local_cb_get_shared_count() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    boost::detail::shared_count local_cb_get_shared_count() const BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        return pn_;
 | 
			
		||||
    }
 | 
			
		||||
@@ -130,12 +130,12 @@ public:
 | 
			
		||||
 | 
			
		||||
    shared_count pn_;
 | 
			
		||||
 | 
			
		||||
    virtual void local_cb_destroy() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void local_cb_destroy() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        shared_count().swap( pn_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual boost::detail::shared_count local_cb_get_shared_count() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    boost::detail::shared_count local_cb_get_shared_count() const BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        return pn_;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,37 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_LWM_NOP_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_LWM_NOP_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/lwm_nop.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 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)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class lightweight_mutex
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    typedef lightweight_mutex scoped_lock;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_LWM_NOP_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										62
									
								
								include/boost/smart_ptr/detail/lwm_std_mutex.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								include/boost/smart_ptr/detail/lwm_std_mutex.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_LWM_STD_MUTEX_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_LWM_STD_MUTEX_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// Copyright 2020 Peter Dimov
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <mutex>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class lightweight_mutex
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    std::mutex m_;
 | 
			
		||||
 | 
			
		||||
    lightweight_mutex(lightweight_mutex const &);
 | 
			
		||||
    lightweight_mutex & operator=(lightweight_mutex const &);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    lightweight_mutex()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class scoped_lock;
 | 
			
		||||
    friend class scoped_lock;
 | 
			
		||||
 | 
			
		||||
    class scoped_lock
 | 
			
		||||
    {
 | 
			
		||||
    private:
 | 
			
		||||
 | 
			
		||||
        std::mutex & m_;
 | 
			
		||||
 | 
			
		||||
        scoped_lock(scoped_lock const &);
 | 
			
		||||
        scoped_lock & operator=(scoped_lock const &);
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        scoped_lock( lightweight_mutex & m ): m_( m.m_ )
 | 
			
		||||
        {
 | 
			
		||||
            m_.lock();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ~scoped_lock()
 | 
			
		||||
        {
 | 
			
		||||
            m_.unlock();
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_LWM_STD_MUTEX_HPP_INCLUDED
 | 
			
		||||
@@ -11,15 +11,12 @@
 | 
			
		||||
//  boost/detail/lwm_win32_cs.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002, 2003 Peter Dimov
 | 
			
		||||
//  Copyright (c) Microsoft Corporation 2014
 | 
			
		||||
//
 | 
			
		||||
// 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/predef.h>
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_USE_WINDOWS_H
 | 
			
		||||
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
@@ -52,11 +49,7 @@ struct critical_section
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if BOOST_PLAT_WINDOWS_RUNTIME
 | 
			
		||||
extern "C" __declspec(dllimport) void __stdcall InitializeCriticalSectionEx(::_RTL_CRITICAL_SECTION *, unsigned long, unsigned long);
 | 
			
		||||
#else
 | 
			
		||||
extern "C" __declspec(dllimport) void __stdcall InitializeCriticalSection(::_RTL_CRITICAL_SECTION *);
 | 
			
		||||
#endif
 | 
			
		||||
extern "C" __declspec(dllimport) void __stdcall EnterCriticalSection(::_RTL_CRITICAL_SECTION *);
 | 
			
		||||
extern "C" __declspec(dllimport) void __stdcall LeaveCriticalSection(::_RTL_CRITICAL_SECTION *);
 | 
			
		||||
extern "C" __declspec(dllimport) void __stdcall DeleteCriticalSection(::_RTL_CRITICAL_SECTION *);
 | 
			
		||||
@@ -67,11 +60,7 @@ typedef ::_RTL_CRITICAL_SECTION rtl_critical_section;
 | 
			
		||||
 | 
			
		||||
typedef ::CRITICAL_SECTION critical_section;
 | 
			
		||||
 | 
			
		||||
#if BOOST_PLAT_WINDOWS_RUNTIME
 | 
			
		||||
using ::InitializeCriticalSectionEx;
 | 
			
		||||
#else
 | 
			
		||||
using ::InitializeCriticalSection;
 | 
			
		||||
#endif
 | 
			
		||||
using ::EnterCriticalSection;
 | 
			
		||||
using ::LeaveCriticalSection;
 | 
			
		||||
using ::DeleteCriticalSection;
 | 
			
		||||
@@ -93,11 +82,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    lightweight_mutex()
 | 
			
		||||
    {
 | 
			
		||||
#if BOOST_PLAT_WINDOWS_RUNTIME
 | 
			
		||||
        boost::detail::InitializeCriticalSectionEx(reinterpret_cast< rtl_critical_section* >(&cs_), 4000, 0);
 | 
			
		||||
#else
 | 
			
		||||
        boost::detail::InitializeCriticalSection(reinterpret_cast< rtl_critical_section* >(&cs_));
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~lightweight_mutex()
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								include/boost/smart_ptr/detail/requires_cxx11.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								include/boost/smart_ptr/detail/requires_cxx11.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_REQUIRES_CXX11_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_REQUIRES_CXX11_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/config.hpp>
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || \
 | 
			
		||||
    defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || \
 | 
			
		||||
    defined(BOOST_NO_CXX11_DECLTYPE) || \
 | 
			
		||||
    defined(BOOST_NO_CXX11_CONSTEXPR) || \
 | 
			
		||||
    defined(BOOST_NO_CXX11_NOEXCEPT) || \
 | 
			
		||||
    defined(BOOST_NO_CXX11_NULLPTR) || \
 | 
			
		||||
    defined(BOOST_NO_CXX11_SMART_PTR)
 | 
			
		||||
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("C++03 support is deprecated in Boost.SmartPtr 1.82 and will be removed in Boost.SmartPtr 1.84.")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_REQUIRES_CXX11_HPP_INCLUDED
 | 
			
		||||
@@ -18,32 +18,29 @@
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#ifdef __BORLANDC__
 | 
			
		||||
#if defined(__BORLANDC__) && !defined(__clang__)
 | 
			
		||||
# pragma warn -8027     // Functions containing try are not expanded inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/checked_delete.hpp>
 | 
			
		||||
#include <boost/throw_exception.hpp>
 | 
			
		||||
#include <boost/smart_ptr/bad_weak_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_counted_base.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_counted_impl.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_disable_deprecated.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <boost/core/checked_delete.hpp>
 | 
			
		||||
#include <boost/throw_exception.hpp>
 | 
			
		||||
#include <boost/core/addressof.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/config/workaround.hpp>
 | 
			
		||||
// In order to avoid circular dependencies with Boost.TR1
 | 
			
		||||
// we make sure that our include of <memory> doesn't try to
 | 
			
		||||
// pull in the TR1 headers: that's why we use this header 
 | 
			
		||||
// rather than including <memory> directly:
 | 
			
		||||
#include <boost/config/no_tr1/memory.hpp>  // std::auto_ptr
 | 
			
		||||
#include <functional>       // std::less
 | 
			
		||||
#include <boost/cstdint.hpp>
 | 
			
		||||
#include <memory>            // std::auto_ptr
 | 
			
		||||
#include <functional>        // std::less
 | 
			
		||||
#include <cstddef>           // std::size_t
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_NO_EXCEPTIONS
 | 
			
		||||
# include <new>              // std::bad_alloc
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <boost/core/addressof.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_SP_DISABLE_DEPRECATED )
 | 
			
		||||
#pragma GCC diagnostic push
 | 
			
		||||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
 | 
			
		||||
@@ -103,6 +100,14 @@ 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
 | 
			
		||||
{
 | 
			
		||||
    boost::uintptr_t v = reinterpret_cast<boost::uintptr_t>( p );
 | 
			
		||||
 | 
			
		||||
    // match boost::hash<T*>
 | 
			
		||||
    return static_cast<std::size_t>( v + ( v >> 3 ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class weak_count;
 | 
			
		||||
 | 
			
		||||
class shared_count
 | 
			
		||||
@@ -382,7 +387,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
 | 
			
		||||
@@ -489,22 +494,26 @@ public:
 | 
			
		||||
        return pi_ == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    friend inline bool operator==(shared_count const & a, shared_count const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool operator==( shared_count const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return a.pi_ == b.pi_;
 | 
			
		||||
        return pi_ == r.pi_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    friend inline bool operator<(shared_count const & a, shared_count const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool operator==( weak_count const & r ) const BOOST_SP_NOEXCEPT;
 | 
			
		||||
 | 
			
		||||
    bool operator<( shared_count const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return std::less<sp_counted_base *>()( a.pi_, b.pi_ );
 | 
			
		||||
        return std::less<sp_counted_base *>()( pi_, r.pi_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * get_deleter( sp_typeinfo const & ti ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool operator<( weak_count const & r ) const BOOST_SP_NOEXCEPT;
 | 
			
		||||
 | 
			
		||||
    void * get_deleter( sp_typeinfo_ const & ti ) const BOOST_SP_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 BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return pi_? pi_->get_local_deleter( ti ): 0;
 | 
			
		||||
    }
 | 
			
		||||
@@ -513,6 +522,11 @@ public:
 | 
			
		||||
    {
 | 
			
		||||
        return pi_? pi_->get_untyped_deleter(): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::size_t hash_value() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return sp_hash_pointer( pi_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -620,14 +634,29 @@ public:
 | 
			
		||||
        return pi_ == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    friend inline bool operator==(weak_count const & a, weak_count const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool operator==( weak_count const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return a.pi_ == b.pi_;
 | 
			
		||||
        return pi_ == r.pi_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    friend inline bool operator<(weak_count const & a, weak_count const & b) BOOST_SP_NOEXCEPT
 | 
			
		||||
    bool operator==( shared_count const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return std::less<sp_counted_base *>()(a.pi_, b.pi_);
 | 
			
		||||
        return pi_ == r.pi_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool operator<( weak_count const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return std::less<sp_counted_base *>()( pi_, r.pi_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool operator<( shared_count const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return std::less<sp_counted_base *>()( pi_, r.pi_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::size_t hash_value() const BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return sp_hash_pointer( pi_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -653,6 +682,16 @@ 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
 | 
			
		||||
{
 | 
			
		||||
    return pi_ == r.pi_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline bool shared_count::operator<( weak_count const & r ) const BOOST_SP_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return std::less<sp_counted_base *>()( pi_, r.pi_ );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
@@ -661,7 +700,7 @@ inline shared_count::shared_count( weak_count const & r, sp_nothrow_tag ) BOOST_
 | 
			
		||||
#pragma GCC diagnostic pop
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __BORLANDC__
 | 
			
		||||
#if defined(__BORLANDC__) && !defined(__clang__)
 | 
			
		||||
# pragma warn .8027     // Functions containing try are not expanded inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@
 | 
			
		||||
# define BOOST_SP_NO_SP_CONVERTIBLE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( __BORLANDC__ ) && ( __BORLANDC__ < 0x630 )
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( BOOST_BORLANDC ) && ( BOOST_BORLANDC < 0x630 )
 | 
			
		||||
# define BOOST_SP_NO_SP_CONVERTIBLE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,14 +17,9 @@
 | 
			
		||||
// 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/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 +36,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 +72,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 +89,4 @@
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#undef BOOST_SP_HAS_CLANG_C11_ATOMICS
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED
 | 
			
		||||
 
 | 
			
		||||
@@ -15,10 +15,20 @@
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#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>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using HP aCC++/HP-UX/IA64 sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -104,8 +114,8 @@ public:
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    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()
 | 
			
		||||
 
 | 
			
		||||
@@ -20,11 +20,18 @@
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <builtins.h>
 | 
			
		||||
#include <sys/atomic_op.h>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using AIX sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -96,8 +103,8 @@ public:
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    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()
 | 
			
		||||
 
 | 
			
		||||
@@ -1,152 +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/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/cstdint.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
typedef _Atomic( boost::int_least32_t ) atomic_int_least32_t;
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( atomic_int_least32_t * pw ) 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 push
 | 
			
		||||
# 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
 | 
			
		||||
@@ -24,9 +24,17 @@
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#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)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using CodeWarrior/PowerPC sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -54,7 +62,11 @@ inline long atomic_decrement( register long * pw )
 | 
			
		||||
 | 
			
		||||
    asm
 | 
			
		||||
    {
 | 
			
		||||
#if defined(__PPCZen__) || defined(__PPCe500__) || defined(__PPCe500v2__)
 | 
			
		||||
    msync
 | 
			
		||||
#else
 | 
			
		||||
    sync
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
loop:
 | 
			
		||||
 | 
			
		||||
@@ -124,8 +136,8 @@ public:
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    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()
 | 
			
		||||
 
 | 
			
		||||
@@ -1,161 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_X86_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_X86_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  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
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline int atomic_exchange_and_add( int * pw, int dv )
 | 
			
		||||
{
 | 
			
		||||
    // int r = *pw;
 | 
			
		||||
    // *pw += dv;
 | 
			
		||||
    // return r;
 | 
			
		||||
 | 
			
		||||
    asm
 | 
			
		||||
    {
 | 
			
		||||
        mov esi, [pw]
 | 
			
		||||
        mov eax, dv
 | 
			
		||||
        lock xadd dword ptr [esi], eax
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int * 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:
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class BOOST_SYMBOL_VISIBLE sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
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)
 | 
			
		||||
 | 
			
		||||
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_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_exchange_and_add( &use_count_, -1 ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_exchange_and_add( &weak_count_, -1 ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<int const volatile &>( use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_X86_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										148
									
								
								include/boost/smart_ptr/detail/sp_counted_base_gcc_atomic.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								include/boost/smart_ptr/detail/sp_counted_base_gcc_atomic.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,148 @@
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// detail/sp_counted_base_gcc_atomic.hpp - g++ 4.7+ __atomic intrinsics
 | 
			
		||||
//
 | 
			
		||||
// 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 __atomic sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( boost::uint_least32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    __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;
 | 
			
		||||
 | 
			
		||||
    boost::uint_least32_t r = __atomic_load_n( pw, __ATOMIC_RELAXED );
 | 
			
		||||
 | 
			
		||||
    for( ;; )
 | 
			
		||||
    {
 | 
			
		||||
        if( r == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if( __atomic_compare_exchange_n( pw, &r, r + 1, true, __ATOMIC_RELAXED, __ATOMIC_RELAXED ) )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline boost::uint_least32_t atomic_load( boost::uint_least32_t const * pw )
 | 
			
		||||
{
 | 
			
		||||
    return __atomic_load_n( pw, __ATOMIC_ACQUIRE );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class BOOST_SYMBOL_VISIBLE sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    boost::uint_least32_t use_count_;        // #shared
 | 
			
		||||
    boost::uint_least32_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_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &use_count_ ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_load( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED
 | 
			
		||||
@@ -16,9 +16,19 @@
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#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)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using g++/IA64 sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -111,8 +121,8 @@ public:
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    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()
 | 
			
		||||
 
 | 
			
		||||
@@ -20,9 +20,19 @@
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#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)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using g++/MIPS sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -141,8 +151,8 @@ public:
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    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()
 | 
			
		||||
 
 | 
			
		||||
@@ -24,9 +24,19 @@
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#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)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using g++/PowerPC sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -135,8 +145,8 @@ public:
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    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()
 | 
			
		||||
 
 | 
			
		||||
@@ -19,10 +19,20 @@
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Michael van der Westhuizen
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using g++/Sparc sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -120,8 +130,8 @@ public:
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    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()
 | 
			
		||||
 
 | 
			
		||||
@@ -24,9 +24,19 @@
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#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)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using g++/x86 sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -127,8 +137,8 @@ public:
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    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()
 | 
			
		||||
 
 | 
			
		||||
@@ -18,11 +18,18 @@
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#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 single-threaded, non-atomic sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -61,8 +68,8 @@ public:
 | 
			
		||||
        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_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
 | 
			
		||||
 
 | 
			
		||||
@@ -18,12 +18,19 @@
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/cstdint.hpp>
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using pthread_mutex sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -72,8 +79,8 @@ public:
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    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()
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_counted_base_gcc_sparc.hpp - g++ on Sparc V8+
 | 
			
		||||
//  detail/sp_counted_base_gcc_snc_ps3.hpp - PS3 Cell
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2006 Piotr Wyderski
 | 
			
		||||
//  Copyright (c) 2006 Tomas Puverle
 | 
			
		||||
@@ -19,10 +19,20 @@
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Michael van der Westhuizen
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using PS3 sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
BOOST_SP_OBSOLETE()
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -115,8 +125,8 @@ public:
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    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()
 | 
			
		||||
 
 | 
			
		||||
@@ -1,116 +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/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <atomic.h>
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
@@ -18,10 +18,17 @@
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/spinlock_pool.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using spinlock-based sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -84,8 +91,8 @@ public:
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    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()
 | 
			
		||||
 
 | 
			
		||||
@@ -15,12 +15,19 @@
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <atomic>
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using std::atomic sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -91,8 +98,8 @@ public:
 | 
			
		||||
        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_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
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
 | 
			
		||||
@@ -23,6 +23,13 @@
 | 
			
		||||
# include <ia64intrin.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using __sync sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -109,8 +116,8 @@ public:
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    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()
 | 
			
		||||
 
 | 
			
		||||
@@ -21,9 +21,19 @@
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#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)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
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);
 | 
			
		||||
@@ -104,8 +114,8 @@ public:
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    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()
 | 
			
		||||
 
 | 
			
		||||
@@ -25,10 +25,17 @@
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_interlocked.hpp>
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_typeinfo_.hpp>
 | 
			
		||||
#include <boost/config/workaround.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using Win32 sp_counted_base")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -67,8 +74,8 @@ public:
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    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()
 | 
			
		||||
 
 | 
			
		||||
@@ -18,25 +18,21 @@
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_STD_ALLOCATOR) && defined(BOOST_SP_USE_QUICK_ALLOCATOR)
 | 
			
		||||
# error BOOST_SP_USE_STD_ALLOCATOR and BOOST_SP_USE_QUICK_ALLOCATOR are incompatible.
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <boost/checked_delete.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_counted_base.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <boost/core/checked_delete.hpp>
 | 
			
		||||
#include <boost/core/addressof.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_QUICK_ALLOCATOR)
 | 
			
		||||
#include <boost/smart_ptr/detail/quick_allocator.hpp>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_STD_ALLOCATOR)
 | 
			
		||||
#include <memory>           // std::allocator
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <memory>           // std::allocator, std::allocator_traits
 | 
			
		||||
#include <cstddef>          // std::size_t
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
@@ -85,7 +81,7 @@ public:
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void dispose() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        boost::sp_scalar_destructor_hook( px_, sizeof(X), this );
 | 
			
		||||
@@ -93,17 +89,17 @@ public:
 | 
			
		||||
        boost::checked_delete( px_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * get_deleter( sp_typeinfo_ const & ) BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo const & ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * get_local_deleter( sp_typeinfo_ const & ) BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_untyped_deleter() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * get_untyped_deleter() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
@@ -149,7 +145,7 @@ template<class P, class D> class BOOST_SYMBOL_VISIBLE sp_counted_impl_pd: public
 | 
			
		||||
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 & );
 | 
			
		||||
@@ -160,30 +156,40 @@ public:
 | 
			
		||||
 | 
			
		||||
    // pre: d(p) must not throw
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pd( P p, D & d ): ptr( p ), del( static_cast< D&& >( d ) )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pd( P p, D & d ): ptr( p ), del( d )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pd( P p ): ptr( p ), del()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void dispose() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        del( ptr );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * get_deleter( sp_typeinfo_ const & ti ) BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        return ti == BOOST_SP_TYPEID(D)? &reinterpret_cast<char&>( del ): 0;
 | 
			
		||||
        return ti == BOOST_SP_TYPEID_(D)? &reinterpret_cast<char&>( del ): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo const & ti ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * get_local_deleter( sp_typeinfo_ const & ti ) BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        return ti == BOOST_SP_TYPEID(D)? boost::detail::get_local_deleter( boost::addressof( del ) ): 0;
 | 
			
		||||
        return ti == BOOST_SP_TYPEID_(D)? boost::detail::get_local_deleter( boost::addressof( del ) ): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_untyped_deleter() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * get_untyped_deleter() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        return &reinterpret_cast<char&>( del );
 | 
			
		||||
    }
 | 
			
		||||
@@ -222,7 +228,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 & );
 | 
			
		||||
@@ -234,20 +240,30 @@ public:
 | 
			
		||||
 | 
			
		||||
    // pre: d( p ) must not throw
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pda( P p, D & d, A a ): p_( p ), d_( static_cast< D&& >( d ) ), a_( a )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pda( P p, D & d, A a ): p_( p ), d_( d ), a_( a )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pda( P p, A a ): p_( p ), d_( a ), a_( a )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void dispose() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        d_( p_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void destroy() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
 | 
			
		||||
 | 
			
		||||
@@ -266,17 +282,17 @@ public:
 | 
			
		||||
        a2.deallocate( this, 1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * get_deleter( sp_typeinfo_ const & ti ) BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        return ti == BOOST_SP_TYPEID( D )? &reinterpret_cast<char&>( d_ ): 0;
 | 
			
		||||
        return ti == BOOST_SP_TYPEID_( D )? &reinterpret_cast<char&>( d_ ): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_local_deleter( sp_typeinfo const & ti ) BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * get_local_deleter( sp_typeinfo_ const & ti ) BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        return ti == BOOST_SP_TYPEID(D)? boost::detail::get_local_deleter( boost::addressof( d_ ) ): 0;
 | 
			
		||||
        return ti == BOOST_SP_TYPEID_( D )? boost::detail::get_local_deleter( boost::addressof( d_ ) ): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_untyped_deleter() BOOST_SP_NOEXCEPT
 | 
			
		||||
    void * get_untyped_deleter() BOOST_SP_NOEXCEPT BOOST_OVERRIDE
 | 
			
		||||
    {
 | 
			
		||||
        return &reinterpret_cast<char&>( d_ );
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								include/boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								include/boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
#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.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if defined( __ATOMIC_RELAXED ) && defined( __ATOMIC_ACQUIRE ) && defined( __ATOMIC_RELEASE ) && defined( __ATOMIC_ACQ_REL )
 | 
			
		||||
 | 
			
		||||
# 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
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
							
								
								
									
										51
									
								
								include/boost/smart_ptr/detail/sp_thread_pause.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								include/boost/smart_ptr/detail/sp_thread_pause.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_THREAD_PAUSE_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_THREAD_PAUSE_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// boost/smart_ptr/detail/sp_thread_pause.hpp
 | 
			
		||||
//
 | 
			
		||||
// inline void bost::detail::sp_thread_pause();
 | 
			
		||||
//
 | 
			
		||||
//   Emits a "pause" instruction.
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2008, 2020 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 >= 1310 && ( defined(_M_IX86) || defined(_M_X64) ) && !defined(__c2__)
 | 
			
		||||
 | 
			
		||||
extern "C" void _mm_pause();
 | 
			
		||||
 | 
			
		||||
#define BOOST_SP_PAUSE _mm_pause();
 | 
			
		||||
 | 
			
		||||
#elif defined(__GNUC__) && ( defined(__i386__) || defined(__x86_64__) )
 | 
			
		||||
 | 
			
		||||
#define BOOST_SP_PAUSE __asm__ __volatile__( "rep; nop" : : : "memory" );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#define BOOST_SP_PAUSE
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void sp_thread_pause()
 | 
			
		||||
{
 | 
			
		||||
    BOOST_SP_PAUSE
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#undef BOOST_SP_PAUSE
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_THREAD_PAUSE_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										104
									
								
								include/boost/smart_ptr/detail/sp_thread_sleep.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								include/boost/smart_ptr/detail/sp_thread_sleep.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,104 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_THREAD_SLEEP_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_THREAD_SLEEP_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// boost/smart_ptr/detail/sp_thread_sleep.hpp
 | 
			
		||||
//
 | 
			
		||||
// inline void bost::detail::sp_thread_sleep();
 | 
			
		||||
//
 | 
			
		||||
//   Cease execution for a while to yield to other threads,
 | 
			
		||||
//   as if by calling nanosleep() with an appropriate interval.
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2008, 2020 Peter Dimov
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined( __CYGWIN__ )
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
  BOOST_PRAGMA_MESSAGE("Using Sleep(1) in sp_thread_sleep")
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_win32_sleep.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void sp_thread_sleep()
 | 
			
		||||
{
 | 
			
		||||
    Sleep( 1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#elif defined(BOOST_HAS_NANOSLEEP)
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
  BOOST_PRAGMA_MESSAGE("Using nanosleep() in sp_thread_sleep")
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <time.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void sp_thread_sleep()
 | 
			
		||||
{
 | 
			
		||||
    // 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 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
  BOOST_PRAGMA_MESSAGE("Using sp_thread_yield() in sp_thread_sleep")
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_thread_yield.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void sp_thread_sleep()
 | 
			
		||||
{
 | 
			
		||||
    sp_thread_yield();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_THREAD_SLEEP_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										100
									
								
								include/boost/smart_ptr/detail/sp_thread_yield.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								include/boost/smart_ptr/detail/sp_thread_yield.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,100 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_THREAD_YIELD_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_THREAD_YIELD_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// boost/smart_ptr/detail/sp_thread_yield.hpp
 | 
			
		||||
//
 | 
			
		||||
// inline void bost::detail::sp_thread_yield();
 | 
			
		||||
//
 | 
			
		||||
//   Gives up the remainder of the time slice,
 | 
			
		||||
//   as if by calling sched_yield().
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2008, 2020 Peter Dimov
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined( __CYGWIN__ )
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
  BOOST_PRAGMA_MESSAGE("Using Sleep(0) in sp_thread_yield")
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_win32_sleep.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void sp_thread_yield()
 | 
			
		||||
{
 | 
			
		||||
    Sleep( 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#elif defined(BOOST_HAS_SCHED_YIELD)
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
  BOOST_PRAGMA_MESSAGE("Using sched_yield() in sp_thread_yield")
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void sp_thread_yield()
 | 
			
		||||
{
 | 
			
		||||
    sched_yield();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
  BOOST_PRAGMA_MESSAGE("Using sp_thread_pause() in sp_thread_yield")
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_thread_pause.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void sp_thread_yield()
 | 
			
		||||
{
 | 
			
		||||
    sp_thread_pause();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_THREAD_YIELD_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										58
									
								
								include/boost/smart_ptr/detail/sp_typeinfo_.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								include/boost/smart_ptr/detail/sp_typeinfo_.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_TYPEINFO_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_TYPEINFO_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  smart_ptr/detail/sp_typeinfo_.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2007, 2019 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_NO_TYPEID ) || defined( BOOST_NO_STD_TYPEINFO )
 | 
			
		||||
 | 
			
		||||
#include <boost/core/typeinfo.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
typedef boost::core::typeinfo sp_typeinfo_;
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#define BOOST_SP_TYPEID_(T) BOOST_CORE_TYPEID(T)
 | 
			
		||||
 | 
			
		||||
#else // defined( BOOST_NO_TYPEID ) || defined( BOOST_NO_STD_TYPEINFO )
 | 
			
		||||
 | 
			
		||||
#include <typeinfo>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
typedef std::type_info sp_typeinfo_;
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#define BOOST_SP_TYPEID_(T) typeid(T)
 | 
			
		||||
 | 
			
		||||
#endif // defined( BOOST_NO_TYPEID ) || defined( BOOST_NO_STD_TYPEINFO )
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_TYPEINFO_HPP_INCLUDED
 | 
			
		||||
							
								
								
									
										49
									
								
								include/boost/smart_ptr/detail/sp_win32_sleep.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								include/boost/smart_ptr/detail/sp_win32_sleep.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_WIN32_SLEEP_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_WIN32_SLEEP_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// boost/smart_ptr/detail/sp_win32_sleep.hpp
 | 
			
		||||
//
 | 
			
		||||
// Declares the Win32 Sleep() function.
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2008, 2020 Peter Dimov
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0
 | 
			
		||||
// https://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#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 )
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_WIN32_SLEEP_HPP_INCLUDED
 | 
			
		||||
@@ -28,28 +28,26 @@
 | 
			
		||||
//  #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/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__)
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,13 @@
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/yield_k.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using g++/ARM spinlock")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7S__)
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_ARM_BARRIER "dmb"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
@@ -17,6 +17,13 @@
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using single-threaded spinlock emulation")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,13 @@
 | 
			
		||||
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using pthread_mutex spinlock emulation")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,13 @@
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <atomic>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using std::atomic spinlock")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,13 @@
 | 
			
		||||
# include <ia64intrin.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using __sync spinlock")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@@ -31,7 +38,7 @@ class spinlock
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    int v_;
 | 
			
		||||
    unsigned char v_;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,13 @@
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_interlocked.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/yield_k.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_REPORT_IMPLEMENTATION)
 | 
			
		||||
 | 
			
		||||
#include <boost/config/pragma_message.hpp>
 | 
			
		||||
BOOST_PRAGMA_MESSAGE("Using Win32 spinlock")
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// BOOST_COMPILER_FENCE
 | 
			
		||||
 | 
			
		||||
#if defined(__INTEL_COMPILER)
 | 
			
		||||
 
 | 
			
		||||
@@ -7,120 +7,21 @@
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// boost/smart_ptr/detail/yield_k.hpp
 | 
			
		||||
//
 | 
			
		||||
//  yield_k.hpp
 | 
			
		||||
// Copyright 2008, 2020 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 Peter Dimov
 | 
			
		||||
//  Copyright (c) Microsoft Corporation 2014
 | 
			
		||||
// 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/smart_ptr/detail/sp_thread_pause.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_thread_sleep.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/predef/platform/windows_runtime.h>
 | 
			
		||||
 | 
			
		||||
#if BOOST_PLAT_WINDOWS_RUNTIME
 | 
			
		||||
#include <thread>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// 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 ) && !BOOST_PLAT_WINDOWS_RUNTIME
 | 
			
		||||
 | 
			
		||||
#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 ) && !BOOST_PLAT_WINDOWS_RUNTIME
 | 
			
		||||
 | 
			
		||||
inline void yield( unsigned k ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    if( k < 4 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
#if defined( BOOST_SMT_PAUSE )
 | 
			
		||||
    else if( k < 16 )
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_SMT_PAUSE
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
#if !BOOST_PLAT_WINDOWS_RUNTIME
 | 
			
		||||
    else if( k < 32 )
 | 
			
		||||
    {
 | 
			
		||||
        Sleep( 0 );
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        Sleep( 1 );
 | 
			
		||||
    }
 | 
			
		||||
#else
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        // Sleep isn't supported on the Windows Runtime.
 | 
			
		||||
        std::this_thread::yield();
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // 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>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
@@ -130,31 +31,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 == 0 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
#if defined( BOOST_SMT_PAUSE )
 | 
			
		||||
    else if( k < 16 )
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_SMT_PAUSE
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
    else if( k < 32 || k & 1 )
 | 
			
		||||
    {
 | 
			
		||||
        sched_yield();
 | 
			
		||||
        sp_thread_pause();
 | 
			
		||||
    }
 | 
			
		||||
    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 );
 | 
			
		||||
        sp_thread_sleep();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -162,22 +48,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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										42
									
								
								include/boost/smart_ptr/enable_shared_from.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								include/boost/smart_ptr/enable_shared_from.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_ENABLE_SHARED_FROM_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_ENABLE_SHARED_FROM_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//  enable_shared_from.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2019, 2020 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
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/ for documentation.
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/requires_cxx11.hpp>
 | 
			
		||||
#include <boost/smart_ptr/enable_shared_from_this.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class enable_shared_from: public enable_shared_from_this<enable_shared_from>
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    using enable_shared_from_this<enable_shared_from>::shared_from_this;
 | 
			
		||||
    using enable_shared_from_this<enable_shared_from>::weak_from_this;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
{
 | 
			
		||||
    return weak_ptr<T>( p->enable_shared_from_this<enable_shared_from>::weak_from_this(), p );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_ENABLE_SHARED_FROM_HPP_INCLUDED
 | 
			
		||||
@@ -16,7 +16,7 @@
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
#include <boost/weak_ptr.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
#include <boost/config/workaround.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
@@ -144,8 +144,7 @@ template<typename T>
 | 
			
		||||
boost::weak_ptr<T> weak_from_raw(T *p)
 | 
			
		||||
{
 | 
			
		||||
    BOOST_ASSERT(p != 0);
 | 
			
		||||
    boost::weak_ptr<T> result;
 | 
			
		||||
    result._internal_aliasing_assign(p->enable_shared_from_raw::weak_from_this(), p);
 | 
			
		||||
    boost::weak_ptr<T> result(p->enable_shared_from_raw::weak_from_this(), p);
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/ for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/requires_cxx11.hpp>
 | 
			
		||||
#include <boost/smart_ptr/weak_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/shared_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
 
 | 
			
		||||
@@ -13,10 +13,12 @@
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/ for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/requires_cxx11.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
#include <boost/config/workaround.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>
 | 
			
		||||
@@ -245,7 +247,7 @@ template<class T, class U> inline bool operator!=(T * a, intrusive_ptr<U> const
 | 
			
		||||
    return a != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if __GNUC__ == 2 && __GNUC_MINOR__ <= 96
 | 
			
		||||
#if defined(__GNUC__) && __GNUC__ == 2 && __GNUC_MINOR__ <= 96
 | 
			
		||||
 | 
			
		||||
// Resolve the ambiguity between our op!= and the one in rel_ops
 | 
			
		||||
 | 
			
		||||
@@ -297,6 +299,8 @@ template<class T> T * get_pointer(intrusive_ptr<T> const & p) BOOST_SP_NOEXCEPT
 | 
			
		||||
    return p.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// pointer casts
 | 
			
		||||
 | 
			
		||||
template<class T, class U> intrusive_ptr<T> static_pointer_cast(intrusive_ptr<U> const & p)
 | 
			
		||||
{
 | 
			
		||||
    return static_cast<T *>(p.get());
 | 
			
		||||
@@ -312,6 +316,31 @@ template<class T, class U> intrusive_ptr<T> dynamic_pointer_cast(intrusive_ptr<U
 | 
			
		||||
    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
 | 
			
		||||
{
 | 
			
		||||
    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
 | 
			
		||||
{
 | 
			
		||||
    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
 | 
			
		||||
{
 | 
			
		||||
    T * p2 = dynamic_cast<T*>( p.get() );
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr<T> r( p2, false );
 | 
			
		||||
 | 
			
		||||
    if( p2 ) p.detach();
 | 
			
		||||
 | 
			
		||||
    return r;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
// operator<<
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_IOSTREAM)
 | 
			
		||||
@@ -358,4 +387,23 @@ template< class T > std::size_t hash_value( boost::intrusive_ptr<T> const & p )
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
    {
 | 
			
		||||
        return std::hash< T* >()( p.get() );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace std
 | 
			
		||||
 | 
			
		||||
#endif // #if !defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_INTRUSIVE_PTR_HPP_INCLUDED
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user