mirror of
				https://github.com/boostorg/smart_ptr.git
				synced 2025-11-04 01:31:51 +01:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			boost-1.64
			...
			boost-1.21
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					642e4f3b98 | 
							
								
								
									
										274
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										274
									
								
								.travis.yml
									
									
									
									
									
								
							@@ -1,274 +0,0 @@
 | 
			
		||||
# Copyright 2016 Peter Dimov
 | 
			
		||||
# Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 | 
			
		||||
language: cpp
 | 
			
		||||
 | 
			
		||||
sudo: false
 | 
			
		||||
 | 
			
		||||
os:
 | 
			
		||||
  - linux
 | 
			
		||||
  - osx
 | 
			
		||||
 | 
			
		||||
branches:
 | 
			
		||||
  only:
 | 
			
		||||
    - master
 | 
			
		||||
    - develop
 | 
			
		||||
 | 
			
		||||
env:
 | 
			
		||||
  matrix:
 | 
			
		||||
    - BOGUS_JOB=true
 | 
			
		||||
 | 
			
		||||
matrix:
 | 
			
		||||
 | 
			
		||||
  exclude:
 | 
			
		||||
    - env: BOGUS_JOB=true
 | 
			
		||||
 | 
			
		||||
  include:
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++ CXXSTD=c++03
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=c++03
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-4.7
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=c++11
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-4.7
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=c++03
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-4.8
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=c++11
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-4.8
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=c++03
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-4.9
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=c++11
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-4.9
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++03
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-5
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++11
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-5
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++14
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-5
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++03
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-6
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++11
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-6
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++14
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-6
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++1z
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - g++-6
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++03
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++11
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=c++03
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-3.6
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
            - llvm-toolchain-precise-3.6
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=c++11
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-3.6
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
            - llvm-toolchain-precise-3.6
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=c++03
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-3.7
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
            - llvm-toolchain-precise-3.7
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=c++11
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-3.7
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
            - llvm-toolchain-precise-3.7
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++03
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-3.8
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
            - llvm-toolchain-precise-3.8
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++11
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-3.8
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
            - llvm-toolchain-precise-3.8
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++14
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-3.8
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
            - llvm-toolchain-precise-3.8
 | 
			
		||||
 | 
			
		||||
    - os: linux
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++1z
 | 
			
		||||
      addons:
 | 
			
		||||
        apt:
 | 
			
		||||
          packages:
 | 
			
		||||
            - clang-3.8
 | 
			
		||||
          sources:
 | 
			
		||||
            - ubuntu-toolchain-r-test
 | 
			
		||||
            - llvm-toolchain-precise-3.8
 | 
			
		||||
 | 
			
		||||
    - os: osx
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++03
 | 
			
		||||
 | 
			
		||||
    - os: osx
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++11
 | 
			
		||||
 | 
			
		||||
    - os: osx
 | 
			
		||||
      env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++14
 | 
			
		||||
 | 
			
		||||
install:
 | 
			
		||||
  - cd ..
 | 
			
		||||
  - git clone -b $TRAVIS_BRANCH https://github.com/boostorg/boost.git boost-root
 | 
			
		||||
  - cd boost-root
 | 
			
		||||
  - git submodule init libs/align
 | 
			
		||||
  - git submodule init libs/assert
 | 
			
		||||
  - git submodule init libs/atomic
 | 
			
		||||
  - git submodule init libs/config
 | 
			
		||||
  - git submodule init libs/core
 | 
			
		||||
  - git submodule init libs/detail
 | 
			
		||||
  - git submodule init libs/functional
 | 
			
		||||
  - git submodule init libs/integer
 | 
			
		||||
  - git submodule init libs/move
 | 
			
		||||
  - git submodule init libs/predef
 | 
			
		||||
  - git submodule init libs/preprocessor
 | 
			
		||||
  - git submodule init libs/static_assert
 | 
			
		||||
  - git submodule init libs/throw_exception
 | 
			
		||||
  - git submodule init libs/type_traits
 | 
			
		||||
  - git submodule init tools/build
 | 
			
		||||
  - git submodule update
 | 
			
		||||
  - cp -r $TRAVIS_BUILD_DIR/* libs/smart_ptr
 | 
			
		||||
  - ./bootstrap.sh
 | 
			
		||||
  - ./b2 headers
 | 
			
		||||
 | 
			
		||||
script:
 | 
			
		||||
  - |-
 | 
			
		||||
    echo "using $TOOLSET : : $COMPILER : <cxxflags>-std=$CXXSTD ;" > ~/user-config.jam
 | 
			
		||||
  - ./b2 libs/smart_ptr/test toolset=$TOOLSET
 | 
			
		||||
 | 
			
		||||
notifications:
 | 
			
		||||
  email:
 | 
			
		||||
    on_success: always
 | 
			
		||||
@@ -1,6 +0,0 @@
 | 
			
		||||
# Boost.SmartPtr
 | 
			
		||||
 | 
			
		||||
Branch   | Travis | Appveyor
 | 
			
		||||
---------|--------|---------
 | 
			
		||||
Develop  | [](https://travis-ci.org/boostorg/smart_ptr) | [](https://ci.appveyor.com/project/pdimov/smart_ptr)
 | 
			
		||||
Master   | [](https://travis-ci.org/boostorg/smart_ptr) | [](https://ci.appveyor.com/project/pdimov/smart_ptr)
 | 
			
		||||
							
								
								
									
										41
									
								
								appveyor.yml
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								appveyor.yml
									
									
									
									
									
								
							@@ -1,41 +0,0 @@
 | 
			
		||||
# Copyright 2016 Peter Dimov
 | 
			
		||||
# Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
 | 
			
		||||
 | 
			
		||||
version: 1.0.{build}-{branch}
 | 
			
		||||
 | 
			
		||||
shallow_clone: true
 | 
			
		||||
 | 
			
		||||
branches:
 | 
			
		||||
  only:
 | 
			
		||||
    - master
 | 
			
		||||
    - develop
 | 
			
		||||
 | 
			
		||||
install:
 | 
			
		||||
  - cd ..
 | 
			
		||||
  - git clone -b %APPVEYOR_REPO_BRANCH% https://github.com/boostorg/boost.git boost-root
 | 
			
		||||
  - cd boost-root
 | 
			
		||||
  - git submodule init libs/align
 | 
			
		||||
  - git submodule init libs/assert
 | 
			
		||||
  - git submodule init libs/atomic
 | 
			
		||||
  - git submodule init libs/config
 | 
			
		||||
  - git submodule init libs/core
 | 
			
		||||
  - git submodule init libs/detail
 | 
			
		||||
  - git submodule init libs/functional
 | 
			
		||||
  - git submodule init libs/integer
 | 
			
		||||
  - git submodule init libs/move
 | 
			
		||||
  - git submodule init libs/predef
 | 
			
		||||
  - git submodule init libs/preprocessor
 | 
			
		||||
  - git submodule init libs/static_assert
 | 
			
		||||
  - git submodule init libs/throw_exception
 | 
			
		||||
  - git submodule init libs/type_traits
 | 
			
		||||
  - git submodule init tools/build
 | 
			
		||||
  - git submodule update
 | 
			
		||||
  - xcopy /s /e /q %APPVEYOR_BUILD_FOLDER% libs\smart_ptr
 | 
			
		||||
  - bootstrap
 | 
			
		||||
  - b2 headers
 | 
			
		||||
 | 
			
		||||
build: off
 | 
			
		||||
 | 
			
		||||
test_script:
 | 
			
		||||
  - b2 libs/smart_ptr/test toolset=msvc-9.0,msvc-10.0,msvc-11.0,msvc-14.0
 | 
			
		||||
@@ -1,88 +0,0 @@
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 | 
			
		||||
<html>
 | 
			
		||||
    <head>
 | 
			
		||||
        <title>Smart Pointer Changes</title>
 | 
			
		||||
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 | 
			
		||||
    </head>
 | 
			
		||||
    <body text="#000000" bgcolor="#ffffff" link="#0000ff" vlink="#0000ff">
 | 
			
		||||
        <h1><img height="86" alt="boost.png (6897 bytes)" src="../../boost.png" 
 | 
			
		||||
            width="277" align="middle" border="0">Smart Pointer Changes</h1>
 | 
			
		||||
        <p>The February 2002 change to the Boost smart pointers introduced a number of 
 | 
			
		||||
            changes. Since the previous version of the smart pointers was in use for a long 
 | 
			
		||||
            time, it's useful to have a detailed list of what changed from a library user's 
 | 
			
		||||
            point of view.</p>
 | 
			
		||||
        <p>Note that for compilers that don't support member templates well enough, a 
 | 
			
		||||
            separate implementation is used that lacks many of the new features and is more 
 | 
			
		||||
            like the old version.</p>
 | 
			
		||||
        <h2>Features Requiring Code Changes to Take Advantage</h2>
 | 
			
		||||
        <ul>
 | 
			
		||||
            <li>
 | 
			
		||||
                The smart pointer class templates now each have their own header file. For 
 | 
			
		||||
                compatibility, the <a href="../../boost/smart_ptr.hpp"><boost/smart_ptr.hpp></a>
 | 
			
		||||
            header now includes the headers for the four classic smart pointer class 
 | 
			
		||||
            templates.
 | 
			
		||||
            <li>
 | 
			
		||||
                The <b>weak_ptr</b>
 | 
			
		||||
            template was added.
 | 
			
		||||
            <li>
 | 
			
		||||
                The new <b>shared_ptr</b> and <b>shared_array</b> relax the requirement that 
 | 
			
		||||
                the pointed-to object's destructor must be visible when instantiating the <b>shared_ptr</b>
 | 
			
		||||
            destructor. This makes it easier to have shared_ptr members in classes without 
 | 
			
		||||
            explicit destructors.
 | 
			
		||||
            <li>
 | 
			
		||||
                A custom deallocator can be passed in when creating a <b>shared_ptr</b> or <b>shared_array</b>.
 | 
			
		||||
            <li>
 | 
			
		||||
                <b>shared_static_cast</b> and <b>shared_dynamic_cast</b> function templates are 
 | 
			
		||||
                provided which work for <b>shared_ptr</b> and <b>weak_ptr</b> as <b>static_cast</b>
 | 
			
		||||
                and <b>dynamic_cast</b>
 | 
			
		||||
            do for pointers.
 | 
			
		||||
            <li>
 | 
			
		||||
                The self-assignment misfeature has been removed from <b>shared_ptr::reset</b>, 
 | 
			
		||||
                although it is still present in <b>scoped_ptr</b>, and in <b>std::auto_ptr</b>. 
 | 
			
		||||
                Calling <b>reset</b> with a pointer to the object that's already owned by the <b>shared_ptr</b>
 | 
			
		||||
            results in undefined behavior (an assertion, or eventually a double-delete if 
 | 
			
		||||
            assertions are off).
 | 
			
		||||
            <li>
 | 
			
		||||
                The <b>BOOST_SMART_PTR_CONVERSION</b>
 | 
			
		||||
            feature has been removed.
 | 
			
		||||
            <li>
 | 
			
		||||
                <b>shared_ptr<void></b> is now allowed.</li>
 | 
			
		||||
        </ul>
 | 
			
		||||
        <h2>Features That Improve Robustness</h2>
 | 
			
		||||
        <ul>
 | 
			
		||||
            <li>
 | 
			
		||||
                The manipulation of use counts is now <a name="threadsafe">thread safe</a> on 
 | 
			
		||||
                Windows, Linux, and platforms that support pthreads. See the <a href="../../boost/detail/atomic_count.hpp">
 | 
			
		||||
                    <boost/detail/atomic_count.hpp></a>
 | 
			
		||||
            file for details
 | 
			
		||||
            <li>
 | 
			
		||||
                The new shared_ptr will always delete the object using the pointer it was 
 | 
			
		||||
                originally constructed with. This prevents subtle problems that could happen if 
 | 
			
		||||
                the last <b>shared_ptr</b> was a pointer to a sub-object of a class that did 
 | 
			
		||||
                not have a virtual destructor.</li>
 | 
			
		||||
        </ul>
 | 
			
		||||
        <h2>Implementation Details</h2>
 | 
			
		||||
        <ul>
 | 
			
		||||
            <li>
 | 
			
		||||
                Some bugs in the assignment operator implementations and in <b>reset</b>
 | 
			
		||||
            have been fixed by using the "copy and swap" idiom.
 | 
			
		||||
            <li>
 | 
			
		||||
                Assertions have been added to check preconditions of various functions; 
 | 
			
		||||
                however, since these use the new <a href="../../boost/assert.hpp"><boost/assert.hpp></a>
 | 
			
		||||
            header, the assertions are disabled by default.
 | 
			
		||||
            <li>
 | 
			
		||||
                The partial specialization of <b>std::less</b> has been replaced by <b>operator<</b>
 | 
			
		||||
            overloads which accomplish the same thing without relying on undefined 
 | 
			
		||||
            behavior.
 | 
			
		||||
            <li>
 | 
			
		||||
                The incorrect overload of <b>std::swap</b> has been replaced by <b>boost::swap</b>, 
 | 
			
		||||
                which has many of the same advantages for generic programming but does not 
 | 
			
		||||
                violate the C++ standard.</li>
 | 
			
		||||
        </ul>
 | 
			
		||||
        <hr>
 | 
			
		||||
        <p>$Date$</p>
 | 
			
		||||
        <p><small>Copyright 2002 Darin Adler. Distributed under the Boost Software License, Version 
 | 
			
		||||
            1.0. See accompanying file <A href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</A> or 
 | 
			
		||||
            copy at <A href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</A>.</small></p>
 | 
			
		||||
    </body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,110 +0,0 @@
 | 
			
		||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 | 
			
		||||
<html>
 | 
			
		||||
    <head>
 | 
			
		||||
        <title>enable_shared_from_this</title>
 | 
			
		||||
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
 | 
			
		||||
    </head>
 | 
			
		||||
    <body text="#000000" bgcolor="#ffffff" link="#0000ff" vlink="#0000ff">
 | 
			
		||||
        <h1><img height="86" alt="boost.png (6897 bytes)" src="../../boost.png"
 | 
			
		||||
            width="277" align="middle" border="0" />enable_shared_from_this</h1>
 | 
			
		||||
        <h2><a name="Purpose">Purpose</a></h2>
 | 
			
		||||
        <p>
 | 
			
		||||
            The header <code><boost/enable_shared_from_this.hpp></code> defines
 | 
			
		||||
            the class template <code>enable_shared_from_this</code>. It is used as a
 | 
			
		||||
            base class that allows a <a href="shared_ptr.htm">shared_ptr</a> or
 | 
			
		||||
            a <a href="weak_ptr.htm">weak_ptr</a> to the current object to be obtained
 | 
			
		||||
            from within a member function.
 | 
			
		||||
        </p>
 | 
			
		||||
        <p><code>enable_shared_from_this<T></code> defines two member functions
 | 
			
		||||
            called <code>shared_from_this</code> that return a <code>shared_ptr<T></code>
 | 
			
		||||
            and <code>shared_ptr<T const></code>, depending on constness, to <code>this</code>.
 | 
			
		||||
            It also defines two member functions called <code>weak_from_this</code> that return
 | 
			
		||||
            a corresponding <code>weak_ptr</code>.
 | 
			
		||||
        </p>
 | 
			
		||||
        <h2><a name="Example">Example</a></h2>
 | 
			
		||||
        <pre>
 | 
			
		||||
#include <boost/enable_shared_from_this.hpp>
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
#include <cassert>
 | 
			
		||||
 | 
			
		||||
class Y: public boost::enable_shared_from_this<Y>
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    boost::shared_ptr<Y> f()
 | 
			
		||||
    {
 | 
			
		||||
        return 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
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
        <h2><a name="Synopsis">Synopsis</a></h2>
 | 
			
		||||
        <pre>
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<class T> class enable_shared_from_this
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    shared_ptr<T> shared_from_this();
 | 
			
		||||
    shared_ptr<T const> shared_from_this() const;
 | 
			
		||||
 | 
			
		||||
    weak_ptr<T> weak_from_this() noexcept;
 | 
			
		||||
    weak_ptr<T const> weak_from_this() const noexcept;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
</pre>
 | 
			
		||||
        <h4><code>template<class T> shared_ptr<T>
 | 
			
		||||
            enable_shared_from_this<T>::shared_from_this();</code></h4>
 | 
			
		||||
        <h4><code>template<class T> shared_ptr<T const>
 | 
			
		||||
            enable_shared_from_this<T>::shared_from_this() const;</code></h4>
 | 
			
		||||
        <blockquote>
 | 
			
		||||
            <p>
 | 
			
		||||
                <b>Requires:</b> <code>enable_shared_from_this<T></code> must be an 
 | 
			
		||||
                accessible base class of <code>T</code>. <code>*this</code> must be a subobject 
 | 
			
		||||
                of an instance <code>t</code> of type <code>T</code>.
 | 
			
		||||
            </p>
 | 
			
		||||
            <p>
 | 
			
		||||
                <b>Returns:</b> If a <code>shared_ptr</code> instance <code>p</code> that <em>owns</em>
 | 
			
		||||
                <code>t</code> exists, a <code>shared_ptr<T></code> instance <code>r</code> that shares 
 | 
			
		||||
                ownership with <code>p</code>.
 | 
			
		||||
            </p>
 | 
			
		||||
            <p>
 | 
			
		||||
                <b>Postconditions:</b> <code>r.get() == this</code>.
 | 
			
		||||
            </p>
 | 
			
		||||
            <p>
 | 
			
		||||
                <b>Throws:</b> <code>bad_weak_ptr</code> when no <code>shared_ptr</code> <em>owns</em> <code>*this</code>.
 | 
			
		||||
            </p>
 | 
			
		||||
        </blockquote>
 | 
			
		||||
        <h4><code>template<class T> weak_ptr<T>
 | 
			
		||||
            enable_shared_from_this<T>::weak_from_this() noexcept;</code></h4>
 | 
			
		||||
        <h4><code>template<class T> weak_ptr<T const>
 | 
			
		||||
            enable_shared_from_this<T>::weak_from_this() const noexcept;</code></h4>
 | 
			
		||||
        <blockquote>
 | 
			
		||||
            <p>
 | 
			
		||||
                <b>Requires:</b> <code>enable_shared_from_this<T></code> must be an 
 | 
			
		||||
                accessible base class of <code>T</code>. <code>*this</code> must be a subobject 
 | 
			
		||||
                of an instance <code>t</code> of type <code>T</code>.
 | 
			
		||||
            </p>
 | 
			
		||||
            <p>
 | 
			
		||||
                <b>Returns:</b> If a <code>shared_ptr</code> instance <code>p</code> that <em>owns</em>
 | 
			
		||||
                <code>t</code> exists or has existed in the past, a <code>weak_ptr<T></code> instance
 | 
			
		||||
                <code>r</code> that shares ownership with <code>p</code>. Otherwise, an empty <code>weak_ptr</code>.
 | 
			
		||||
            </p>
 | 
			
		||||
        </blockquote>
 | 
			
		||||
        <hr />
 | 
			
		||||
        <p>
 | 
			
		||||
            <small>Copyright © 2002, 2003, 2015 by Peter Dimov. Distributed under the Boost Software License, Version 
 | 
			
		||||
                1.0. See accompanying file <a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or 
 | 
			
		||||
                copy at <a href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>.</small></p>
 | 
			
		||||
    </body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,23 +0,0 @@
 | 
			
		||||
// Boost scoped_ptr_example implementation file  -----------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright Beman Dawes 2001.  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 "scoped_ptr_example.hpp"
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
class example::implementation
 | 
			
		||||
{
 | 
			
		||||
 public:
 | 
			
		||||
  ~implementation() { std::cout << "destroying implementation\n"; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
example::example() : _imp( new implementation ) {}
 | 
			
		||||
 | 
			
		||||
void example::do_something() { std::cout << "did something\n"; }
 | 
			
		||||
 | 
			
		||||
example::~example() {}
 | 
			
		||||
@@ -1,29 +0,0 @@
 | 
			
		||||
//  Boost scoped_ptr_example header file  ------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright Beman Dawes 2001.  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/utility.hpp>
 | 
			
		||||
#include <boost/scoped_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
//  The point of this example is to prove that even though
 | 
			
		||||
//  example::implementation is an incomplete type in translation units using
 | 
			
		||||
//  this header, scoped_ptr< implementation > is still valid because the type
 | 
			
		||||
//  is complete where it counts - in the inplementation translation unit where
 | 
			
		||||
//  destruction is actually instantiated.
 | 
			
		||||
 | 
			
		||||
class example : private boost::noncopyable
 | 
			
		||||
{
 | 
			
		||||
 public:
 | 
			
		||||
  example();
 | 
			
		||||
  ~example();
 | 
			
		||||
  void do_something();
 | 
			
		||||
 private:
 | 
			
		||||
  class implementation;
 | 
			
		||||
  boost::scoped_ptr< implementation > _imp; // hide implementation details
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -1,17 +0,0 @@
 | 
			
		||||
// Boost scoped_ptr_example_test main program  -------------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright Beman Dawes 2001.  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 "scoped_ptr_example.hpp"
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
  example my_example;
 | 
			
		||||
  my_example.do_something();
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,95 +0,0 @@
 | 
			
		||||
//  Boost shared_ptr_example.cpp  --------------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright Beman Dawes 2001.  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.
 | 
			
		||||
 | 
			
		||||
//  Revision History
 | 
			
		||||
//  21 May 01  Initial complete version (Beman Dawes)
 | 
			
		||||
 | 
			
		||||
//  The original code for this example appeared in the shared_ptr documentation.
 | 
			
		||||
//  Ray Gallimore pointed out that foo_set was missing a Compare template
 | 
			
		||||
//  argument, so would not work as intended.  At that point the code was
 | 
			
		||||
//  turned into an actual .cpp file so it could be compiled and tested.
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <set>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
//  The application will produce a series of
 | 
			
		||||
//  objects of type Foo which later must be
 | 
			
		||||
//  accessed both by occurrence (std::vector)
 | 
			
		||||
//  and by ordering relationship (std::set).
 | 
			
		||||
 | 
			
		||||
struct Foo
 | 
			
		||||
{ 
 | 
			
		||||
  Foo( int _x ) : x(_x) {}
 | 
			
		||||
  ~Foo() { std::cout << "Destructing a Foo with x=" << x << "\n"; }
 | 
			
		||||
  int x;
 | 
			
		||||
  /* ... */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef boost::shared_ptr<Foo> FooPtr;
 | 
			
		||||
 | 
			
		||||
struct FooPtrOps
 | 
			
		||||
{
 | 
			
		||||
  bool operator()( const FooPtr & a, const FooPtr & b )
 | 
			
		||||
    { return a->x > b->x; }
 | 
			
		||||
  void operator()( const FooPtr & a )
 | 
			
		||||
    { std::cout << a->x << "\n"; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
  std::vector<FooPtr>         foo_vector;
 | 
			
		||||
  std::set<FooPtr,FooPtrOps>  foo_set; // NOT multiset!
 | 
			
		||||
 | 
			
		||||
  FooPtr foo_ptr( new Foo( 2 ) );
 | 
			
		||||
  foo_vector.push_back( foo_ptr );
 | 
			
		||||
  foo_set.insert( foo_ptr );
 | 
			
		||||
 | 
			
		||||
  foo_ptr.reset( new Foo( 1 ) );
 | 
			
		||||
  foo_vector.push_back( foo_ptr );
 | 
			
		||||
  foo_set.insert( foo_ptr );
 | 
			
		||||
 | 
			
		||||
  foo_ptr.reset( new Foo( 3 ) );
 | 
			
		||||
  foo_vector.push_back( foo_ptr );
 | 
			
		||||
  foo_set.insert( foo_ptr );
 | 
			
		||||
 | 
			
		||||
  foo_ptr.reset ( new Foo( 2 ) );
 | 
			
		||||
  foo_vector.push_back( foo_ptr );
 | 
			
		||||
  foo_set.insert( foo_ptr );
 | 
			
		||||
 | 
			
		||||
  std::cout << "foo_vector:\n";
 | 
			
		||||
  std::for_each( foo_vector.begin(), foo_vector.end(), FooPtrOps() );
 | 
			
		||||
  
 | 
			
		||||
  std::cout << "\nfoo_set:\n"; 
 | 
			
		||||
  std::for_each( foo_set.begin(), foo_set.end(), FooPtrOps() );
 | 
			
		||||
  std::cout << "\n";
 | 
			
		||||
 | 
			
		||||
//  Expected output:
 | 
			
		||||
//
 | 
			
		||||
//   foo_vector:
 | 
			
		||||
//   2
 | 
			
		||||
//   1
 | 
			
		||||
//   3
 | 
			
		||||
//   2
 | 
			
		||||
//   
 | 
			
		||||
//   foo_set:
 | 
			
		||||
//   3
 | 
			
		||||
//   2
 | 
			
		||||
//   1
 | 
			
		||||
//
 | 
			
		||||
//   Destructing a Foo with x=2
 | 
			
		||||
//   Destructing a Foo with x=1
 | 
			
		||||
//   Destructing a Foo with x=3
 | 
			
		||||
//   Destructing a Foo with x=2
 | 
			
		||||
   
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1,22 +0,0 @@
 | 
			
		||||
// Boost shared_ptr_example2 implementation file  -----------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright Beman Dawes 2001.  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 "shared_ptr_example2.hpp"
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
class example::implementation
 | 
			
		||||
{
 | 
			
		||||
 public:
 | 
			
		||||
  ~implementation() { std::cout << "destroying implementation\n"; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
example::example() : _imp( new implementation ) {}
 | 
			
		||||
 | 
			
		||||
void example::do_something()
 | 
			
		||||
  { std::cout << "use_count() is " << _imp.use_count() << "\n"; }
 | 
			
		||||
@@ -1,31 +0,0 @@
 | 
			
		||||
//  Boost shared_ptr_example2 header file  -----------------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright Beman Dawes 2001.  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/shared_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
//  This example demonstrates the handle/body idiom (also called pimpl and
 | 
			
		||||
//  several other names).  It separates the interface (in this header file)
 | 
			
		||||
//  from the implementation (in shared_ptr_example2.cpp).
 | 
			
		||||
 | 
			
		||||
//  Note that even though example::implementation is an incomplete type in
 | 
			
		||||
//  some translation units using this header, shared_ptr< implementation >
 | 
			
		||||
//  is still valid because the type is complete where it counts - in the
 | 
			
		||||
//  shared_ptr_example2.cpp translation unit where functions requiring a
 | 
			
		||||
//  complete type are actually instantiated.
 | 
			
		||||
 | 
			
		||||
class example
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
  example();
 | 
			
		||||
  void do_something();
 | 
			
		||||
private:
 | 
			
		||||
  class implementation;
 | 
			
		||||
  boost::shared_ptr< implementation > _imp; // hide implementation details
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -1,22 +0,0 @@
 | 
			
		||||
// Boost shared_ptr_example2_test main program  ------------------------------//
 | 
			
		||||
 | 
			
		||||
//  Copyright Beman Dawes 2001.  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 "shared_ptr_example2.hpp"
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
  example a;
 | 
			
		||||
  a.do_something();
 | 
			
		||||
  example b(a);
 | 
			
		||||
  b.do_something();
 | 
			
		||||
  example c;
 | 
			
		||||
  c = a;
 | 
			
		||||
  c.do_something();
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,270 +0,0 @@
 | 
			
		||||
//
 | 
			
		||||
//  sp_collector.cpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002, 2003 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
#include <boost/detail/lightweight_mutex.hpp>
 | 
			
		||||
#include <cstdlib>
 | 
			
		||||
#include <map>
 | 
			
		||||
#include <deque>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
typedef std::map< void const *, std::pair<void *, size_t> > map_type;
 | 
			
		||||
 | 
			
		||||
static map_type & get_map()
 | 
			
		||||
{
 | 
			
		||||
    static map_type m;
 | 
			
		||||
    return m;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef boost::detail::lightweight_mutex mutex_type;
 | 
			
		||||
 | 
			
		||||
static mutex_type & get_mutex()
 | 
			
		||||
{
 | 
			
		||||
    static mutex_type m;
 | 
			
		||||
    return m;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void * init_mutex_before_main = &get_mutex();
 | 
			
		||||
 | 
			
		||||
namespace
 | 
			
		||||
{
 | 
			
		||||
    class X;
 | 
			
		||||
 | 
			
		||||
    struct count_layout
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::sp_counted_base * pi;
 | 
			
		||||
        int id;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    struct shared_ptr_layout
 | 
			
		||||
    {
 | 
			
		||||
        X * px;
 | 
			
		||||
        count_layout pn;
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// assume 4 byte alignment for pointers when scanning
 | 
			
		||||
size_t const pointer_align = 4;
 | 
			
		||||
 | 
			
		||||
typedef std::map<void const *, long> map2_type;
 | 
			
		||||
 | 
			
		||||
static void scan_and_count(void const * area, size_t size, map_type const & m, map2_type & m2)
 | 
			
		||||
{
 | 
			
		||||
    unsigned char const * p = static_cast<unsigned char const *>(area);
 | 
			
		||||
 | 
			
		||||
    for(size_t n = 0; n + sizeof(shared_ptr_layout) <= size; p += pointer_align, n += pointer_align)
 | 
			
		||||
    {
 | 
			
		||||
        shared_ptr_layout const * q = reinterpret_cast<shared_ptr_layout const *>(p);
 | 
			
		||||
 | 
			
		||||
        if(q->pn.id == boost::detail::shared_count_id && q->pn.pi != 0 && m.count(q->pn.pi) != 0)
 | 
			
		||||
        {
 | 
			
		||||
            ++m2[q->pn.pi];
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef std::deque<void const *> open_type;
 | 
			
		||||
 | 
			
		||||
static void scan_and_mark(void const * area, size_t size, map2_type & m2, open_type & open)
 | 
			
		||||
{
 | 
			
		||||
    unsigned char const * p = static_cast<unsigned char const *>(area);
 | 
			
		||||
 | 
			
		||||
    for(size_t n = 0; n + sizeof(shared_ptr_layout) <= size; p += pointer_align, n += pointer_align)
 | 
			
		||||
    {
 | 
			
		||||
        shared_ptr_layout const * q = reinterpret_cast<shared_ptr_layout const *>(p);
 | 
			
		||||
 | 
			
		||||
        if(q->pn.id == boost::detail::shared_count_id && q->pn.pi != 0 && m2.count(q->pn.pi) != 0)
 | 
			
		||||
        {
 | 
			
		||||
            open.push_back(q->pn.pi);
 | 
			
		||||
            m2.erase(q->pn.pi);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void find_unreachable_objects_impl(map_type const & m, map2_type & m2)
 | 
			
		||||
{
 | 
			
		||||
    // scan objects for shared_ptr members, compute internal counts
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
        std::cout << "... " << m.size() << " objects in m.\n";
 | 
			
		||||
 | 
			
		||||
        for(map_type::const_iterator i = m.begin(); i != m.end(); ++i)
 | 
			
		||||
        {
 | 
			
		||||
            boost::detail::sp_counted_base const * p = static_cast<boost::detail::sp_counted_base const *>(i->first);
 | 
			
		||||
 | 
			
		||||
            BOOST_ASSERT(p->use_count() != 0); // there should be no inactive counts in the map
 | 
			
		||||
 | 
			
		||||
            m2[ i->first ];
 | 
			
		||||
 | 
			
		||||
            scan_and_count(i->second.first, i->second.second, m, m2);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        std::cout << "... " << m2.size() << " objects in m2.\n";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // mark reachable objects
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
        open_type open;
 | 
			
		||||
 | 
			
		||||
        for(map2_type::iterator i = m2.begin(); i != m2.end(); ++i)
 | 
			
		||||
        {
 | 
			
		||||
            boost::detail::sp_counted_base const * p = static_cast<boost::detail::sp_counted_base const *>(i->first);
 | 
			
		||||
            if(p->use_count() != i->second) open.push_back(p);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        std::cout << "... " << open.size() << " objects in open.\n";
 | 
			
		||||
 | 
			
		||||
        for(open_type::iterator j = open.begin(); j != open.end(); ++j)
 | 
			
		||||
        {
 | 
			
		||||
            m2.erase(*j);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        while(!open.empty())
 | 
			
		||||
        {
 | 
			
		||||
            void const * p = open.front();
 | 
			
		||||
            open.pop_front();
 | 
			
		||||
 | 
			
		||||
            map_type::const_iterator i = m.find(p);
 | 
			
		||||
            BOOST_ASSERT(i != m.end());
 | 
			
		||||
 | 
			
		||||
            scan_and_mark(i->second.first, i->second.second, m2, open);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // m2 now contains the unreachable objects
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::size_t find_unreachable_objects(bool report)
 | 
			
		||||
{
 | 
			
		||||
    map2_type m2;
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_HAS_THREADS
 | 
			
		||||
 | 
			
		||||
    // This will work without the #ifdef, but some compilers warn
 | 
			
		||||
    // that lock is not referenced
 | 
			
		||||
 | 
			
		||||
    mutex_type::scoped_lock lock(get_mutex());
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    map_type const & m = get_map();
 | 
			
		||||
 | 
			
		||||
    find_unreachable_objects_impl(m, m2);
 | 
			
		||||
 | 
			
		||||
    if(report)
 | 
			
		||||
    {
 | 
			
		||||
        for(map2_type::iterator j = m2.begin(); j != m2.end(); ++j)
 | 
			
		||||
        {
 | 
			
		||||
            map_type::const_iterator i = m.find(j->first);
 | 
			
		||||
            BOOST_ASSERT(i != m.end());
 | 
			
		||||
            std::cout << "Unreachable object at " << i->second.first << ", " << i->second.second << " bytes long.\n";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return m2.size();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef std::deque< boost::shared_ptr<X> > free_list_type;
 | 
			
		||||
 | 
			
		||||
static void scan_and_free(void * area, size_t size, map2_type const & m2, free_list_type & free)
 | 
			
		||||
{
 | 
			
		||||
    unsigned char * p = static_cast<unsigned char *>(area);
 | 
			
		||||
 | 
			
		||||
    for(size_t n = 0; n + sizeof(shared_ptr_layout) <= size; p += pointer_align, n += pointer_align)
 | 
			
		||||
    {
 | 
			
		||||
        shared_ptr_layout * q = reinterpret_cast<shared_ptr_layout *>(p);
 | 
			
		||||
 | 
			
		||||
        if(q->pn.id == boost::detail::shared_count_id && q->pn.pi != 0 && m2.count(q->pn.pi) != 0 && q->px != 0)
 | 
			
		||||
        {
 | 
			
		||||
            boost::shared_ptr<X> * ppx = reinterpret_cast< boost::shared_ptr<X> * >(p);
 | 
			
		||||
            free.push_back(*ppx);
 | 
			
		||||
            ppx->reset();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void free_unreachable_objects()
 | 
			
		||||
{
 | 
			
		||||
    free_list_type free;
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
        map2_type m2;
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_HAS_THREADS
 | 
			
		||||
 | 
			
		||||
        mutex_type::scoped_lock lock(get_mutex());
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        map_type const & m = get_map();
 | 
			
		||||
 | 
			
		||||
        find_unreachable_objects_impl(m, m2);
 | 
			
		||||
 | 
			
		||||
        for(map2_type::iterator j = m2.begin(); j != m2.end(); ++j)
 | 
			
		||||
        {
 | 
			
		||||
            map_type::const_iterator i = m.find(j->first);
 | 
			
		||||
            BOOST_ASSERT(i != m.end());
 | 
			
		||||
            scan_and_free(i->second.first, i->second.second, m2, free);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::cout << "... about to free " << free.size() << " objects.\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// debug hooks
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
void sp_scalar_constructor_hook(void *)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void sp_scalar_constructor_hook(void * px, std::size_t size, void * pn)
 | 
			
		||||
{
 | 
			
		||||
#ifdef BOOST_HAS_THREADS
 | 
			
		||||
 | 
			
		||||
    mutex_type::scoped_lock lock(get_mutex());
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    get_map()[pn] = std::make_pair(px, size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void sp_scalar_destructor_hook(void *)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void sp_scalar_destructor_hook(void *, std::size_t, void * pn)
 | 
			
		||||
{
 | 
			
		||||
#ifdef BOOST_HAS_THREADS
 | 
			
		||||
 | 
			
		||||
    mutex_type::scoped_lock lock(get_mutex());
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    get_map().erase(pn);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void sp_array_constructor_hook(void *)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void sp_array_destructor_hook(void *)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
@@ -1,243 +0,0 @@
 | 
			
		||||
//
 | 
			
		||||
//  sp_debug_hooks.cpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002, 2003 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <new>
 | 
			
		||||
#include <cstdlib>
 | 
			
		||||
 | 
			
		||||
int const m = 2; // m * sizeof(int) must be aligned appropriately
 | 
			
		||||
 | 
			
		||||
// magic values to mark heap blocks with
 | 
			
		||||
 | 
			
		||||
int const allocated_scalar  = 0x1234560C;
 | 
			
		||||
int const allocated_array   = 0x1234560A;
 | 
			
		||||
int const adopted_scalar    = 0x0567890C;
 | 
			
		||||
int const adopted_array     = 0x0567890A;
 | 
			
		||||
int const deleted           = 0x498769DE;
 | 
			
		||||
 | 
			
		||||
using namespace std; // for compilers where things aren't in std
 | 
			
		||||
 | 
			
		||||
// operator new
 | 
			
		||||
 | 
			
		||||
static new_handler get_new_handler()
 | 
			
		||||
{
 | 
			
		||||
    new_handler p = set_new_handler(0);
 | 
			
		||||
    set_new_handler(p);
 | 
			
		||||
    return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void * allocate(size_t n, int mark)
 | 
			
		||||
{
 | 
			
		||||
    int * pm;
 | 
			
		||||
 | 
			
		||||
    for(;;)
 | 
			
		||||
    {
 | 
			
		||||
        pm = static_cast<int*>(malloc(n + m * sizeof(int)));
 | 
			
		||||
 | 
			
		||||
        if(pm != 0) break;
 | 
			
		||||
 | 
			
		||||
        if(new_handler pnh = get_new_handler())
 | 
			
		||||
        {
 | 
			
		||||
            pnh();
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    *pm = mark;
 | 
			
		||||
 | 
			
		||||
    return pm + m;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void * operator new(size_t n) throw(bad_alloc)
 | 
			
		||||
{
 | 
			
		||||
    void * p = allocate(n, allocated_scalar);
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_EXCEPTIONS)
 | 
			
		||||
 | 
			
		||||
    if(p == 0) throw bad_alloc();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(__BORLANDC__) || (__BORLANDC__ > 0x551)
 | 
			
		||||
 | 
			
		||||
void * operator new(size_t n, nothrow_t const &) throw()
 | 
			
		||||
{
 | 
			
		||||
    return allocate(n, allocated_scalar);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void * operator new[](size_t n) throw(bad_alloc)
 | 
			
		||||
{
 | 
			
		||||
    void * p = allocate(n, allocated_array);
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_EXCEPTIONS)
 | 
			
		||||
 | 
			
		||||
    if(p == 0) throw bad_alloc();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(__BORLANDC__) || (__BORLANDC__ > 0x551)
 | 
			
		||||
 | 
			
		||||
void * operator new[](size_t n, nothrow_t const &) throw()
 | 
			
		||||
{
 | 
			
		||||
    return allocate(n, allocated_array);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// debug hooks
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
void sp_scalar_constructor_hook(void * p)
 | 
			
		||||
{
 | 
			
		||||
    if(p == 0) return;
 | 
			
		||||
 | 
			
		||||
    int * pm = static_cast<int*>(p);
 | 
			
		||||
    pm -= m;
 | 
			
		||||
 | 
			
		||||
    BOOST_ASSERT(*pm != adopted_scalar);    // second smart pointer to the same address
 | 
			
		||||
    BOOST_ASSERT(*pm != allocated_array);   // allocated with new[]
 | 
			
		||||
    BOOST_ASSERT(*pm == allocated_scalar);  // not allocated with new
 | 
			
		||||
 | 
			
		||||
    *pm = adopted_scalar;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void sp_scalar_constructor_hook(void * px, std::size_t, void *)
 | 
			
		||||
{
 | 
			
		||||
    sp_scalar_constructor_hook(px);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void sp_scalar_destructor_hook(void * p)
 | 
			
		||||
{
 | 
			
		||||
    if(p == 0) return;
 | 
			
		||||
 | 
			
		||||
    int * pm = static_cast<int*>(p);
 | 
			
		||||
    pm -= m;
 | 
			
		||||
 | 
			
		||||
    BOOST_ASSERT(*pm == adopted_scalar);    // attempt to destroy nonmanaged block
 | 
			
		||||
 | 
			
		||||
    *pm = allocated_scalar;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void sp_scalar_destructor_hook(void * px, std::size_t, void *)
 | 
			
		||||
{
 | 
			
		||||
    sp_scalar_destructor_hook(px);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// It is not possible to handle the array hooks in a portable manner.
 | 
			
		||||
// The implementation typically reserves a bit of storage for the number
 | 
			
		||||
// of objects in the array, and the argument of the array hook isn't
 | 
			
		||||
// equal to the return value of operator new[].
 | 
			
		||||
 | 
			
		||||
void sp_array_constructor_hook(void * /* p */)
 | 
			
		||||
{
 | 
			
		||||
/*
 | 
			
		||||
    if(p == 0) return;
 | 
			
		||||
 | 
			
		||||
    // adjust p depending on the implementation
 | 
			
		||||
 | 
			
		||||
    int * pm = static_cast<int*>(p);
 | 
			
		||||
    pm -= m;
 | 
			
		||||
 | 
			
		||||
    BOOST_ASSERT(*pm != adopted_array);     // second smart array pointer to the same address
 | 
			
		||||
    BOOST_ASSERT(*pm != allocated_scalar);  // allocated with new
 | 
			
		||||
    BOOST_ASSERT(*pm == allocated_array);   // not allocated with new[]
 | 
			
		||||
 | 
			
		||||
    *pm = adopted_array;
 | 
			
		||||
*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void sp_array_destructor_hook(void * /* p */)
 | 
			
		||||
{
 | 
			
		||||
/*
 | 
			
		||||
    if(p == 0) return;
 | 
			
		||||
 | 
			
		||||
    // adjust p depending on the implementation
 | 
			
		||||
 | 
			
		||||
    int * pm = static_cast<int*>(p);
 | 
			
		||||
    pm -= m;
 | 
			
		||||
 | 
			
		||||
    BOOST_ASSERT(*pm == adopted_array); // attempt to destroy nonmanaged block
 | 
			
		||||
 | 
			
		||||
    *pm = allocated_array;
 | 
			
		||||
*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
// operator delete
 | 
			
		||||
 | 
			
		||||
void operator delete(void * p) throw()
 | 
			
		||||
{
 | 
			
		||||
    if(p == 0) return;
 | 
			
		||||
 | 
			
		||||
    int * pm = static_cast<int*>(p);
 | 
			
		||||
    pm -= m;
 | 
			
		||||
 | 
			
		||||
    BOOST_ASSERT(*pm != deleted);           // double delete
 | 
			
		||||
    BOOST_ASSERT(*pm != adopted_scalar);    // delete p.get();
 | 
			
		||||
    BOOST_ASSERT(*pm != allocated_array);   // allocated with new[]
 | 
			
		||||
    BOOST_ASSERT(*pm == allocated_scalar);  // not allocated with new
 | 
			
		||||
 | 
			
		||||
    *pm = deleted;
 | 
			
		||||
 | 
			
		||||
    free(pm);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(__BORLANDC__) || (__BORLANDC__ > 0x551)
 | 
			
		||||
 | 
			
		||||
void operator delete(void * p, nothrow_t const &) throw()
 | 
			
		||||
{
 | 
			
		||||
    ::operator delete(p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void operator delete[](void * p) throw()
 | 
			
		||||
{
 | 
			
		||||
    if(p == 0) return;
 | 
			
		||||
 | 
			
		||||
    int * pm = static_cast<int*>(p);
 | 
			
		||||
    pm -= m;
 | 
			
		||||
 | 
			
		||||
    BOOST_ASSERT(*pm != deleted);           // double delete
 | 
			
		||||
    BOOST_ASSERT(*pm != adopted_scalar);    // delete p.get();
 | 
			
		||||
    BOOST_ASSERT(*pm != allocated_scalar);  // allocated with new
 | 
			
		||||
    BOOST_ASSERT(*pm == allocated_array);   // not allocated with new[]
 | 
			
		||||
 | 
			
		||||
    *pm = deleted;
 | 
			
		||||
 | 
			
		||||
    free(pm);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(__BORLANDC__) || (__BORLANDC__ > 0x551)
 | 
			
		||||
 | 
			
		||||
void operator delete[](void * p, nothrow_t const &) throw()
 | 
			
		||||
{
 | 
			
		||||
    ::operator delete[](p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
@@ -1,82 +0,0 @@
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC)
 | 
			
		||||
#pragma warning(disable: 4786)  // identifier truncated in debug info
 | 
			
		||||
#pragma warning(disable: 4710)  // function not inlined
 | 
			
		||||
#pragma warning(disable: 4711)  // function selected for automatic inline expansion
 | 
			
		||||
#pragma warning(disable: 4514)  // unreferenced inline removed
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  shared_ptr_mt_test.cpp - tests shared_ptr with multiple threads
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright (c) 2008 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/shared_ptr.hpp>
 | 
			
		||||
#include <boost/bind.hpp>
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
#include <ctime>
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/lightweight_thread.hpp>
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
int const n = 1024 * 1024;
 | 
			
		||||
 | 
			
		||||
void test( boost::shared_ptr<int> const & pi )
 | 
			
		||||
{
 | 
			
		||||
    std::vector< boost::shared_ptr<int> > v;
 | 
			
		||||
 | 
			
		||||
    for( int i = 0; i < n; ++i )
 | 
			
		||||
    {
 | 
			
		||||
        v.push_back( pi );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int const m = 16; // threads
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_HAS_PTHREADS )
 | 
			
		||||
 | 
			
		||||
char const * thmodel = "POSIX";
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
char const * thmodel = "Windows";
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
    using namespace std; // printf, clock_t, clock
 | 
			
		||||
 | 
			
		||||
    printf( "Using %s threads: %d threads, %d iterations: ", thmodel, m, n );
 | 
			
		||||
 | 
			
		||||
    boost::shared_ptr<int> pi( new int(42) );
 | 
			
		||||
 | 
			
		||||
    clock_t t = clock();
 | 
			
		||||
 | 
			
		||||
    pthread_t a[ m ];
 | 
			
		||||
 | 
			
		||||
    for( int i = 0; i < m; ++i )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::lw_thread_create( a[ i ], boost::bind( test, pi ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for( int j = 0; j < m; ++j )
 | 
			
		||||
    {
 | 
			
		||||
        pthread_join( a[j], 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    t = clock() - t;
 | 
			
		||||
 | 
			
		||||
    printf( "\n\n%.3f seconds.\n", static_cast<double>(t) / CLOCKS_PER_SEC );
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,46 +0,0 @@
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC)
 | 
			
		||||
#pragma warning(disable: 4786)  // identifier truncated in debug info
 | 
			
		||||
#pragma warning(disable: 4710)  // function not inlined
 | 
			
		||||
#pragma warning(disable: 4711)  // function selected for automatic inline expansion
 | 
			
		||||
#pragma warning(disable: 4514)  // unreferenced inline removed
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  shared_ptr_timing_test.cpp - use to evaluate the impact of thread safety
 | 
			
		||||
//
 | 
			
		||||
//  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)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <ctime>
 | 
			
		||||
 | 
			
		||||
int const n = 8 * 1024 * 1024;
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
    using namespace std;
 | 
			
		||||
 | 
			
		||||
    std::vector< boost::shared_ptr<int> > v;
 | 
			
		||||
    boost::shared_ptr<int> pi(new int);
 | 
			
		||||
 | 
			
		||||
    clock_t t = clock();
 | 
			
		||||
 | 
			
		||||
    for(int i = 0; i < n; ++i)
 | 
			
		||||
    {
 | 
			
		||||
        v.push_back(pi);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    t = clock() - t;
 | 
			
		||||
 | 
			
		||||
    std::cout << static_cast<double>(t) / CLOCKS_PER_SEC << '\n';
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,247 +0,0 @@
 | 
			
		||||
 | 
			
		||||
// Copyright (c) 2008 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
// See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
#include <boost/bind.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/thread/shared_mutex.hpp>
 | 
			
		||||
#include <boost/thread/locks.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/lightweight_mutex.hpp>
 | 
			
		||||
#include <boost/detail/lightweight_thread.hpp>
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <numeric>
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
#include <cstdlib>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
#include <ctime>
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
static void next_value( unsigned & v )
 | 
			
		||||
{
 | 
			
		||||
    v = v % 2? 3 * v + 1: v / 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct X
 | 
			
		||||
{
 | 
			
		||||
    std::vector<unsigned> v_;
 | 
			
		||||
 | 
			
		||||
    explicit X( std::size_t n ): v_( n )
 | 
			
		||||
    {
 | 
			
		||||
        for( std::size_t i = 0; i < n; ++i )
 | 
			
		||||
        {
 | 
			
		||||
            v_[ i ] = i;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    unsigned get() const
 | 
			
		||||
    {
 | 
			
		||||
        return std::accumulate( v_.begin(), v_.end(), 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void set()
 | 
			
		||||
    {
 | 
			
		||||
        std::for_each( v_.begin(), v_.end(), next_value );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static boost::shared_ptr<X> ps;
 | 
			
		||||
 | 
			
		||||
static boost::detail::lightweight_mutex lm;
 | 
			
		||||
static boost::shared_mutex rw;
 | 
			
		||||
 | 
			
		||||
enum prim_type
 | 
			
		||||
{
 | 
			
		||||
    pt_mutex,
 | 
			
		||||
    pt_rwlock,
 | 
			
		||||
    pt_atomics
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int read_access( prim_type pt )
 | 
			
		||||
{
 | 
			
		||||
    switch( pt )
 | 
			
		||||
    {
 | 
			
		||||
    case pt_mutex:
 | 
			
		||||
        {
 | 
			
		||||
            boost::detail::lightweight_mutex::scoped_lock lock( lm );
 | 
			
		||||
            return ps->get();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    case pt_rwlock:
 | 
			
		||||
        {
 | 
			
		||||
            boost::shared_lock<boost::shared_mutex> lock( rw );
 | 
			
		||||
            return ps->get();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    case pt_atomics:
 | 
			
		||||
        {
 | 
			
		||||
            boost::shared_ptr<X> p2 = boost::atomic_load( &ps );
 | 
			
		||||
            return p2->get();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void write_access( prim_type pt )
 | 
			
		||||
{
 | 
			
		||||
    switch( pt )
 | 
			
		||||
    {
 | 
			
		||||
    case pt_mutex:
 | 
			
		||||
        {
 | 
			
		||||
            boost::detail::lightweight_mutex::scoped_lock lock( lm );
 | 
			
		||||
            ps->set();
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case pt_rwlock:
 | 
			
		||||
        {
 | 
			
		||||
            boost::unique_lock<boost::shared_mutex> lock( rw );
 | 
			
		||||
            ps->set();
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case pt_atomics:
 | 
			
		||||
        {
 | 
			
		||||
            boost::shared_ptr<X> p1 = boost::atomic_load( &ps );
 | 
			
		||||
 | 
			
		||||
            for( ;; )
 | 
			
		||||
            {
 | 
			
		||||
                boost::shared_ptr<X> p2( new X( *p1 ) );
 | 
			
		||||
                p2->set();
 | 
			
		||||
 | 
			
		||||
                if( boost::atomic_compare_exchange( &ps, &p1, p2 ) ) break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void worker( int k, prim_type pt, int n, int r )
 | 
			
		||||
{
 | 
			
		||||
    ++r;
 | 
			
		||||
 | 
			
		||||
    unsigned s = 0, nr = 0, nw = 0;
 | 
			
		||||
 | 
			
		||||
    for( int i = 0; i < n; ++i )
 | 
			
		||||
    {
 | 
			
		||||
        if( i % r )
 | 
			
		||||
        {
 | 
			
		||||
            s += read_access( pt );
 | 
			
		||||
            ++nr;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            write_access( pt );
 | 
			
		||||
            ++s;
 | 
			
		||||
            ++nw;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf( "Worker %2d: %u:%u, %10u\n", k, nr, nw, s );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_HAS_PTHREADS )
 | 
			
		||||
  char const * thmodel = "POSIX";
 | 
			
		||||
#else
 | 
			
		||||
  char const * thmodel = "Windows";
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
char const * pt_to_string( prim_type pt )
 | 
			
		||||
{
 | 
			
		||||
    switch( pt )
 | 
			
		||||
    {
 | 
			
		||||
    case pt_mutex:
 | 
			
		||||
 | 
			
		||||
        return "mutex";
 | 
			
		||||
 | 
			
		||||
    case pt_rwlock:
 | 
			
		||||
 | 
			
		||||
        return "rwlock";
 | 
			
		||||
 | 
			
		||||
    case pt_atomics:
 | 
			
		||||
 | 
			
		||||
        return "atomics";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void handle_pt_option( std::string const & opt, prim_type & pt, prim_type pt2 )
 | 
			
		||||
{
 | 
			
		||||
    if( opt == pt_to_string( pt2 ) )
 | 
			
		||||
    {
 | 
			
		||||
        pt = pt2;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void handle_int_option( std::string const & opt, std::string const & prefix, int & k, int kmin, int kmax )
 | 
			
		||||
{
 | 
			
		||||
    if( opt.substr( 0, prefix.size() ) == prefix )
 | 
			
		||||
    {
 | 
			
		||||
        int v = atoi( opt.substr( prefix.size() ).c_str() );
 | 
			
		||||
 | 
			
		||||
        if( v >= kmin && v <= kmax )
 | 
			
		||||
        {
 | 
			
		||||
            k = v;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main( int ac, char const * av[] )
 | 
			
		||||
{
 | 
			
		||||
    using namespace std; // printf, clock_t, clock
 | 
			
		||||
 | 
			
		||||
    int m = 4;          // threads
 | 
			
		||||
    int n = 10000;      // vector size
 | 
			
		||||
    int k = 1000000;    // iterations
 | 
			
		||||
    int r = 100;        // read/write ratio, r:1
 | 
			
		||||
 | 
			
		||||
    prim_type pt = pt_atomics;
 | 
			
		||||
 | 
			
		||||
    for( int i = 1; i < ac; ++i )
 | 
			
		||||
    {
 | 
			
		||||
        handle_pt_option( av[i], pt, pt_mutex );
 | 
			
		||||
        handle_pt_option( av[i], pt, pt_rwlock );
 | 
			
		||||
        handle_pt_option( av[i], pt, pt_atomics );
 | 
			
		||||
 | 
			
		||||
        handle_int_option( av[i], "n=", n, 1, INT_MAX );
 | 
			
		||||
        handle_int_option( av[i], "size=", n, 1, INT_MAX );
 | 
			
		||||
 | 
			
		||||
        handle_int_option( av[i], "k=", k, 1, INT_MAX );
 | 
			
		||||
        handle_int_option( av[i], "iterations=", k, 1, INT_MAX );
 | 
			
		||||
 | 
			
		||||
        handle_int_option( av[i], "m=", m, 1, INT_MAX );
 | 
			
		||||
        handle_int_option( av[i], "threads=", m, 1, INT_MAX );
 | 
			
		||||
 | 
			
		||||
        handle_int_option( av[i], "r=", r, 1, INT_MAX );
 | 
			
		||||
        handle_int_option( av[i], "ratio=", r, 1, INT_MAX );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf( "%s: threads=%d size=%d iterations=%d ratio=%d %s\n\n", thmodel, m, n, k, r, pt_to_string( pt ) );
 | 
			
		||||
 | 
			
		||||
    ps.reset( new X( n ) );
 | 
			
		||||
 | 
			
		||||
    clock_t t = clock();
 | 
			
		||||
 | 
			
		||||
    std::vector<pthread_t> a( m );
 | 
			
		||||
 | 
			
		||||
    for( int i = 0; i < m; ++i )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::lw_thread_create( a[ i ], boost::bind( worker, i, pt, k, r ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for( int j = 0; j < m; ++j )
 | 
			
		||||
    {
 | 
			
		||||
        pthread_join( a[ j ], 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    t = clock() - t;
 | 
			
		||||
 | 
			
		||||
    double ts = static_cast<double>( t ) / CLOCKS_PER_SEC;
 | 
			
		||||
    printf( "%.3f seconds, %.3f accesses per microsecond.\n", ts, m * k / ts / 1e+6 );
 | 
			
		||||
}
 | 
			
		||||
@@ -1,191 +0,0 @@
 | 
			
		||||
 | 
			
		||||
// Copyright (c) 2008 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
 | 
			
		||||
 | 
			
		||||
//#define USE_MUTEX
 | 
			
		||||
//#define USE_RWLOCK
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
#include <boost/bind.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined( USE_RWLOCK )
 | 
			
		||||
#include <boost/thread/shared_mutex.hpp>
 | 
			
		||||
#include <boost/thread/locks.hpp>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/lightweight_mutex.hpp>
 | 
			
		||||
#include <boost/detail/lightweight_test.hpp>
 | 
			
		||||
#include <boost/detail/lightweight_thread.hpp>
 | 
			
		||||
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
#include <ctime>
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
int const n = 1024 * 1024;
 | 
			
		||||
 | 
			
		||||
struct X
 | 
			
		||||
{
 | 
			
		||||
    int v_; // version
 | 
			
		||||
 | 
			
		||||
    unsigned a_;
 | 
			
		||||
    unsigned b_;
 | 
			
		||||
 | 
			
		||||
    X(): v_( 0 ), a_( 1 ), b_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    int get() const
 | 
			
		||||
    {
 | 
			
		||||
        return a_ * 7 + b_ * 11;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void set()
 | 
			
		||||
    {
 | 
			
		||||
        int tmp = get();
 | 
			
		||||
 | 
			
		||||
        b_ = a_;
 | 
			
		||||
        a_ = tmp;
 | 
			
		||||
 | 
			
		||||
        ++v_;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static boost::shared_ptr<X> ps( new X );
 | 
			
		||||
 | 
			
		||||
static boost::detail::lightweight_mutex lm;
 | 
			
		||||
 | 
			
		||||
#if defined( USE_RWLOCK )
 | 
			
		||||
static boost::shared_mutex rw;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static int tr = 0;
 | 
			
		||||
 | 
			
		||||
void reader( int r )
 | 
			
		||||
{
 | 
			
		||||
    int k = 0;
 | 
			
		||||
    unsigned s = 0;
 | 
			
		||||
 | 
			
		||||
    for( int i = 0; i < n; ++k )
 | 
			
		||||
    {
 | 
			
		||||
#if defined( USE_MUTEX )
 | 
			
		||||
 | 
			
		||||
        boost::detail::lightweight_mutex::scoped_lock lock( lm );
 | 
			
		||||
 | 
			
		||||
        s += ps->get();
 | 
			
		||||
 | 
			
		||||
        BOOST_TEST( ps->v_ >= i );
 | 
			
		||||
        i = ps->v_;
 | 
			
		||||
 | 
			
		||||
#elif defined( USE_RWLOCK )
 | 
			
		||||
 | 
			
		||||
        boost::shared_lock<boost::shared_mutex> lock( rw );
 | 
			
		||||
 | 
			
		||||
        s += ps->get();
 | 
			
		||||
 | 
			
		||||
        BOOST_TEST( ps->v_ >= i );
 | 
			
		||||
        i = ps->v_;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        boost::shared_ptr<X> p2 = boost::atomic_load( &ps );
 | 
			
		||||
 | 
			
		||||
        s += p2->get();
 | 
			
		||||
 | 
			
		||||
        BOOST_TEST( p2->v_ >= i );
 | 
			
		||||
        i = p2->v_;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf( "Reader %d: %9d iterations (%6.3fx), %u\n", r, k, (double)k / n, s );
 | 
			
		||||
 | 
			
		||||
    boost::detail::lightweight_mutex::scoped_lock lock( lm );
 | 
			
		||||
    tr += k;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void writer()
 | 
			
		||||
{
 | 
			
		||||
    for( int i = 0; i < n; ++i )
 | 
			
		||||
    {
 | 
			
		||||
#if defined( USE_MUTEX )
 | 
			
		||||
 | 
			
		||||
        boost::detail::lightweight_mutex::scoped_lock lock( lm );
 | 
			
		||||
 | 
			
		||||
        BOOST_TEST( ps->v_ == i );
 | 
			
		||||
        ps->set();
 | 
			
		||||
 | 
			
		||||
#elif defined( USE_RWLOCK )
 | 
			
		||||
 | 
			
		||||
        boost::unique_lock<boost::shared_mutex> lock( rw );
 | 
			
		||||
 | 
			
		||||
        BOOST_TEST( ps->v_ == i );
 | 
			
		||||
        ps->set();
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        boost::shared_ptr<X> p2( new X( *ps ) );
 | 
			
		||||
 | 
			
		||||
        BOOST_TEST( p2->v_ == i );
 | 
			
		||||
        p2->set();
 | 
			
		||||
 | 
			
		||||
        boost::atomic_store( &ps, p2 );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_HAS_PTHREADS )
 | 
			
		||||
  char const * thmodel = "POSIX";
 | 
			
		||||
#else
 | 
			
		||||
  char const * thmodel = "Windows";
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int const mr = 8; // reader threads
 | 
			
		||||
int const mw = 1; // writer thread
 | 
			
		||||
 | 
			
		||||
#if defined( USE_MUTEX )
 | 
			
		||||
  char const * prim = "mutex";
 | 
			
		||||
#elif defined( USE_RWLOCK )
 | 
			
		||||
  char const * prim = "rwlock";
 | 
			
		||||
#else
 | 
			
		||||
  char const * prim = "atomics";
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
    using namespace std; // printf, clock_t, clock
 | 
			
		||||
 | 
			
		||||
    printf( "Using %s threads: %dR + %dW threads, %d iterations, %s\n\n", thmodel, mr, mw, n, prim );
 | 
			
		||||
 | 
			
		||||
    clock_t t = clock();
 | 
			
		||||
 | 
			
		||||
    pthread_t a[ mr+mw ];
 | 
			
		||||
 | 
			
		||||
    for( int i = 0; i < mr; ++i )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::lw_thread_create( a[ i ], boost::bind( reader, i ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for( int i = mr; i < mr+mw; ++i )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::lw_thread_create( a[ i ], writer );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for( int j = 0; j < mr+mw; ++j )
 | 
			
		||||
    {
 | 
			
		||||
        pthread_join( a[ j ], 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    t = clock() - t;
 | 
			
		||||
 | 
			
		||||
    double ts = static_cast<double>( t ) / CLOCKS_PER_SEC;
 | 
			
		||||
    printf( "%.3f seconds, %.3f reads per microsecond.\n", ts, tr / ts / 1e+6 );
 | 
			
		||||
 | 
			
		||||
    return boost::report_errors();
 | 
			
		||||
}
 | 
			
		||||
@@ -1,122 +0,0 @@
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC)
 | 
			
		||||
#pragma warning(disable: 4786)  // identifier truncated in debug info
 | 
			
		||||
#pragma warning(disable: 4710)  // function not inlined
 | 
			
		||||
#pragma warning(disable: 4711)  // function selected for automatic inline expansion
 | 
			
		||||
#pragma warning(disable: 4514)  // unreferenced inline removed
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  weak_ptr_mt_test.cpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2005, 2008 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/shared_ptr.hpp>
 | 
			
		||||
#include <boost/weak_ptr.hpp>
 | 
			
		||||
#include <boost/bind.hpp>
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
#include <ctime>
 | 
			
		||||
#include <cstdlib>
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/lightweight_thread.hpp>
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
int const n = 16384;
 | 
			
		||||
int const k = 512; // vector size
 | 
			
		||||
int const m = 16; // threads
 | 
			
		||||
 | 
			
		||||
void test( std::vector< boost::shared_ptr<int> > & v )
 | 
			
		||||
{
 | 
			
		||||
    using namespace std; // printf, rand
 | 
			
		||||
 | 
			
		||||
    std::vector< boost::weak_ptr<int> > w( v.begin(), v.end() );
 | 
			
		||||
 | 
			
		||||
    int s = 0, f = 0, r = 0;
 | 
			
		||||
 | 
			
		||||
    for( int i = 0; i < n; ++i )
 | 
			
		||||
    {
 | 
			
		||||
        // randomly kill a pointer
 | 
			
		||||
 | 
			
		||||
        v[ rand() % k ].reset();
 | 
			
		||||
        ++s;
 | 
			
		||||
 | 
			
		||||
        for( int j = 0; j < k; ++j )
 | 
			
		||||
        {
 | 
			
		||||
            if( boost::shared_ptr<int> px = w[ j ].lock() )
 | 
			
		||||
            {
 | 
			
		||||
                ++s;
 | 
			
		||||
 | 
			
		||||
                if( rand() & 4 )
 | 
			
		||||
                {
 | 
			
		||||
                    continue;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // rebind anyway with prob. 50% for add_ref_lock() against weak_release() contention
 | 
			
		||||
                ++f;
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                ++r;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            w[ j ] = v[ rand() % k ];
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf( "\n%d locks, %d forced rebinds, %d normal rebinds.", s, f, r );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_HAS_PTHREADS )
 | 
			
		||||
 | 
			
		||||
char const * thmodel = "POSIX";
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
char const * thmodel = "Windows";
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
    using namespace std; // printf, clock_t, clock
 | 
			
		||||
 | 
			
		||||
    printf("Using %s threads: %d threads, %d * %d iterations: ", thmodel, m, n, k );
 | 
			
		||||
 | 
			
		||||
    std::vector< boost::shared_ptr<int> > v( k );
 | 
			
		||||
 | 
			
		||||
    for( int i = 0; i < k; ++i )
 | 
			
		||||
    {
 | 
			
		||||
        v[ i ].reset( new int( 0 ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    clock_t t = clock();
 | 
			
		||||
 | 
			
		||||
    pthread_t a[ m ];
 | 
			
		||||
 | 
			
		||||
    for( int i = 0; i < m; ++i )
 | 
			
		||||
    {
 | 
			
		||||
        boost::detail::lw_thread_create( a[ i ], boost::bind( test, v ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    v.resize( 0 ); // kill original copies
 | 
			
		||||
 | 
			
		||||
    for( int j = 0; j < m; ++j )
 | 
			
		||||
    {
 | 
			
		||||
        pthread_join( a[j], 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    t = clock() - t;
 | 
			
		||||
 | 
			
		||||
    printf("\n\n%.3f seconds.\n", static_cast<double>(t) / CLOCKS_PER_SEC);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,85 +0,0 @@
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_MSVC)
 | 
			
		||||
#pragma warning(disable: 4786)  // identifier truncated in debug info
 | 
			
		||||
#pragma warning(disable: 4710)  // function not inlined
 | 
			
		||||
#pragma warning(disable: 4711)  // function selected for automatic inline expansion
 | 
			
		||||
#pragma warning(disable: 4514)  // unreferenced inline removed
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  weak_ptr_timing_test.cpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2005 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/shared_ptr.hpp>
 | 
			
		||||
#include <boost/weak_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
#include <ctime>
 | 
			
		||||
#include <cstdlib>
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
int const n = 29000;
 | 
			
		||||
int const k = 2048;
 | 
			
		||||
 | 
			
		||||
void test( std::vector< boost::shared_ptr<int> > & v )
 | 
			
		||||
{
 | 
			
		||||
    using namespace std; // printf, rand
 | 
			
		||||
 | 
			
		||||
    std::vector< boost::weak_ptr<int> > w( v.begin(), v.end() );
 | 
			
		||||
 | 
			
		||||
    int s = 0, r = 0;
 | 
			
		||||
 | 
			
		||||
    for( int i = 0; i < n; ++i )
 | 
			
		||||
    {
 | 
			
		||||
        // randomly kill a pointer
 | 
			
		||||
 | 
			
		||||
        v[ rand() % k ].reset();
 | 
			
		||||
 | 
			
		||||
        for( int j = 0; j < k; ++j )
 | 
			
		||||
        {
 | 
			
		||||
            if( boost::shared_ptr<int> px = w[ j ].lock() )
 | 
			
		||||
            {
 | 
			
		||||
                ++s;
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                ++r;
 | 
			
		||||
                w[ j ] = v[ rand() % k ];
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    printf( "\n%d locks, %d rebinds.", s, r );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
    using namespace std; // printf, clock_t, clock
 | 
			
		||||
 | 
			
		||||
    std::vector< boost::shared_ptr<int> > v( k );
 | 
			
		||||
 | 
			
		||||
    for( int i = 0; i < k; ++i )
 | 
			
		||||
    {
 | 
			
		||||
        v[ i ].reset( new int( 0 ) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    clock_t t = clock();
 | 
			
		||||
 | 
			
		||||
    test( v );
 | 
			
		||||
 | 
			
		||||
    t = clock() - t;
 | 
			
		||||
 | 
			
		||||
    printf( "\n\n%.3f seconds.\n", static_cast<double>( t ) / CLOCKS_PER_SEC );
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,21 +0,0 @@
 | 
			
		||||
#ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count.hpp - thread/SMP safe reference counter
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/atomic_count.hpp>
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
 | 
			
		||||
@@ -1,22 +0,0 @@
 | 
			
		||||
#ifndef BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
 | 
			
		||||
#define BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/lightweight_mutex.hpp - lightweight mutex
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/lightweight_mutex.hpp>
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
 | 
			
		||||
@@ -1,135 +0,0 @@
 | 
			
		||||
#ifndef BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED
 | 
			
		||||
#define BOOST_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 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <cerrno>
 | 
			
		||||
 | 
			
		||||
// pthread_create, pthread_join
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_HAS_PTHREADS )
 | 
			
		||||
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#include <windows.h>
 | 
			
		||||
#include <process.h>
 | 
			
		||||
 | 
			
		||||
typedef HANDLE pthread_t;
 | 
			
		||||
 | 
			
		||||
int pthread_create( pthread_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;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int pthread_join( pthread_t thread, void ** /*value_ptr*/ )
 | 
			
		||||
{
 | 
			
		||||
    ::WaitForSingleObject( thread, INFINITE );
 | 
			
		||||
    ::CloseHandle( thread );
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// template<class F> int lw_thread_create( pthread_t & pt, F f );
 | 
			
		||||
 | 
			
		||||
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 )
 | 
			
		||||
{
 | 
			
		||||
    std::auto_ptr<lw_abstract_thread> pt( static_cast<lw_abstract_thread *>( pv ) );
 | 
			
		||||
 | 
			
		||||
    pt->run();
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
unsigned __stdcall lw_thread_routine( void * pv )
 | 
			
		||||
{
 | 
			
		||||
    std::auto_ptr<lw_abstract_thread> pt( static_cast<lw_abstract_thread *>( pv ) );
 | 
			
		||||
 | 
			
		||||
    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( pthread_t & pt, F f )
 | 
			
		||||
{
 | 
			
		||||
    std::auto_ptr<lw_abstract_thread> p( new lw_thread_impl<F>( f ) );
 | 
			
		||||
 | 
			
		||||
    int r = pthread_create( &pt, 0, lw_thread_routine, p.get() );
 | 
			
		||||
 | 
			
		||||
    if( r == 0 )
 | 
			
		||||
    {
 | 
			
		||||
        p.release();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return r;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_THREAD_HPP_INCLUDED
 | 
			
		||||
@@ -1,23 +0,0 @@
 | 
			
		||||
#ifndef BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/quick_allocator.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2003 David Abrahams
 | 
			
		||||
//  Copyright (c) 2003 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/quick_allocator.hpp>
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
 | 
			
		||||
@@ -1,18 +0,0 @@
 | 
			
		||||
#ifndef BOOST_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  enable_shared_from_this.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002 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
 | 
			
		||||
//
 | 
			
		||||
//  http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/enable_shared_from_this.hpp>
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
 | 
			
		||||
@@ -1,18 +0,0 @@
 | 
			
		||||
#ifndef BOOST_INTRUSIVE_PTR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_INTRUSIVE_PTR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  intrusive_ptr.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002 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/intrusive_ptr.html for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/intrusive_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_INTRUSIVE_PTR_HPP_INCLUDED
 | 
			
		||||
@@ -1,17 +0,0 @@
 | 
			
		||||
#ifndef BOOST_MAKE_SHARED_HPP_INCLUDED
 | 
			
		||||
#define BOOST_MAKE_SHARED_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//  make_shared.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2007, 2008 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/make_shared.html
 | 
			
		||||
//  for documentation.
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/make_shared.hpp>
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_MAKE_SHARED_HPP_INCLUDED
 | 
			
		||||
@@ -1,13 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2014 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_MAKE_UNIQUE_HPP_INCLUDED
 | 
			
		||||
#define BOOST_MAKE_UNIQUE_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/make_unique.hpp>
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,121 +0,0 @@
 | 
			
		||||
//////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//
 | 
			
		||||
// (C) Copyright Ion Gaztanaga 2005. 
 | 
			
		||||
// 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)
 | 
			
		||||
//
 | 
			
		||||
//////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_POINTER_CAST_HPP
 | 
			
		||||
#define BOOST_POINTER_CAST_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost { 
 | 
			
		||||
 | 
			
		||||
//static_pointer_cast overload for raw pointers
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
inline T* static_pointer_cast(U *ptr)
 | 
			
		||||
{  
 | 
			
		||||
   return static_cast<T*>(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//dynamic_pointer_cast overload for raw pointers
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
inline T* dynamic_pointer_cast(U *ptr)
 | 
			
		||||
{  
 | 
			
		||||
   return dynamic_cast<T*>(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//const_pointer_cast overload for raw pointers
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
inline T* const_pointer_cast(U *ptr)
 | 
			
		||||
{  
 | 
			
		||||
   return const_cast<T*>(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//reinterpret_pointer_cast overload for raw pointers
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
inline T* reinterpret_pointer_cast(U *ptr)
 | 
			
		||||
{  
 | 
			
		||||
   return reinterpret_cast<T*>(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_SMART_PTR )
 | 
			
		||||
 | 
			
		||||
#include <boost/type_traits/has_virtual_destructor.hpp>
 | 
			
		||||
#include <boost/static_assert.hpp>
 | 
			
		||||
#include <memory>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
//static_pointer_cast overload for std::shared_ptr
 | 
			
		||||
using std::static_pointer_cast;
 | 
			
		||||
 | 
			
		||||
//dynamic_pointer_cast overload for std::shared_ptr
 | 
			
		||||
using std::dynamic_pointer_cast;
 | 
			
		||||
 | 
			
		||||
//const_pointer_cast overload for std::shared_ptr
 | 
			
		||||
using std::const_pointer_cast;
 | 
			
		||||
 | 
			
		||||
//reinterpret_pointer_cast overload for std::shared_ptr
 | 
			
		||||
template<class T, class U> std::shared_ptr<T> reinterpret_pointer_cast(const std::shared_ptr<U> & r ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    (void) reinterpret_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
    typedef typename std::shared_ptr<T>::element_type E;
 | 
			
		||||
 | 
			
		||||
    E * p = reinterpret_cast< E* >( r.get() );
 | 
			
		||||
    return std::shared_ptr<T>( r, p );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//static_pointer_cast overload for std::unique_ptr
 | 
			
		||||
template<class T, class U> std::unique_ptr<T> static_pointer_cast( std::unique_ptr<U> && r ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    (void) static_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
    typedef typename std::unique_ptr<T>::element_type E;
 | 
			
		||||
 | 
			
		||||
    return std::unique_ptr<T>( static_cast<E*>( r.release() ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//dynamic_pointer_cast overload for std::unique_ptr
 | 
			
		||||
template<class T, class U> std::unique_ptr<T> dynamic_pointer_cast( std::unique_ptr<U> && r ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    (void) dynamic_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
    BOOST_STATIC_ASSERT_MSG( boost::has_virtual_destructor<T>::value, "The target of dynamic_pointer_cast must have a virtual destructor." );
 | 
			
		||||
 | 
			
		||||
    T * p = dynamic_cast<T*>( r.get() );
 | 
			
		||||
    if( p ) r.release();
 | 
			
		||||
    return std::unique_ptr<T>( p );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//const_pointer_cast overload for std::unique_ptr
 | 
			
		||||
template<class T, class U> std::unique_ptr<T> const_pointer_cast( std::unique_ptr<U> && r ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    (void) const_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
    typedef typename std::unique_ptr<T>::element_type E;
 | 
			
		||||
 | 
			
		||||
    return std::unique_ptr<T>( const_cast<E*>( r.release() ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//reinterpret_pointer_cast overload for std::unique_ptr
 | 
			
		||||
template<class T, class U> std::unique_ptr<T> reinterpret_pointer_cast( std::unique_ptr<U> && r ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    (void) reinterpret_cast< T* >( static_cast< U* >( 0 ) );
 | 
			
		||||
 | 
			
		||||
    typedef typename std::unique_ptr<T>::element_type E;
 | 
			
		||||
 | 
			
		||||
    return std::unique_ptr<T>( reinterpret_cast<E*>( r.release() ) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #if !defined( BOOST_NO_CXX11_SMART_PTR )
 | 
			
		||||
 | 
			
		||||
#endif   //BOOST_POINTER_CAST_HPP
 | 
			
		||||
@@ -1,55 +0,0 @@
 | 
			
		||||
#ifndef BOOST_POINTER_TO_OTHER_HPP_INCLUDED
 | 
			
		||||
#define BOOST_POINTER_TO_OTHER_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  pointer_to_other.hpp
 | 
			
		||||
//
 | 
			
		||||
//  (C) Copyright Ion Gaztanaga 2005.
 | 
			
		||||
//  Copyright (c) 2005 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/pointer_to_other.html
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
// Defines the same pointer type (raw or smart) to another pointee type
 | 
			
		||||
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
struct pointer_to_other;
 | 
			
		||||
 | 
			
		||||
template<class T, class U, 
 | 
			
		||||
         template<class> class Sp>
 | 
			
		||||
struct pointer_to_other< Sp<T>, U >
 | 
			
		||||
{
 | 
			
		||||
   typedef Sp<U> type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class T2, class U, 
 | 
			
		||||
         template<class, class> class Sp>
 | 
			
		||||
struct pointer_to_other< Sp<T, T2>, U >
 | 
			
		||||
{
 | 
			
		||||
   typedef Sp<U, T2> type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class T2, class T3, class U, 
 | 
			
		||||
         template<class, class, class> class Sp>
 | 
			
		||||
struct pointer_to_other< Sp<T, T2, T3>, U >
 | 
			
		||||
{
 | 
			
		||||
   typedef Sp<U, T2, T3> type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class U>
 | 
			
		||||
struct pointer_to_other< T*, U >
 | 
			
		||||
{
 | 
			
		||||
   typedef U* type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_POINTER_TO_OTHER_HPP_INCLUDED
 | 
			
		||||
@@ -1,16 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SCOPED_ARRAY_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SCOPED_ARRAY_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
 | 
			
		||||
//  Copyright (c) 2001, 2002 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)
 | 
			
		||||
//
 | 
			
		||||
//  http://www.boost.org/libs/smart_ptr/scoped_array.htm
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/scoped_array.hpp>
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SCOPED_ARRAY_HPP_INCLUDED
 | 
			
		||||
@@ -1,16 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SCOPED_PTR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SCOPED_PTR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
 | 
			
		||||
//  Copyright (c) 2001, 2002 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)
 | 
			
		||||
//
 | 
			
		||||
//  http://www.boost.org/libs/smart_ptr/scoped_ptr.htm
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/scoped_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SCOPED_PTR_HPP_INCLUDED
 | 
			
		||||
@@ -1,19 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SHARED_ARRAY_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SHARED_ARRAY_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  shared_array.hpp
 | 
			
		||||
//
 | 
			
		||||
//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
 | 
			
		||||
//  Copyright (c) 2001, 2002 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/shared_array.htm for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/shared_array.hpp>
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SHARED_ARRAY_HPP_INCLUDED
 | 
			
		||||
@@ -1,19 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SHARED_PTR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SHARED_PTR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  shared_ptr.hpp
 | 
			
		||||
//
 | 
			
		||||
//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
 | 
			
		||||
//  Copyright (c) 2001-2008 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/shared_ptr.htm for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/shared_ptr.hpp>
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SHARED_PTR_HPP_INCLUDED
 | 
			
		||||
@@ -1,31 +1,394 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_HPP_INCLUDED
 | 
			
		||||
//  Boost smart_ptr.hpp header file  -----------------------------------------//
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  smart_ptr.hpp
 | 
			
		||||
//
 | 
			
		||||
//  For convenience, this header includes the rest of the smart
 | 
			
		||||
//  pointer library headers.
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2003 Peter Dimov  Distributed under the Boost
 | 
			
		||||
//  Software License, Version 1.0. (See accompanying file
 | 
			
		||||
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  http://www.boost.org/libs/smart_ptr/smart_ptr.htm
 | 
			
		||||
//
 | 
			
		||||
//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. Permission to copy,
 | 
			
		||||
//  use, modify, sell and distribute this software is granted provided this
 | 
			
		||||
//  copyright notice appears in all copies. This software is provided "as is"
 | 
			
		||||
//  without express or implied warranty, and with no claim as to its
 | 
			
		||||
//  suitability for any purpose.
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
//  See http://www.boost.org for most recent version including documentation.
 | 
			
		||||
 | 
			
		||||
#include <boost/scoped_ptr.hpp>
 | 
			
		||||
#include <boost/scoped_array.hpp>
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
#include <boost/shared_array.hpp>
 | 
			
		||||
//  Revision History
 | 
			
		||||
//  21 Jan 01  Suppress some useless warnings with MSVC (David Abrahams)
 | 
			
		||||
//  19 Oct 00  Make shared_ptr ctor from auto_ptr explicit. (Robert Vugts) 
 | 
			
		||||
//  24 Jul 00  Change throw() to // never throws.  See lib guidelines
 | 
			
		||||
//             Exception-specification rationale. (Beman Dawes)
 | 
			
		||||
//  22 Jun 00  Remove #if continuations to fix GCC 2.95.2 problem (Beman Dawes)
 | 
			
		||||
//   1 Feb 00  Additional shared_ptr BOOST_NO_MEMBER_TEMPLATES workarounds
 | 
			
		||||
//             (Dave Abrahams)
 | 
			
		||||
//  31 Dec 99  Condition tightened for no member template friend workaround
 | 
			
		||||
//             (Dave Abrahams)
 | 
			
		||||
//  30 Dec 99  Moved BOOST_NMEMBER_TEMPLATES compatibility code to config.hpp
 | 
			
		||||
//             (Dave Abrahams)
 | 
			
		||||
//  30 Nov 99  added operator ==, operator !=, and std::swap and std::less
 | 
			
		||||
//             specializations for shared types (Darin Adler)
 | 
			
		||||
//  11 Oct 99  replaced op[](int) with op[](std::size_t) (Ed Brey, Valentin
 | 
			
		||||
//             Bonnard), added shared_ptr workaround for no member template
 | 
			
		||||
//             friends (Matthew Langston)
 | 
			
		||||
//  25 Sep 99  added shared_ptr::swap and shared_array::swap (Luis Coelho).
 | 
			
		||||
//  20 Jul 99  changed name to smart_ptr.hpp, #include <boost/config.hpp>,
 | 
			
		||||
//             #include <boost/utility.hpp> and use boost::noncopyable
 | 
			
		||||
//  17 May 99  remove scoped_array and shared_array operator*() as
 | 
			
		||||
//             unnecessary (Beman Dawes)
 | 
			
		||||
//  14 May 99  reorder code so no effects when bad_alloc thrown (Abrahams/Dawes)
 | 
			
		||||
//  13 May 99  remove certain throw() specifiers to avoid generated try/catch
 | 
			
		||||
//             code cost (Beman Dawes)
 | 
			
		||||
//  11 May 99  get() added, conversion to T* placed in macro guard (Valentin
 | 
			
		||||
//             Bonnard, Dave Abrahams, and others argued for elimination
 | 
			
		||||
//             of the automatic conversion)
 | 
			
		||||
//  28 Apr 99  #include <memory> fix (Valentin Bonnard)
 | 
			
		||||
//  28 Apr 99  rename transfer() to share() for clarity (Dave Abrahams)
 | 
			
		||||
//  28 Apr 99  remove unsafe shared_array template conversions(Valentin Bonnard)
 | 
			
		||||
//  28 Apr 99  p(r) changed to p(r.px) for clarity (Dave Abrahams)
 | 
			
		||||
//  21 Apr 99  reset() self assignment fix (Valentin Bonnard)
 | 
			
		||||
//  21 Apr 99  dispose() provided to improve clarity (Valentin Bonnard)
 | 
			
		||||
//  27 Apr 99  leak when new throws fixes (Dave Abrahams)
 | 
			
		||||
//  21 Oct 98  initial Version (Greg Colvin/Beman Dawes)
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_MEMBER_TEMPLATES) || defined(BOOST_MSVC6_MEMBER_TEMPLATES)
 | 
			
		||||
# include <boost/weak_ptr.hpp>
 | 
			
		||||
# include <boost/intrusive_ptr.hpp>
 | 
			
		||||
# include <boost/enable_shared_from_this.hpp>
 | 
			
		||||
# include <boost/make_shared.hpp>
 | 
			
		||||
#ifndef BOOST_SMART_PTR_HPP
 | 
			
		||||
#define BOOST_SMART_PTR_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>   // for broken compiler workarounds
 | 
			
		||||
#include <cstddef>            // for std::size_t
 | 
			
		||||
#include <memory>             // for std::auto_ptr
 | 
			
		||||
#include <algorithm>          // for std::swap
 | 
			
		||||
#include <boost/utility.hpp>  // for boost::noncopyable
 | 
			
		||||
#include <functional>         // for std::less
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
//  scoped_ptr  --------------------------------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  scoped_ptr mimics a built-in pointer except that it guarantees deletion
 | 
			
		||||
//  of the object pointed to, either on destruction of the scoped_ptr or via
 | 
			
		||||
//  an explicit reset().  scoped_ptr is a simple solution for simple needs;
 | 
			
		||||
//  see shared_ptr (below) or std::auto_ptr if your needs are more complex.
 | 
			
		||||
 | 
			
		||||
template<typename T> class scoped_ptr : noncopyable {
 | 
			
		||||
 | 
			
		||||
  T* ptr;
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  typedef T element_type;
 | 
			
		||||
 | 
			
		||||
  explicit scoped_ptr( T* p=0 ) : ptr(p) {}  // never throws
 | 
			
		||||
  ~scoped_ptr()                 { delete ptr; }
 | 
			
		||||
 | 
			
		||||
  void reset( T* p=0 )          { if ( ptr != p ) { delete ptr; ptr = p; } }
 | 
			
		||||
  T& operator*() const          { return *ptr; }  // never throws
 | 
			
		||||
#ifdef BOOST_MSVC
 | 
			
		||||
# pragma warning(push)
 | 
			
		||||
# pragma warning(disable:4284) // return type for 'identifier::operator->' is not a UDT or reference to a UDT. Will produce errors if applied using infix notation
 | 
			
		||||
#endif    
 | 
			
		||||
  T* operator->() const         { return ptr; }  // never throws
 | 
			
		||||
#ifdef BOOST_MSVC
 | 
			
		||||
# pragma warning(pop)
 | 
			
		||||
#endif    
 | 
			
		||||
  T* get() const                { return ptr; }  // never throws
 | 
			
		||||
#ifdef BOOST_SMART_PTR_CONVERSION
 | 
			
		||||
  // get() is safer! Define BOOST_SMART_PTR_CONVERSION at your own risk!
 | 
			
		||||
  operator T*() const           { return ptr; }  // never throws 
 | 
			
		||||
#endif
 | 
			
		||||
  };  // scoped_ptr
 | 
			
		||||
 | 
			
		||||
//  scoped_array  ------------------------------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  scoped_array extends scoped_ptr to arrays. Deletion of the array pointed to
 | 
			
		||||
//  is guaranteed, either on destruction of the scoped_array or via an explicit
 | 
			
		||||
//  reset(). See shared_array or std::vector if your needs are more complex.
 | 
			
		||||
 | 
			
		||||
template<typename T> class scoped_array : noncopyable {
 | 
			
		||||
 | 
			
		||||
  T* ptr;
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
  typedef T element_type;
 | 
			
		||||
 | 
			
		||||
  explicit scoped_array( T* p=0 ) : ptr(p) {}  // never throws
 | 
			
		||||
  ~scoped_array()                    { delete [] ptr; }
 | 
			
		||||
 | 
			
		||||
  void reset( T* p=0 )               { if ( ptr != p ) {delete [] ptr; ptr=p;} }
 | 
			
		||||
 | 
			
		||||
  T* get() const                     { return ptr; }  // never throws
 | 
			
		||||
#ifdef BOOST_SMART_PTR_CONVERSION
 | 
			
		||||
  // get() is safer! Define BOOST_SMART_PTR_CONVERSION at your own risk!
 | 
			
		||||
  operator T*() const                { return ptr; }  // never throws
 | 
			
		||||
#else 
 | 
			
		||||
  T& operator[](std::size_t i) const { return ptr[i]; }  // never throws
 | 
			
		||||
#endif
 | 
			
		||||
  };  // scoped_array
 | 
			
		||||
 | 
			
		||||
//  shared_ptr  --------------------------------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  An enhanced relative of scoped_ptr with reference counted copy semantics.
 | 
			
		||||
//  The object pointed to is deleted when the last shared_ptr pointing to it
 | 
			
		||||
//  is destroyed or reset.
 | 
			
		||||
 | 
			
		||||
template<typename T> class shared_ptr {
 | 
			
		||||
  public:
 | 
			
		||||
   typedef T element_type;
 | 
			
		||||
 | 
			
		||||
   explicit shared_ptr(T* p =0) : px(p) {
 | 
			
		||||
      try { pn = new long(1); }  // fix: prevent leak if new throws
 | 
			
		||||
      catch (...) { delete p; throw; } 
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   shared_ptr(const shared_ptr& r) : px(r.px) { ++*(pn = r.pn); }  // never throws
 | 
			
		||||
 | 
			
		||||
   ~shared_ptr() { dispose(); }
 | 
			
		||||
 | 
			
		||||
   shared_ptr& operator=(const shared_ptr& r) {
 | 
			
		||||
      share(r.px,r.pn);
 | 
			
		||||
      return *this;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_MEMBER_TEMPLATES )
 | 
			
		||||
   template<typename Y>
 | 
			
		||||
      shared_ptr(const shared_ptr<Y>& r) : px(r.px) {  // never throws 
 | 
			
		||||
         ++*(pn = r.pn); 
 | 
			
		||||
      }
 | 
			
		||||
#ifndef BOOST_NO_AUTO_PTR
 | 
			
		||||
   template<typename Y>
 | 
			
		||||
      explicit shared_ptr(std::auto_ptr<Y>& r) { 
 | 
			
		||||
         pn = new long(1); // may throw
 | 
			
		||||
         px = r.release(); // fix: moved here to stop leak if new throws
 | 
			
		||||
      }
 | 
			
		||||
#endif 
 | 
			
		||||
 | 
			
		||||
   template<typename Y>
 | 
			
		||||
      shared_ptr& operator=(const shared_ptr<Y>& r) { 
 | 
			
		||||
         share(r.px,r.pn);
 | 
			
		||||
         return *this;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_AUTO_PTR
 | 
			
		||||
   template<typename Y>
 | 
			
		||||
      shared_ptr& operator=(std::auto_ptr<Y>& r) {
 | 
			
		||||
         // code choice driven by guarantee of "no effect if new throws"
 | 
			
		||||
         if (*pn == 1) { delete px; }
 | 
			
		||||
         else { // allocate new reference counter
 | 
			
		||||
           long * tmp = new long(1); // may throw
 | 
			
		||||
           --*pn; // only decrement once danger of new throwing is past
 | 
			
		||||
           pn = tmp;
 | 
			
		||||
         } // allocate new reference counter
 | 
			
		||||
         px = r.release(); // fix: moved here so doesn't leak if new throws 
 | 
			
		||||
         return *this;
 | 
			
		||||
      }
 | 
			
		||||
#endif
 | 
			
		||||
#else
 | 
			
		||||
#ifndef BOOST_NO_AUTO_PTR
 | 
			
		||||
      explicit shared_ptr(std::auto_ptr<T>& r) { 
 | 
			
		||||
         pn = new long(1); // may throw
 | 
			
		||||
         px = r.release(); // fix: moved here to stop leak if new throws
 | 
			
		||||
      } 
 | 
			
		||||
 | 
			
		||||
      shared_ptr& operator=(std::auto_ptr<T>& r) {
 | 
			
		||||
         // code choice driven by guarantee of "no effect if new throws"
 | 
			
		||||
         if (*pn == 1) { delete px; }
 | 
			
		||||
         else { // allocate new reference counter
 | 
			
		||||
           long * tmp = new long(1); // may throw
 | 
			
		||||
           --*pn; // only decrement once danger of new throwing is past
 | 
			
		||||
           pn = tmp;
 | 
			
		||||
         } // allocate new reference counter
 | 
			
		||||
         px = r.release(); // fix: moved here so doesn't leak if new throws 
 | 
			
		||||
         return *this;
 | 
			
		||||
      }
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_HPP_INCLUDED
 | 
			
		||||
   void reset(T* p=0) {
 | 
			
		||||
      if ( px == p ) return;  // fix: self-assignment safe
 | 
			
		||||
      if (--*pn == 0) { delete px; }
 | 
			
		||||
      else { // allocate new reference counter
 | 
			
		||||
        try { pn = new long; }  // fix: prevent leak if new throws
 | 
			
		||||
        catch (...) {
 | 
			
		||||
          ++*pn;  // undo effect of --*pn above to meet effects guarantee 
 | 
			
		||||
          delete p;
 | 
			
		||||
          throw;
 | 
			
		||||
        } // catch
 | 
			
		||||
      } // allocate new reference counter
 | 
			
		||||
      *pn = 1;
 | 
			
		||||
      px = p;
 | 
			
		||||
   } // reset
 | 
			
		||||
 | 
			
		||||
   T& operator*() const          { return *px; }  // never throws
 | 
			
		||||
#ifdef BOOST_MSVC
 | 
			
		||||
# pragma warning(push)
 | 
			
		||||
# pragma warning(disable:4284) // return type for 'identifier::operator->' is not a UDT or reference to a UDT. Will produce errors if applied using infix notation
 | 
			
		||||
#endif    
 | 
			
		||||
   T* operator->() const         { return px; }  // never throws
 | 
			
		||||
#ifdef BOOST_MSVC
 | 
			
		||||
# pragma warning(pop)
 | 
			
		||||
#endif    
 | 
			
		||||
   T* get() const                { return px; }  // never throws
 | 
			
		||||
 #ifdef BOOST_SMART_PTR_CONVERSION
 | 
			
		||||
   // get() is safer! Define BOOST_SMART_PTR_CONVERSION at your own risk!
 | 
			
		||||
   operator T*() const           { return px; }  // never throws 
 | 
			
		||||
 #endif
 | 
			
		||||
 | 
			
		||||
   long use_count() const        { return *pn; }  // never throws
 | 
			
		||||
   bool unique() const           { return *pn == 1; }  // never throws
 | 
			
		||||
 | 
			
		||||
   void swap(shared_ptr<T>& other)  // never throws
 | 
			
		||||
     { std::swap(px,other.px); std::swap(pn,other.pn); }
 | 
			
		||||
 | 
			
		||||
// Tasteless as this may seem, making all members public allows member templates
 | 
			
		||||
// to work in the absence of member template friends. (Matthew Langston)
 | 
			
		||||
// Don't split this line into two; that causes problems for some GCC 2.95.2 builds
 | 
			
		||||
#if defined(BOOST_NO_MEMBER_TEMPLATES) || !defined( BOOST_NO_MEMBER_TEMPLATE_FRIENDS )
 | 
			
		||||
   private:
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   T*     px;     // contained pointer
 | 
			
		||||
   long*  pn;     // ptr to reference counter
 | 
			
		||||
 | 
			
		||||
// Don't split this line into two; that causes problems for some GCC 2.95.2 builds
 | 
			
		||||
#if !defined( BOOST_NO_MEMBER_TEMPLATES ) && !defined( BOOST_NO_MEMBER_TEMPLATE_FRIENDS )
 | 
			
		||||
   template<typename Y> friend class shared_ptr;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
   void dispose() { if (--*pn == 0) { delete px; delete pn; } }
 | 
			
		||||
 | 
			
		||||
   void share(T* rpx, long* rpn) {
 | 
			
		||||
      if (pn != rpn) { // Q: why not px != rpx? A: fails when both == 0
 | 
			
		||||
         dispose();
 | 
			
		||||
         px = rpx;
 | 
			
		||||
         ++*(pn = rpn);
 | 
			
		||||
      }
 | 
			
		||||
   } // share
 | 
			
		||||
};  // shared_ptr
 | 
			
		||||
 | 
			
		||||
template<typename T, typename U>
 | 
			
		||||
  inline bool operator==(const shared_ptr<T>& a, const shared_ptr<U>& b)
 | 
			
		||||
    { return a.get() == b.get(); }
 | 
			
		||||
 | 
			
		||||
template<typename T, typename U>
 | 
			
		||||
  inline bool operator!=(const shared_ptr<T>& a, const shared_ptr<U>& b)
 | 
			
		||||
    { return a.get() != b.get(); }
 | 
			
		||||
 | 
			
		||||
//  shared_array  ------------------------------------------------------------//
 | 
			
		||||
 | 
			
		||||
//  shared_array extends shared_ptr to arrays.
 | 
			
		||||
//  The array pointed to is deleted when the last shared_array pointing to it
 | 
			
		||||
//  is destroyed or reset.
 | 
			
		||||
 | 
			
		||||
template<typename T> class shared_array {
 | 
			
		||||
  public:
 | 
			
		||||
   typedef T element_type;
 | 
			
		||||
 | 
			
		||||
   explicit shared_array(T* p =0) : px(p) {
 | 
			
		||||
      try { pn = new long(1); }  // fix: prevent leak if new throws
 | 
			
		||||
      catch (...) { delete [] p; throw; } 
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   shared_array(const shared_array& r) : px(r.px)  // never throws
 | 
			
		||||
      { ++*(pn = r.pn); }
 | 
			
		||||
 | 
			
		||||
   ~shared_array() { dispose(); }
 | 
			
		||||
 | 
			
		||||
   shared_array& operator=(const shared_array& r) {
 | 
			
		||||
      if (pn != r.pn) { // Q: why not px != r.px? A: fails when both px == 0
 | 
			
		||||
         dispose();
 | 
			
		||||
         px = r.px;
 | 
			
		||||
         ++*(pn = r.pn);
 | 
			
		||||
      }
 | 
			
		||||
      return *this;
 | 
			
		||||
   } // operator=
 | 
			
		||||
 | 
			
		||||
   void reset(T* p=0) {
 | 
			
		||||
      if ( px == p ) return;  // fix: self-assignment safe
 | 
			
		||||
      if (--*pn == 0) { delete [] px; }
 | 
			
		||||
      else { // allocate new reference counter
 | 
			
		||||
        try { pn = new long; }  // fix: prevent leak if new throws
 | 
			
		||||
        catch (...) {
 | 
			
		||||
          ++*pn;  // undo effect of --*pn above to meet effects guarantee 
 | 
			
		||||
          delete [] p;
 | 
			
		||||
          throw;
 | 
			
		||||
        } // catch
 | 
			
		||||
      } // allocate new reference counter
 | 
			
		||||
      *pn = 1;
 | 
			
		||||
      px = p;
 | 
			
		||||
   } // reset
 | 
			
		||||
 | 
			
		||||
   T* get() const                     { return px; }  // never throws
 | 
			
		||||
 #ifdef BOOST_SMART_PTR_CONVERSION
 | 
			
		||||
   // get() is safer! Define BOOST_SMART_PTR_CONVERSION at your own risk!
 | 
			
		||||
   operator T*() const                { return px; }  // never throws
 | 
			
		||||
 #else 
 | 
			
		||||
   T& operator[](std::size_t i) const { return px[i]; }  // never throws
 | 
			
		||||
 #endif
 | 
			
		||||
 | 
			
		||||
   long use_count() const             { return *pn; }  // never throws
 | 
			
		||||
   bool unique() const                { return *pn == 1; }  // never throws
 | 
			
		||||
 | 
			
		||||
   void swap(shared_array<T>& other)  // never throws
 | 
			
		||||
     { std::swap(px,other.px); std::swap(pn,other.pn); }
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
 | 
			
		||||
   T*     px;     // contained pointer
 | 
			
		||||
   long*  pn;     // ptr to reference counter
 | 
			
		||||
 | 
			
		||||
   void dispose() { if (--*pn == 0) { delete [] px; delete pn; } }
 | 
			
		||||
 | 
			
		||||
};  // shared_array
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
  inline bool operator==(const shared_array<T>& a, const shared_array<T>& b)
 | 
			
		||||
    { return a.get() == b.get(); }
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
  inline bool operator!=(const shared_array<T>& a, const shared_array<T>& b)
 | 
			
		||||
    { return a.get() != b.get(); }
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
//  specializations for things in namespace std  -----------------------------//
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
			
		||||
 | 
			
		||||
namespace std {
 | 
			
		||||
 | 
			
		||||
// Specialize std::swap to use the fast, non-throwing swap that's provided
 | 
			
		||||
// as a member function instead of using the default algorithm which creates
 | 
			
		||||
// a temporary and uses assignment.
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
  inline void swap(boost::shared_ptr<T>& a, boost::shared_ptr<T>& b)
 | 
			
		||||
    { a.swap(b); }
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
  inline void swap(boost::shared_array<T>& a, boost::shared_array<T>& b)
 | 
			
		||||
    { a.swap(b); }
 | 
			
		||||
 | 
			
		||||
// Specialize std::less so we can use shared pointers and arrays as keys in
 | 
			
		||||
// associative collections.
 | 
			
		||||
 | 
			
		||||
// It's still a controversial question whether this is better than supplying
 | 
			
		||||
// a full range of comparison operators (<, >, <=, >=).
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
  struct less< boost::shared_ptr<T> >
 | 
			
		||||
    : binary_function<boost::shared_ptr<T>, boost::shared_ptr<T>, bool>
 | 
			
		||||
  {
 | 
			
		||||
    bool operator()(const boost::shared_ptr<T>& a,
 | 
			
		||||
        const boost::shared_ptr<T>& b) const
 | 
			
		||||
      { return less<T*>()(a.get(),b.get()); }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
  struct less< boost::shared_array<T> >
 | 
			
		||||
    : binary_function<boost::shared_array<T>, boost::shared_array<T>, bool>
 | 
			
		||||
  {
 | 
			
		||||
    bool operator()(const boost::shared_array<T>& a,
 | 
			
		||||
        const boost::shared_array<T>& b) const
 | 
			
		||||
      { return less<T*>()(a.get(),b.get()); }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
} // namespace std
 | 
			
		||||
 | 
			
		||||
#endif  // ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 | 
			
		||||
 | 
			
		||||
#endif  // BOOST_SMART_PTR_HPP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,68 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_BAD_WEAK_PTR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_BAD_WEAK_PTR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/smart_ptr/bad_weak_ptr.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <exception>
 | 
			
		||||
 | 
			
		||||
#ifdef __BORLANDC__
 | 
			
		||||
# pragma warn -8026     // Functions with excep. spec. are not expanded inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
// The standard library that comes with Borland C++ 5.5.1, 5.6.4
 | 
			
		||||
// defines std::exception and its members as having C calling
 | 
			
		||||
// convention (-pc). When the definition of bad_weak_ptr
 | 
			
		||||
// is compiled with -ps, the compiler issues an error.
 | 
			
		||||
// Hence, the temporary #pragma option -pc below.
 | 
			
		||||
 | 
			
		||||
#if defined(__BORLANDC__) && __BORLANDC__ <= 0x564
 | 
			
		||||
# pragma option push -pc
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(__clang__)
 | 
			
		||||
# pragma clang diagnostic push
 | 
			
		||||
# pragma clang diagnostic ignored "-Wweak-vtables"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
class bad_weak_ptr: public std::exception
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    virtual char const * what() const throw()
 | 
			
		||||
    {
 | 
			
		||||
        return "tr1::bad_weak_ptr";
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if defined(__clang__)
 | 
			
		||||
# pragma clang diagnostic pop
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(__BORLANDC__) && __BORLANDC__ <= 0x564
 | 
			
		||||
# pragma option pop
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#ifdef __BORLANDC__
 | 
			
		||||
# pragma warn .8026     // Functions with excep. spec. are not expanded inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_BAD_WEAK_PTR_HPP_INCLUDED
 | 
			
		||||
@@ -1,99 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count.hpp - thread/SMP safe reference counter
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright (c) 2013 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
//  typedef <implementation-defined> boost::detail::atomic_count;
 | 
			
		||||
//
 | 
			
		||||
//  atomic_count a(n);
 | 
			
		||||
//
 | 
			
		||||
//    (n is convertible to long)
 | 
			
		||||
//
 | 
			
		||||
//    Effects: Constructs an atomic_count with an initial value of n
 | 
			
		||||
//
 | 
			
		||||
//  a;
 | 
			
		||||
//
 | 
			
		||||
//    Returns: (long) the current value of a
 | 
			
		||||
//    Memory Ordering: acquire
 | 
			
		||||
//
 | 
			
		||||
//  ++a;
 | 
			
		||||
//
 | 
			
		||||
//    Effects: Atomically increments the value of a
 | 
			
		||||
//    Returns: (long) the new value of a
 | 
			
		||||
//    Memory Ordering: acquire/release
 | 
			
		||||
//
 | 
			
		||||
//  --a;
 | 
			
		||||
//
 | 
			
		||||
//    Effects: Atomically decrements the value of a
 | 
			
		||||
//    Returns: (long) the new value of a
 | 
			
		||||
//    Memory Ordering: acquire/release
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#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>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_AC_USE_STD_ATOMIC )
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_std_atomic.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_AC_USE_SPINLOCK )
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_spin.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_AC_USE_PTHREADS )
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_pt.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_DISABLE_THREADS )
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_nt.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_USE_STD_ATOMIC )
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_std_atomic.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_USE_SPINLOCK )
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_spin.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_USE_PTHREADS )
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_pt.hpp>
 | 
			
		||||
 | 
			
		||||
#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_NO_CXX11_HDR_ATOMIC )
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_std_atomic.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>
 | 
			
		||||
 | 
			
		||||
#elif defined(__GLIBCPP__) || defined(__GLIBCXX__)
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_gcc.hpp>
 | 
			
		||||
 | 
			
		||||
#elif !defined( BOOST_HAS_THREADS )
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_nt.hpp>
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
# include <boost/smart_ptr/detail/atomic_count_spin.hpp>
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
 | 
			
		||||
@@ -1,72 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count_gcc.hpp
 | 
			
		||||
//
 | 
			
		||||
//  atomic_count for GNU libstdc++ v3
 | 
			
		||||
//
 | 
			
		||||
//  http://gcc.gnu.org/onlinedocs/porting/Thread-safety.html
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright (c) 2002 Lars Gullik Bj<42>nnes <larsbj@lyx.org>
 | 
			
		||||
//  Copyright 2003-2005 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#if __GNUC__ * 100 + __GNUC_MINOR__ >= 402
 | 
			
		||||
# include <ext/atomicity.h> 
 | 
			
		||||
#else 
 | 
			
		||||
# include <bits/atomicity.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined(__GLIBCXX__) // g++ 3.4+
 | 
			
		||||
 | 
			
		||||
using __gnu_cxx::__atomic_add;
 | 
			
		||||
using __gnu_cxx::__exchange_and_add;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
class atomic_count
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count( long v ) : value_( v ) {}
 | 
			
		||||
 | 
			
		||||
    long operator++()
 | 
			
		||||
    {
 | 
			
		||||
        return __exchange_and_add( &value_, +1 ) + 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator--()
 | 
			
		||||
    {
 | 
			
		||||
        return __exchange_and_add( &value_, -1 ) - 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator long() const
 | 
			
		||||
    {
 | 
			
		||||
        return __exchange_and_add( &value_, 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    atomic_count(atomic_count const &);
 | 
			
		||||
    atomic_count & operator=(atomic_count const &);
 | 
			
		||||
 | 
			
		||||
    mutable _Atomic_word value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_HPP_INCLUDED
 | 
			
		||||
@@ -1,77 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_X86_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_X86_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count_gcc_x86.hpp
 | 
			
		||||
//
 | 
			
		||||
//  atomic_count for g++ on 486+/AMD64
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2007 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)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class atomic_count
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count( long v ) : value_( static_cast< int >( v ) ) {}
 | 
			
		||||
 | 
			
		||||
    long operator++()
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_exchange_and_add( &value_, +1 ) + 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator--()
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_exchange_and_add( &value_, -1 ) - 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator long() const
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_exchange_and_add( &value_, 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    atomic_count(atomic_count const &);
 | 
			
		||||
    atomic_count & operator=(atomic_count const &);
 | 
			
		||||
 | 
			
		||||
    mutable int value_;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    static int atomic_exchange_and_add( int * pw, int dv )
 | 
			
		||||
    {
 | 
			
		||||
        // int r = *pw;
 | 
			
		||||
        // *pw += dv;
 | 
			
		||||
        // return r;
 | 
			
		||||
 | 
			
		||||
        int r;
 | 
			
		||||
 | 
			
		||||
        __asm__ __volatile__
 | 
			
		||||
        (
 | 
			
		||||
            "lock\n\t"
 | 
			
		||||
            "xadd %1, %0":
 | 
			
		||||
            "+m"( *pw ), "=r"( r ): // outputs (%0, %1)
 | 
			
		||||
            "1"( dv ): // inputs (%2 == %1)
 | 
			
		||||
            "memory", "cc" // clobbers
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        return r;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_X86_HPP_INCLUDED
 | 
			
		||||
@@ -1,59 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_NT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_NT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count_nt.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Trivial atomic_count for the single-threaded case
 | 
			
		||||
//
 | 
			
		||||
//  http://gcc.gnu.org/onlinedocs/porting/Thread-safety.html
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2013 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class atomic_count
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count( long v ): value_( v )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator++()
 | 
			
		||||
    {
 | 
			
		||||
        return ++value_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator--()
 | 
			
		||||
    {
 | 
			
		||||
        return --value_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator long() const
 | 
			
		||||
    {
 | 
			
		||||
        return value_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    atomic_count(atomic_count const &);
 | 
			
		||||
    atomic_count & operator=(atomic_count const &);
 | 
			
		||||
 | 
			
		||||
    long value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_NT_HPP_INCLUDED
 | 
			
		||||
@@ -1,97 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count_pthreads.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  The generic pthread_mutex-based implementation sometimes leads to
 | 
			
		||||
//    inefficiencies. Example: a class with two atomic_count members
 | 
			
		||||
//    can get away with a single mutex.
 | 
			
		||||
//
 | 
			
		||||
//  Users can detect this situation by checking BOOST_AC_USE_PTHREADS.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class atomic_count
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    class scoped_lock
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        scoped_lock(pthread_mutex_t & m): m_(m)
 | 
			
		||||
        {
 | 
			
		||||
            BOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ~scoped_lock()
 | 
			
		||||
        {
 | 
			
		||||
            BOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    private:
 | 
			
		||||
 | 
			
		||||
        pthread_mutex_t & m_;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count(long v): value_(v)
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_init( &mutex_, 0 ) == 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~atomic_count()
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_destroy( &mutex_ ) == 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator++()
 | 
			
		||||
    {
 | 
			
		||||
        scoped_lock lock(mutex_);
 | 
			
		||||
        return ++value_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator--()
 | 
			
		||||
    {
 | 
			
		||||
        scoped_lock lock(mutex_);
 | 
			
		||||
        return --value_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator long() const
 | 
			
		||||
    {
 | 
			
		||||
        scoped_lock lock(mutex_);
 | 
			
		||||
        return value_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    atomic_count(atomic_count const &);
 | 
			
		||||
    atomic_count & operator=(atomic_count const &);
 | 
			
		||||
 | 
			
		||||
    mutable pthread_mutex_t mutex_;
 | 
			
		||||
    long value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -1,62 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SPIN_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SPIN_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count_spin.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2013 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/spinlock_pool.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class atomic_count
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count( long v ): value_( v )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator++()
 | 
			
		||||
    {
 | 
			
		||||
        spinlock_pool<0>::scoped_lock lock( &value_ );
 | 
			
		||||
        return ++value_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator--()
 | 
			
		||||
    {
 | 
			
		||||
        spinlock_pool<0>::scoped_lock lock( &value_ );
 | 
			
		||||
        return --value_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator long() const
 | 
			
		||||
    {
 | 
			
		||||
        spinlock_pool<0>::scoped_lock lock( &value_ );
 | 
			
		||||
        return value_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    atomic_count(atomic_count const &);
 | 
			
		||||
    atomic_count & operator=(atomic_count const &);
 | 
			
		||||
 | 
			
		||||
    long value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SPIN_HPP_INCLUDED
 | 
			
		||||
@@ -1,60 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_STD_ATOMIC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_STD_ATOMIC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count_std_atomic.hpp
 | 
			
		||||
//
 | 
			
		||||
//  atomic_count for std::atomic
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2013 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <atomic>
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class atomic_count
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count( long v ): value_( v )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator++()
 | 
			
		||||
    {
 | 
			
		||||
        return value_.fetch_add( 1, std::memory_order_acq_rel ) + 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator--()
 | 
			
		||||
    {
 | 
			
		||||
        return value_.fetch_sub( 1, std::memory_order_acq_rel ) - 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator long() const
 | 
			
		||||
    {
 | 
			
		||||
        return value_.load( std::memory_order_acquire );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    atomic_count(atomic_count const &);
 | 
			
		||||
    atomic_count & operator=(atomic_count const &);
 | 
			
		||||
 | 
			
		||||
    std::atomic_int_least32_t value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_STD_ATOMIC_HPP_INCLUDED
 | 
			
		||||
@@ -1,61 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SYNC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SYNC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count_sync.hpp
 | 
			
		||||
//
 | 
			
		||||
//  atomic_count for g++ 4.1+
 | 
			
		||||
//
 | 
			
		||||
//  http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2007 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#if defined( __ia64__ ) && defined( __INTEL_COMPILER )
 | 
			
		||||
# include <ia64intrin.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class atomic_count
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count( long v ) : value_( v ) {}
 | 
			
		||||
 | 
			
		||||
    long operator++()
 | 
			
		||||
    {
 | 
			
		||||
        return __sync_add_and_fetch( &value_, 1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator--()
 | 
			
		||||
    {
 | 
			
		||||
        return __sync_add_and_fetch( &value_, -1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator long() const
 | 
			
		||||
    {
 | 
			
		||||
        return __sync_fetch_and_add( &value_, 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    atomic_count(atomic_count const &);
 | 
			
		||||
    atomic_count & operator=(atomic_count const &);
 | 
			
		||||
 | 
			
		||||
    mutable long value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SYNC_HPP_INCLUDED
 | 
			
		||||
@@ -1,63 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_WIN32_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_WIN32_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/atomic_count_win32.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001-2005 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_interlocked.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class atomic_count
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit atomic_count( long v ): value_( v )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator++()
 | 
			
		||||
    {
 | 
			
		||||
        return BOOST_SP_INTERLOCKED_INCREMENT( &value_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long operator--()
 | 
			
		||||
    {
 | 
			
		||||
        return BOOST_SP_INTERLOCKED_DECREMENT( &value_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator long() const
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<long const volatile &>( value_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    atomic_count( atomic_count const & );
 | 
			
		||||
    atomic_count & operator=( atomic_count const & );
 | 
			
		||||
 | 
			
		||||
    long value_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_WIN32_HPP_INCLUDED
 | 
			
		||||
@@ -1,42 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/lightweight_mutex.hpp - lightweight mutex
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  typedef <unspecified> boost::detail::lightweight_mutex;
 | 
			
		||||
//
 | 
			
		||||
//  boost::detail::lightweight_mutex is a header-only implementation of
 | 
			
		||||
//  a subset of the Mutex concept requirements:
 | 
			
		||||
//
 | 
			
		||||
//  http://www.boost.org/doc/html/threads/concepts.html#threads.concepts.Mutex
 | 
			
		||||
//
 | 
			
		||||
//  It maps to a CRITICAL_SECTION on Windows or a pthread_mutex on POSIX.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#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__)
 | 
			
		||||
#  include <boost/smart_ptr/detail/lwm_win32_cs.hpp>
 | 
			
		||||
#else
 | 
			
		||||
// Use #define BOOST_DISABLE_THREADS to avoid the error
 | 
			
		||||
#  error Unrecognized threading platform
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -1,87 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/lwm_pthreads.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)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class lightweight_mutex
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    pthread_mutex_t m_;
 | 
			
		||||
 | 
			
		||||
    lightweight_mutex(lightweight_mutex const &);
 | 
			
		||||
    lightweight_mutex & operator=(lightweight_mutex const &);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    lightweight_mutex()
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
// HPUX 10.20 / DCE has a nonstandard pthread_mutex_init
 | 
			
		||||
 | 
			
		||||
#if defined(__hpux) && defined(_DECTHREADS_)
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_init( &m_, pthread_mutexattr_default ) == 0 );
 | 
			
		||||
#else
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_init( &m_, 0 ) == 0 );
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~lightweight_mutex()
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_destroy( &m_ ) == 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class scoped_lock;
 | 
			
		||||
    friend class scoped_lock;
 | 
			
		||||
 | 
			
		||||
    class scoped_lock
 | 
			
		||||
    {
 | 
			
		||||
    private:
 | 
			
		||||
 | 
			
		||||
        pthread_mutex_t & m_;
 | 
			
		||||
 | 
			
		||||
        scoped_lock(scoped_lock const &);
 | 
			
		||||
        scoped_lock & operator=(scoped_lock const &);
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        scoped_lock(lightweight_mutex & m): m_(m.m_)
 | 
			
		||||
        {
 | 
			
		||||
            BOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ~scoped_lock()
 | 
			
		||||
        {
 | 
			
		||||
            BOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 );
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED
 | 
			
		||||
@@ -1,119 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_LWM_WIN32_CS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_LWM_WIN32_CS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  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>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_USE_WINDOWS_H
 | 
			
		||||
 | 
			
		||||
struct critical_section
 | 
			
		||||
{
 | 
			
		||||
    struct critical_section_debug * DebugInfo;
 | 
			
		||||
    long LockCount;
 | 
			
		||||
    long RecursionCount;
 | 
			
		||||
    void * OwningThread;
 | 
			
		||||
    void * LockSemaphore;
 | 
			
		||||
#if defined(_WIN64)
 | 
			
		||||
    unsigned __int64 SpinCount;
 | 
			
		||||
#else
 | 
			
		||||
    unsigned long SpinCount;
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if BOOST_PLAT_WINDOWS_RUNTIME
 | 
			
		||||
extern "C" __declspec(dllimport) void __stdcall InitializeCriticalSectionEx(critical_section *, unsigned long, unsigned long);
 | 
			
		||||
#else
 | 
			
		||||
extern "C" __declspec(dllimport) void __stdcall InitializeCriticalSection(critical_section *);
 | 
			
		||||
#endif
 | 
			
		||||
extern "C" __declspec(dllimport) void __stdcall EnterCriticalSection(critical_section *);
 | 
			
		||||
extern "C" __declspec(dllimport) void __stdcall LeaveCriticalSection(critical_section *);
 | 
			
		||||
extern "C" __declspec(dllimport) void __stdcall DeleteCriticalSection(critical_section *);
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
typedef ::CRITICAL_SECTION critical_section;
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_USE_WINDOWS_H
 | 
			
		||||
 | 
			
		||||
class lightweight_mutex
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    critical_section cs_;
 | 
			
		||||
 | 
			
		||||
    lightweight_mutex(lightweight_mutex const &);
 | 
			
		||||
    lightweight_mutex & operator=(lightweight_mutex const &);
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    lightweight_mutex()
 | 
			
		||||
    {
 | 
			
		||||
#if BOOST_PLAT_WINDOWS_RUNTIME
 | 
			
		||||
        InitializeCriticalSectionEx(&cs_, 4000, 0);
 | 
			
		||||
#else
 | 
			
		||||
        InitializeCriticalSection(&cs_);
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~lightweight_mutex()
 | 
			
		||||
    {
 | 
			
		||||
        DeleteCriticalSection(&cs_);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class scoped_lock;
 | 
			
		||||
    friend class scoped_lock;
 | 
			
		||||
 | 
			
		||||
    class scoped_lock
 | 
			
		||||
    {
 | 
			
		||||
    private:
 | 
			
		||||
 | 
			
		||||
        lightweight_mutex & m_;
 | 
			
		||||
 | 
			
		||||
        scoped_lock(scoped_lock const &);
 | 
			
		||||
        scoped_lock & operator=(scoped_lock const &);
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        explicit scoped_lock(lightweight_mutex & m): m_(m)
 | 
			
		||||
        {
 | 
			
		||||
            EnterCriticalSection(&m_.cs_);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ~scoped_lock()
 | 
			
		||||
        {
 | 
			
		||||
            LeaveCriticalSection(&m_.cs_);
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_LWM_WIN32_CS_HPP_INCLUDED
 | 
			
		||||
@@ -1,64 +0,0 @@
 | 
			
		||||
//  This header intentionally has no include guards.
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001-2009, 2012 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS ) && !defined( BOOST_NO_CXX11_NULLPTR )\
 | 
			
		||||
    && !(defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x5130))
 | 
			
		||||
 | 
			
		||||
    explicit operator bool () const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#elif ( defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, < 0x570) ) || defined(__CINT__)
 | 
			
		||||
 | 
			
		||||
    operator bool () const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#elif defined( _MANAGED )
 | 
			
		||||
 | 
			
		||||
    static void unspecified_bool( this_type*** )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    typedef void (*unspecified_bool_type)( this_type*** );
 | 
			
		||||
 | 
			
		||||
    operator unspecified_bool_type() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px == 0? 0: unspecified_bool;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#elif \
 | 
			
		||||
    ( defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, < 0x3200) ) || \
 | 
			
		||||
    ( defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ < 304) ) || \
 | 
			
		||||
    ( defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x590) )
 | 
			
		||||
 | 
			
		||||
    typedef element_type * (this_type::*unspecified_bool_type)() const;
 | 
			
		||||
 | 
			
		||||
    operator unspecified_bool_type() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px == 0? 0: &this_type::get;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    typedef element_type * this_type::*unspecified_bool_type;
 | 
			
		||||
 | 
			
		||||
    operator unspecified_bool_type() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px == 0? 0: &this_type::px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // operator! is redundant, but some compilers need it
 | 
			
		||||
    bool operator! () const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px == 0;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1,199 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/quick_allocator.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2003 David Abrahams
 | 
			
		||||
//  Copyright (c) 2003 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/lightweight_mutex.hpp>
 | 
			
		||||
#include <boost/type_traits/type_with_alignment.hpp>
 | 
			
		||||
#include <boost/type_traits/alignment_of.hpp>
 | 
			
		||||
 | 
			
		||||
#include <new>              // ::operator new, ::operator delete
 | 
			
		||||
#include <cstddef>          // std::size_t
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<unsigned size, unsigned align_> union freeblock
 | 
			
		||||
{
 | 
			
		||||
    typedef typename boost::type_with_alignment<align_>::type aligner_type;
 | 
			
		||||
    aligner_type aligner;
 | 
			
		||||
    char bytes[size];
 | 
			
		||||
    freeblock * next;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<unsigned size, unsigned align_> struct allocator_impl
 | 
			
		||||
{
 | 
			
		||||
    typedef freeblock<size, align_> block;
 | 
			
		||||
 | 
			
		||||
    // It may seem odd to use such small pages.
 | 
			
		||||
    //
 | 
			
		||||
    // However, on a typical Windows implementation that uses
 | 
			
		||||
    // the OS allocator, "normal size" pages interact with the
 | 
			
		||||
    // "ordinary" operator new, slowing it down dramatically.
 | 
			
		||||
    //
 | 
			
		||||
    // 512 byte pages are handled by the small object allocator,
 | 
			
		||||
    // and don't interfere with ::new.
 | 
			
		||||
    //
 | 
			
		||||
    // The other alternative is to use much bigger pages (1M.)
 | 
			
		||||
    //
 | 
			
		||||
    // It is surprisingly easy to hit pathological behavior by
 | 
			
		||||
    // varying the page size. g++ 2.96 on Red Hat Linux 7.2,
 | 
			
		||||
    // for example, passionately dislikes 496. 512 seems OK.
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_QA_PAGE_SIZE)
 | 
			
		||||
 | 
			
		||||
    enum { items_per_page = BOOST_QA_PAGE_SIZE / size };
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    enum { items_per_page = 512 / size }; // 1048560 / size
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_HAS_THREADS
 | 
			
		||||
 | 
			
		||||
    static lightweight_mutex & mutex()
 | 
			
		||||
    {
 | 
			
		||||
        static freeblock< sizeof( lightweight_mutex ), boost::alignment_of< lightweight_mutex >::value > fbm;
 | 
			
		||||
        static lightweight_mutex * pm = new( &fbm ) lightweight_mutex;
 | 
			
		||||
        return *pm;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static lightweight_mutex * mutex_init;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    static block * free;
 | 
			
		||||
    static block * page;
 | 
			
		||||
    static unsigned last;
 | 
			
		||||
 | 
			
		||||
    static inline void * alloc()
 | 
			
		||||
    {
 | 
			
		||||
#ifdef BOOST_HAS_THREADS
 | 
			
		||||
        lightweight_mutex::scoped_lock lock( mutex() );
 | 
			
		||||
#endif
 | 
			
		||||
        if(block * x = free)
 | 
			
		||||
        {
 | 
			
		||||
            free = x->next;
 | 
			
		||||
            return x;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            if(last == items_per_page)
 | 
			
		||||
            {
 | 
			
		||||
                // "Listen to me carefully: there is no memory leak"
 | 
			
		||||
                // -- Scott Meyers, Eff C++ 2nd Ed Item 10
 | 
			
		||||
                page = ::new block[items_per_page];
 | 
			
		||||
                last = 0;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return &page[last++];
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static inline void * alloc(std::size_t n)
 | 
			
		||||
    {
 | 
			
		||||
        if(n != size) // class-specific new called for a derived object
 | 
			
		||||
        {
 | 
			
		||||
            return ::operator new(n);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
#ifdef BOOST_HAS_THREADS
 | 
			
		||||
            lightweight_mutex::scoped_lock lock( mutex() );
 | 
			
		||||
#endif
 | 
			
		||||
            if(block * x = free)
 | 
			
		||||
            {
 | 
			
		||||
                free = x->next;
 | 
			
		||||
                return x;
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                if(last == items_per_page)
 | 
			
		||||
                {
 | 
			
		||||
                    page = ::new block[items_per_page];
 | 
			
		||||
                    last = 0;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                return &page[last++];
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static inline void dealloc(void * pv)
 | 
			
		||||
    {
 | 
			
		||||
        if(pv != 0) // 18.4.1.1/13
 | 
			
		||||
        {
 | 
			
		||||
#ifdef BOOST_HAS_THREADS
 | 
			
		||||
            lightweight_mutex::scoped_lock lock( mutex() );
 | 
			
		||||
#endif
 | 
			
		||||
            block * pb = static_cast<block *>(pv);
 | 
			
		||||
            pb->next = free;
 | 
			
		||||
            free = pb;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static inline void dealloc(void * pv, std::size_t n)
 | 
			
		||||
    {
 | 
			
		||||
        if(n != size) // class-specific delete called for a derived object
 | 
			
		||||
        {
 | 
			
		||||
            ::operator delete(pv);
 | 
			
		||||
        }
 | 
			
		||||
        else if(pv != 0) // 18.4.1.1/13
 | 
			
		||||
        {
 | 
			
		||||
#ifdef BOOST_HAS_THREADS
 | 
			
		||||
            lightweight_mutex::scoped_lock lock( mutex() );
 | 
			
		||||
#endif
 | 
			
		||||
            block * pb = static_cast<block *>(pv);
 | 
			
		||||
            pb->next = free;
 | 
			
		||||
            free = pb;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_HAS_THREADS
 | 
			
		||||
 | 
			
		||||
template<unsigned size, unsigned align_>
 | 
			
		||||
  lightweight_mutex * allocator_impl<size, align_>::mutex_init = &allocator_impl<size, align_>::mutex();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<unsigned size, unsigned align_>
 | 
			
		||||
  freeblock<size, align_> * allocator_impl<size, align_>::free = 0;
 | 
			
		||||
 | 
			
		||||
template<unsigned size, unsigned align_>
 | 
			
		||||
  freeblock<size, align_> * allocator_impl<size, align_>::page = 0;
 | 
			
		||||
 | 
			
		||||
template<unsigned size, unsigned align_>
 | 
			
		||||
  unsigned allocator_impl<size, align_>::last = allocator_impl<size, align_>::items_per_page;
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct quick_allocator: public allocator_impl< sizeof(T), boost::alignment_of<T>::value >
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
 | 
			
		||||
@@ -1,655 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SHARED_COUNT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SHARED_COUNT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/shared_count.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 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)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#ifdef __BORLANDC__
 | 
			
		||||
# 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/detail/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
 | 
			
		||||
 | 
			
		||||
#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"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace movelib
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    template< class T, class D > class unique_ptr;
 | 
			
		||||
 | 
			
		||||
} // namespace movelib
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
 | 
			
		||||
int const shared_count_id = 0x2C35F101;
 | 
			
		||||
int const   weak_count_id = 0x298C38A4;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct sp_nothrow_tag {};
 | 
			
		||||
 | 
			
		||||
template< class D > struct sp_inplace_tag
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class T > class sp_reference_wrapper
 | 
			
		||||
{ 
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit sp_reference_wrapper( T & t): t_( boost::addressof( t ) )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template< class Y > void operator()( Y * p ) const
 | 
			
		||||
    {
 | 
			
		||||
        (*t_)( p );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    T * t_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class D > struct sp_convert_reference
 | 
			
		||||
{
 | 
			
		||||
    typedef D type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class D > struct sp_convert_reference< D& >
 | 
			
		||||
{
 | 
			
		||||
    typedef sp_reference_wrapper< D > type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class weak_count;
 | 
			
		||||
 | 
			
		||||
class shared_count
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base * pi_;
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
    int id_;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    friend class weak_count;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    shared_count(): pi_(0) // nothrow
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class Y> explicit shared_count( Y * p ): pi_( 0 )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
#ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            pi_ = new sp_counted_impl_p<Y>( p );
 | 
			
		||||
        }
 | 
			
		||||
        catch(...)
 | 
			
		||||
        {
 | 
			
		||||
            boost::checked_delete( p );
 | 
			
		||||
            throw;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        pi_ = new sp_counted_impl_p<Y>( p );
 | 
			
		||||
 | 
			
		||||
        if( pi_ == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            boost::checked_delete( p );
 | 
			
		||||
            boost::throw_exception( std::bad_alloc() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1200 )
 | 
			
		||||
    template<class Y, class D> shared_count( Y * p, D d ): pi_(0)
 | 
			
		||||
#else
 | 
			
		||||
    template<class P, class D> shared_count( P p, D d ): pi_(0)
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1200 )
 | 
			
		||||
        typedef Y* P;
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            pi_ = new sp_counted_impl_pd<P, D>(p, d);
 | 
			
		||||
        }
 | 
			
		||||
        catch(...)
 | 
			
		||||
        {
 | 
			
		||||
            d(p); // delete p
 | 
			
		||||
            throw;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        pi_ = new sp_counted_impl_pd<P, D>(p, d);
 | 
			
		||||
 | 
			
		||||
        if(pi_ == 0)
 | 
			
		||||
        {
 | 
			
		||||
            d(p); // delete p
 | 
			
		||||
            boost::throw_exception(std::bad_alloc());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
			
		||||
 | 
			
		||||
    template< class P, class D > shared_count( P p, sp_inplace_tag<D> ): pi_( 0 )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
#ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            pi_ = new sp_counted_impl_pd< P, D >( p );
 | 
			
		||||
        }
 | 
			
		||||
        catch( ... )
 | 
			
		||||
        {
 | 
			
		||||
            D::operator_fn( p ); // delete p
 | 
			
		||||
            throw;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        pi_ = new sp_counted_impl_pd< P, D >( p );
 | 
			
		||||
 | 
			
		||||
        if( pi_ == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            D::operator_fn( p ); // delete p
 | 
			
		||||
            boost::throw_exception( std::bad_alloc() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
			
		||||
 | 
			
		||||
    template<class P, class D, class A> shared_count( P p, D d, A a ): pi_( 0 )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        typedef sp_counted_impl_pda<P, D, A> impl_type;
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
 | 
			
		||||
 | 
			
		||||
        typedef typename std::allocator_traits<A>::template rebind_alloc< impl_type > A2;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        typedef typename A::template rebind< impl_type >::other A2;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        A2 a2( a );
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            pi_ = a2.allocate( 1 );
 | 
			
		||||
            ::new( static_cast< void* >( pi_ ) ) impl_type( p, d, a );
 | 
			
		||||
        }
 | 
			
		||||
        catch(...)
 | 
			
		||||
        {
 | 
			
		||||
            d( p );
 | 
			
		||||
 | 
			
		||||
            if( pi_ != 0 )
 | 
			
		||||
            {
 | 
			
		||||
                a2.deallocate( static_cast< impl_type* >( pi_ ), 1 );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            throw;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        pi_ = a2.allocate( 1 );
 | 
			
		||||
 | 
			
		||||
        if( pi_ != 0 )
 | 
			
		||||
        {
 | 
			
		||||
            ::new( static_cast< void* >( pi_ ) ) impl_type( p, d, a );
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            d( p );
 | 
			
		||||
            boost::throw_exception( std::bad_alloc() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
			
		||||
 | 
			
		||||
    template< class P, class D, class A > shared_count( P p, sp_inplace_tag< D >, A a ): pi_( 0 )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        typedef sp_counted_impl_pda< P, D, A > impl_type;
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
 | 
			
		||||
 | 
			
		||||
        typedef typename std::allocator_traits<A>::template rebind_alloc< impl_type > A2;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        typedef typename A::template rebind< impl_type >::other A2;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        A2 a2( a );
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        try
 | 
			
		||||
        {
 | 
			
		||||
            pi_ = a2.allocate( 1 );
 | 
			
		||||
            ::new( static_cast< void* >( pi_ ) ) impl_type( p, a );
 | 
			
		||||
        }
 | 
			
		||||
        catch(...)
 | 
			
		||||
        {
 | 
			
		||||
            D::operator_fn( p );
 | 
			
		||||
 | 
			
		||||
            if( pi_ != 0 )
 | 
			
		||||
            {
 | 
			
		||||
                a2.deallocate( static_cast< impl_type* >( pi_ ), 1 );
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            throw;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        pi_ = a2.allocate( 1 );
 | 
			
		||||
 | 
			
		||||
        if( pi_ != 0 )
 | 
			
		||||
        {
 | 
			
		||||
            ::new( static_cast< void* >( pi_ ) ) impl_type( p, a );
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            D::operator_fn( p );
 | 
			
		||||
            boost::throw_exception( std::bad_alloc() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_NO_EXCEPTIONS
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_NO_AUTO_PTR
 | 
			
		||||
 | 
			
		||||
    // auto_ptr<Y> is special cased to provide the strong guarantee
 | 
			
		||||
 | 
			
		||||
    template<class Y>
 | 
			
		||||
    explicit shared_count( std::auto_ptr<Y> & r ): pi_( new sp_counted_impl_p<Y>( r.get() ) )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
#ifdef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        if( pi_ == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            boost::throw_exception(std::bad_alloc());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        r.release();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif 
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_SMART_PTR )
 | 
			
		||||
 | 
			
		||||
    template<class Y, class D>
 | 
			
		||||
    explicit shared_count( std::unique_ptr<Y, D> & r ): pi_( 0 )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        typedef typename sp_convert_reference<D>::type D2;
 | 
			
		||||
 | 
			
		||||
        D2 d2( r.get_deleter() );
 | 
			
		||||
        pi_ = new sp_counted_impl_pd< typename std::unique_ptr<Y, D>::pointer, D2 >( r.get(), d2 );
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        if( pi_ == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            boost::throw_exception( std::bad_alloc() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        r.release();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    template<class Y, class D>
 | 
			
		||||
    explicit shared_count( boost::movelib::unique_ptr<Y, D> & r ): pi_( 0 )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        typedef typename sp_convert_reference<D>::type D2;
 | 
			
		||||
 | 
			
		||||
        D2 d2( r.get_deleter() );
 | 
			
		||||
        pi_ = new sp_counted_impl_pd< typename boost::movelib::unique_ptr<Y, D>::pointer, D2 >( r.get(), d2 );
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_NO_EXCEPTIONS
 | 
			
		||||
 | 
			
		||||
        if( pi_ == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            boost::throw_exception( std::bad_alloc() );
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        r.release();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~shared_count() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( pi_ != 0 ) pi_->release();
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        id_ = 0;
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    shared_count(shared_count const & r): pi_(r.pi_) // nothrow
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        if( pi_ != 0 ) pi_->add_ref_copy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    shared_count(shared_count && r): pi_(r.pi_) // nothrow
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        r.pi_ = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    explicit shared_count(weak_count const & r); // throws bad_weak_ptr when r.use_count() == 0
 | 
			
		||||
    shared_count( weak_count const & r, sp_nothrow_tag ); // constructs an empty *this when r.use_count() == 0
 | 
			
		||||
 | 
			
		||||
    shared_count & operator= (shared_count const & r) // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        sp_counted_base * tmp = r.pi_;
 | 
			
		||||
 | 
			
		||||
        if( tmp != pi_ )
 | 
			
		||||
        {
 | 
			
		||||
            if( tmp != 0 ) tmp->add_ref_copy();
 | 
			
		||||
            if( pi_ != 0 ) pi_->release();
 | 
			
		||||
            pi_ = tmp;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void swap(shared_count & r) // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        sp_counted_base * tmp = r.pi_;
 | 
			
		||||
        r.pi_ = pi_;
 | 
			
		||||
        pi_ = tmp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return pi_ != 0? pi_->use_count(): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool unique() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return use_count() == 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool empty() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return pi_ == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    friend inline bool operator==(shared_count const & a, shared_count const & b)
 | 
			
		||||
    {
 | 
			
		||||
        return a.pi_ == b.pi_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    friend inline bool operator<(shared_count const & a, shared_count const & b)
 | 
			
		||||
    {
 | 
			
		||||
        return std::less<sp_counted_base *>()( a.pi_, b.pi_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * get_deleter( sp_typeinfo const & ti ) const
 | 
			
		||||
    {
 | 
			
		||||
        return pi_? pi_->get_deleter( ti ): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * get_untyped_deleter() const
 | 
			
		||||
    {
 | 
			
		||||
        return pi_? pi_->get_untyped_deleter(): 0;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class weak_count
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base * pi_;
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
    int id_;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    friend class shared_count;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    weak_count(): pi_(0) // nothrow
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(weak_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_count(shared_count const & r): pi_(r.pi_) // nothrow
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(weak_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        if(pi_ != 0) pi_->weak_add_ref();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_count(weak_count const & r): pi_(r.pi_) // nothrow
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(weak_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        if(pi_ != 0) pi_->weak_add_ref();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
// Move support
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    weak_count(weak_count && r): pi_(r.pi_) // nothrow
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(weak_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
    {
 | 
			
		||||
        r.pi_ = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    ~weak_count() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if(pi_ != 0) pi_->weak_release();
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        id_ = 0;
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_count & operator= (shared_count const & r) // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        sp_counted_base * tmp = r.pi_;
 | 
			
		||||
 | 
			
		||||
        if( tmp != pi_ )
 | 
			
		||||
        {
 | 
			
		||||
            if(tmp != 0) tmp->weak_add_ref();
 | 
			
		||||
            if(pi_ != 0) pi_->weak_release();
 | 
			
		||||
            pi_ = tmp;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_count & operator= (weak_count const & r) // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        sp_counted_base * tmp = r.pi_;
 | 
			
		||||
 | 
			
		||||
        if( tmp != pi_ )
 | 
			
		||||
        {
 | 
			
		||||
            if(tmp != 0) tmp->weak_add_ref();
 | 
			
		||||
            if(pi_ != 0) pi_->weak_release();
 | 
			
		||||
            pi_ = tmp;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void swap(weak_count & r) // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        sp_counted_base * tmp = r.pi_;
 | 
			
		||||
        r.pi_ = pi_;
 | 
			
		||||
        pi_ = tmp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return pi_ != 0? pi_->use_count(): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool empty() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return pi_ == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    friend inline bool operator==(weak_count const & a, weak_count const & b)
 | 
			
		||||
    {
 | 
			
		||||
        return a.pi_ == b.pi_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    friend inline bool operator<(weak_count const & a, weak_count const & b)
 | 
			
		||||
    {
 | 
			
		||||
        return std::less<sp_counted_base *>()(a.pi_, b.pi_);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
inline shared_count::shared_count( weak_count const & r ): pi_( r.pi_ )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
    if( pi_ == 0 || !pi_->add_ref_lock() )
 | 
			
		||||
    {
 | 
			
		||||
        boost::throw_exception( boost::bad_weak_ptr() );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline shared_count::shared_count( weak_count const & r, sp_nothrow_tag ): pi_( r.pi_ )
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        , id_(shared_count_id)
 | 
			
		||||
#endif
 | 
			
		||||
{
 | 
			
		||||
    if( pi_ != 0 && !pi_->add_ref_lock() )
 | 
			
		||||
    {
 | 
			
		||||
        pi_ = 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_SP_DISABLE_DEPRECATED )
 | 
			
		||||
#pragma GCC diagnostic pop
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __BORLANDC__
 | 
			
		||||
# pragma warn .8027     // Functions containing try are not expanded inline
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SHARED_COUNT_HPP_INCLUDED
 | 
			
		||||
@@ -1,92 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_convertible.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2008 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( BOOST_NO_SFINAE )
 | 
			
		||||
# define BOOST_SP_NO_SP_CONVERTIBLE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( __GNUC__ ) && ( __GNUC__ * 100 + __GNUC_MINOR__ < 303 )
 | 
			
		||||
# define BOOST_SP_NO_SP_CONVERTIBLE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( __BORLANDC__ ) && ( __BORLANDC__ < 0x630 )
 | 
			
		||||
# define BOOST_SP_NO_SP_CONVERTIBLE
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template< class Y, class T > struct sp_convertible
 | 
			
		||||
{
 | 
			
		||||
    typedef char (&yes) [1];
 | 
			
		||||
    typedef char (&no)  [2];
 | 
			
		||||
 | 
			
		||||
    static yes f( T* );
 | 
			
		||||
    static no  f( ... );
 | 
			
		||||
 | 
			
		||||
    enum _vt { value = sizeof( (f)( static_cast<Y*>(0) ) ) == sizeof(yes) };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class Y, class T > struct sp_convertible< Y, T[] >
 | 
			
		||||
{
 | 
			
		||||
    enum _vt { value = false };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class Y, class T > struct sp_convertible< Y[], T[] >
 | 
			
		||||
{
 | 
			
		||||
    enum _vt { value = sp_convertible< Y[1], T[1] >::value };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class Y, std::size_t N, class T > struct sp_convertible< Y[N], T[] >
 | 
			
		||||
{
 | 
			
		||||
    enum _vt { value = sp_convertible< Y[1], T[1] >::value };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct sp_empty
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< bool > struct sp_enable_if_convertible_impl;
 | 
			
		||||
 | 
			
		||||
template<> struct sp_enable_if_convertible_impl<true>
 | 
			
		||||
{
 | 
			
		||||
    typedef sp_empty type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<> struct sp_enable_if_convertible_impl<false>
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class Y, class T > struct sp_enable_if_convertible: public sp_enable_if_convertible_impl< sp_convertible< Y, T >::value >
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED
 | 
			
		||||
@@ -1,96 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2005-2013 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
// Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
// accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
// http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <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>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_USE_STD_ATOMIC )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_std_atomic.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_USE_SPINLOCK )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_spin.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_USE_PTHREADS )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_pt.hpp>
 | 
			
		||||
 | 
			
		||||
#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_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( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) ) && !defined(__PATHSCALE__)
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined(__HP_aCC) && defined(__ia64)
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( __GNUC__ ) && defined( __ia64__ ) && !defined( __INTEL_COMPILER ) && !defined(__PATHSCALE__)
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( __IBMCPP__ ) && defined( __powerpc )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( __MWERKS__ ) && defined( __POWERPC__ )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( __GNUC__ ) && ( defined( __powerpc__ ) || defined( __ppc__ ) || defined( __ppc ) ) && !defined(__PATHSCALE__) && !defined( _AIX )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp>
 | 
			
		||||
 | 
			
		||||
#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>
 | 
			
		||||
 | 
			
		||||
#elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined(__CYGWIN__)
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_w32.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( _AIX )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_aix.hpp>
 | 
			
		||||
 | 
			
		||||
#elif !defined( BOOST_HAS_THREADS )
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_nt.hpp>
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
# include <boost/smart_ptr/detail/sp_counted_base_spin.hpp>
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#undef BOOST_SP_HAS_CLANG_C11_ATOMICS
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED
 | 
			
		||||
@@ -1,151 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_ACC_IA64_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_ACC_IA64_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_acc_ia64.hpp - aC++ on HP-UX IA64
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2007 Baruch Zilber
 | 
			
		||||
//  Copyright 2007 Boris Gubenko
 | 
			
		||||
//
 | 
			
		||||
//  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
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <machine/sys/inline.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // ++*pw;
 | 
			
		||||
 | 
			
		||||
    _Asm_fetchadd(_FASZ_W, _SEM_REL, pw, +1, _LDHINT_NONE);
 | 
			
		||||
} 
 | 
			
		||||
 | 
			
		||||
inline int atomic_decrement( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // return --*pw;
 | 
			
		||||
 | 
			
		||||
    int r = static_cast<int>(_Asm_fetchadd(_FASZ_W, _SEM_REL, pw, -1, _LDHINT_NONE));
 | 
			
		||||
    if (1 == r)
 | 
			
		||||
    {
 | 
			
		||||
        _Asm_mf();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return r - 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_conditional_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // if( *pw != 0 ) ++*pw;
 | 
			
		||||
    // return *pw;
 | 
			
		||||
 | 
			
		||||
    int v = *pw;
 | 
			
		||||
    
 | 
			
		||||
    for (;;)
 | 
			
		||||
    {
 | 
			
		||||
        if (0 == v)
 | 
			
		||||
        {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        _Asm_mov_to_ar(_AREG_CCV,
 | 
			
		||||
                       v,
 | 
			
		||||
                       (_UP_CALL_FENCE | _UP_SYS_FENCE | _DOWN_CALL_FENCE | _DOWN_SYS_FENCE));
 | 
			
		||||
        int r = static_cast<int>(_Asm_cmpxchg(_SZ_W, _SEM_ACQ, pw, v + 1, _LDHINT_NONE));
 | 
			
		||||
        if (r == v)
 | 
			
		||||
        {
 | 
			
		||||
            return r + 1;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        v = r;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class 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_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_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<int const volatile &>( use_count_ ); // TODO use ld.acq here
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_ACC_IA64_HPP_INCLUDED
 | 
			
		||||
@@ -1,143 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_AIX_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_AIX_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_aix.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 <builtins.h>
 | 
			
		||||
#include <sys/atomic_op.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int32_t* pw )
 | 
			
		||||
{
 | 
			
		||||
    // ++*pw;
 | 
			
		||||
 | 
			
		||||
    fetch_and_add( pw, 1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int32_t atomic_decrement( int32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    // return --*pw;
 | 
			
		||||
 | 
			
		||||
    int32_t originalValue;
 | 
			
		||||
 | 
			
		||||
    __lwsync();
 | 
			
		||||
    originalValue = fetch_and_add( pw, -1 );
 | 
			
		||||
    __isync();
 | 
			
		||||
 | 
			
		||||
    return (originalValue - 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int32_t atomic_conditional_increment( int32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    // if( *pw != 0 ) ++*pw;
 | 
			
		||||
    // return *pw;
 | 
			
		||||
 | 
			
		||||
    int32_t tmp = fetch_and_add( pw, 0 );
 | 
			
		||||
    for( ;; )
 | 
			
		||||
    {
 | 
			
		||||
        if( tmp == 0 ) return 0;
 | 
			
		||||
        if( compare_and_swap( pw, &tmp, tmp + 1 ) ) return (tmp + 1);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    int32_t use_count_;        // #shared
 | 
			
		||||
    int32_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_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_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return fetch_and_add( const_cast<int32_t*>(&use_count_), 0 );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_AIX_HPP_INCLUDED
 | 
			
		||||
@@ -1,149 +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/cstdint.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
typedef _Atomic( boost::int_least32_t ) atomic_int_least32_t;
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( atomic_int_least32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    __c11_atomic_fetch_add( pw, 1, __ATOMIC_RELAXED );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline boost::int_least32_t atomic_decrement( atomic_int_least32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    return __c11_atomic_fetch_sub( pw, 1, __ATOMIC_ACQ_REL );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline boost::int_least32_t atomic_conditional_increment( atomic_int_least32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    // long r = *pw;
 | 
			
		||||
    // if( r != 0 ) ++*pw;
 | 
			
		||||
    // return r;
 | 
			
		||||
 | 
			
		||||
    boost::int_least32_t r = __c11_atomic_load( pw, __ATOMIC_RELAXED );
 | 
			
		||||
 | 
			
		||||
    for( ;; )
 | 
			
		||||
    {
 | 
			
		||||
        if( r == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if( __c11_atomic_compare_exchange_weak( pw, &r, r + 1, __ATOMIC_RELAXED, __ATOMIC_RELAXED ) )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
    }    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined(__clang__)
 | 
			
		||||
# pragma clang diagnostic push
 | 
			
		||||
# pragma clang diagnostic ignored "-Wweak-vtables"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    atomic_int_least32_t use_count_;	// #shared
 | 
			
		||||
    atomic_int_least32_t weak_count_;	// #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base()
 | 
			
		||||
    {
 | 
			
		||||
        __c11_atomic_init( &use_count_, 1 );
 | 
			
		||||
        __c11_atomic_init( &weak_count_, 1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        return atomic_conditional_increment( &use_count_ ) != 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &use_count_ ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 1 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return __c11_atomic_load( const_cast< atomic_int_least32_t* >( &use_count_ ), __ATOMIC_ACQUIRE );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if defined(__clang__)
 | 
			
		||||
# pragma clang diagnostic pop
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CLANG_HPP_INCLUDED
 | 
			
		||||
@@ -1,171 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_PPC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_PPC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_cw_ppc.hpp - CodeWarrior on PowerPC
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 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)
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Ben Hitchings for the #weak + (#shared != 0)
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( register long * pw )
 | 
			
		||||
{
 | 
			
		||||
    register int a;
 | 
			
		||||
 | 
			
		||||
    asm
 | 
			
		||||
    {
 | 
			
		||||
loop:
 | 
			
		||||
 | 
			
		||||
    lwarx   a, 0, pw
 | 
			
		||||
    addi    a, a, 1
 | 
			
		||||
    stwcx.  a, 0, pw
 | 
			
		||||
    bne-    loop
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline long atomic_decrement( register long * pw )
 | 
			
		||||
{
 | 
			
		||||
    register int a;
 | 
			
		||||
 | 
			
		||||
    asm
 | 
			
		||||
    {
 | 
			
		||||
    sync
 | 
			
		||||
 | 
			
		||||
loop:
 | 
			
		||||
 | 
			
		||||
    lwarx   a, 0, pw
 | 
			
		||||
    addi    a, a, -1
 | 
			
		||||
    stwcx.  a, 0, pw
 | 
			
		||||
    bne-    loop
 | 
			
		||||
 | 
			
		||||
    isync
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline long atomic_conditional_increment( register long * pw )
 | 
			
		||||
{
 | 
			
		||||
    register int a;
 | 
			
		||||
 | 
			
		||||
    asm
 | 
			
		||||
    {
 | 
			
		||||
loop:
 | 
			
		||||
 | 
			
		||||
    lwarx   a, 0, pw
 | 
			
		||||
    cmpwi   a, 0
 | 
			
		||||
    beq     store
 | 
			
		||||
 | 
			
		||||
    addi    a, a, 1
 | 
			
		||||
 | 
			
		||||
store:
 | 
			
		||||
 | 
			
		||||
    stwcx.  a, 0, pw
 | 
			
		||||
    bne-    loop
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    long use_count_;        // #shared
 | 
			
		||||
    long 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_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_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &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_CW_PPC_HPP_INCLUDED
 | 
			
		||||
@@ -1,159 +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>
 | 
			
		||||
 | 
			
		||||
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 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_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
 | 
			
		||||
@@ -1,158 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_IA64_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_IA64_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_gcc_ia64.hpp - g++ on IA64
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2006 Peter Dimov
 | 
			
		||||
//  Copyright 2005 Ben Hutchings
 | 
			
		||||
//
 | 
			
		||||
//  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
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // ++*pw;
 | 
			
		||||
 | 
			
		||||
    int tmp;
 | 
			
		||||
 | 
			
		||||
    // No barrier is required here but fetchadd always has an acquire or
 | 
			
		||||
    // release barrier associated with it.  We choose release as it should be
 | 
			
		||||
    // cheaper.
 | 
			
		||||
    __asm__ ("fetchadd4.rel %0=%1,1" :
 | 
			
		||||
         "=r"(tmp), "=m"(*pw) :
 | 
			
		||||
         "m"( *pw ));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_decrement( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // return --*pw;
 | 
			
		||||
 | 
			
		||||
    int rv;
 | 
			
		||||
 | 
			
		||||
    __asm__ ("     fetchadd4.rel %0=%1,-1 ;; \n"
 | 
			
		||||
             "     cmp.eq        p7,p0=1,%0 ;; \n"
 | 
			
		||||
             "(p7) ld4.acq       %0=%1    " :
 | 
			
		||||
             "=&r"(rv), "=m"(*pw) :
 | 
			
		||||
             "m"( *pw ) :
 | 
			
		||||
             "p7");
 | 
			
		||||
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_conditional_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // if( *pw != 0 ) ++*pw;
 | 
			
		||||
    // return *pw;
 | 
			
		||||
 | 
			
		||||
    int rv, tmp, tmp2;
 | 
			
		||||
 | 
			
		||||
    __asm__ ("0:   ld4          %0=%3           ;; \n"
 | 
			
		||||
         "     cmp.eq       p7,p0=0,%0        ;; \n"
 | 
			
		||||
         "(p7) br.cond.spnt 1f                \n"
 | 
			
		||||
         "     mov          ar.ccv=%0         \n"
 | 
			
		||||
         "     add          %1=1,%0           ;; \n"
 | 
			
		||||
         "     cmpxchg4.acq %2=%3,%1,ar.ccv ;; \n"
 | 
			
		||||
         "     cmp.ne       p7,p0=%0,%2       ;; \n"
 | 
			
		||||
         "(p7) br.cond.spnt 0b                \n"
 | 
			
		||||
         "     mov          %0=%1             ;; \n"
 | 
			
		||||
         "1:" : 
 | 
			
		||||
         "=&r"(rv), "=&r"(tmp), "=&r"(tmp2), "=m"(*pw) :
 | 
			
		||||
         "m"( *pw ) :
 | 
			
		||||
         "ar.ccv", "p7");
 | 
			
		||||
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class 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_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_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<int const volatile &>( use_count_ ); // TODO use ld.acq here
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_IA64_HPP_INCLUDED
 | 
			
		||||
@@ -1,182 +0,0 @@
 | 
			
		||||
#ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_MIPS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_DETAIL_SP_COUNTED_BASE_GCC_MIPS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_gcc_mips.hpp - g++ on MIPS
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2009, Spirent Communications, Inc.
 | 
			
		||||
//
 | 
			
		||||
//  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
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // ++*pw;
 | 
			
		||||
 | 
			
		||||
    int tmp;
 | 
			
		||||
 | 
			
		||||
    __asm__ __volatile__
 | 
			
		||||
    (
 | 
			
		||||
        "0:\n\t"
 | 
			
		||||
        ".set push\n\t"
 | 
			
		||||
        ".set mips2\n\t"
 | 
			
		||||
        "ll %0, %1\n\t"
 | 
			
		||||
        "addiu %0, 1\n\t"
 | 
			
		||||
        "sc %0, %1\n\t"
 | 
			
		||||
        ".set pop\n\t"
 | 
			
		||||
        "beqz %0, 0b":
 | 
			
		||||
        "=&r"( tmp ), "=m"( *pw ):
 | 
			
		||||
        "m"( *pw )
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_decrement( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // return --*pw;
 | 
			
		||||
 | 
			
		||||
    int rv, tmp;
 | 
			
		||||
 | 
			
		||||
    __asm__ __volatile__
 | 
			
		||||
    (
 | 
			
		||||
        "0:\n\t"
 | 
			
		||||
        ".set push\n\t"
 | 
			
		||||
        ".set mips2\n\t"
 | 
			
		||||
        "ll %1, %2\n\t"
 | 
			
		||||
        "addiu %0, %1, -1\n\t"
 | 
			
		||||
        "sc %0, %2\n\t"
 | 
			
		||||
        ".set pop\n\t"
 | 
			
		||||
        "beqz %0, 0b\n\t"
 | 
			
		||||
        "addiu %0, %1, -1":
 | 
			
		||||
        "=&r"( rv ), "=&r"( tmp ), "=m"( *pw ):
 | 
			
		||||
        "m"( *pw ):
 | 
			
		||||
        "memory"
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_conditional_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // if( *pw != 0 ) ++*pw;
 | 
			
		||||
    // return *pw;
 | 
			
		||||
 | 
			
		||||
    int rv, tmp;
 | 
			
		||||
 | 
			
		||||
    __asm__ __volatile__
 | 
			
		||||
    (
 | 
			
		||||
        "0:\n\t"
 | 
			
		||||
        ".set push\n\t"
 | 
			
		||||
        ".set mips2\n\t"
 | 
			
		||||
        "ll %0, %2\n\t"
 | 
			
		||||
        "beqz %0, 1f\n\t"
 | 
			
		||||
        "addiu %1, %0, 1\n\t"
 | 
			
		||||
        "sc %1, %2\n\t"
 | 
			
		||||
        ".set pop\n\t"
 | 
			
		||||
        "beqz %1, 0b\n\t"
 | 
			
		||||
        "addiu %0, %0, 1\n\t"
 | 
			
		||||
        "1:":
 | 
			
		||||
        "=&r"( rv ), "=&r"( tmp ), "=m"( *pw ):
 | 
			
		||||
        "m"( *pw ):
 | 
			
		||||
        "memory"
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class 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_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_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast<int const volatile &>( use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_MIPS_HPP_INCLUDED
 | 
			
		||||
@@ -1,182 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_PPC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_PPC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_gcc_ppc.hpp - g++ on PowerPC
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 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)
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Ben Hitchings for the #weak + (#shared != 0)
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // ++*pw;
 | 
			
		||||
 | 
			
		||||
    int tmp;
 | 
			
		||||
 | 
			
		||||
    __asm__
 | 
			
		||||
    (
 | 
			
		||||
        "0:\n\t"
 | 
			
		||||
        "lwarx %1, 0, %2\n\t"
 | 
			
		||||
        "addi %1, %1, 1\n\t"
 | 
			
		||||
        "stwcx. %1, 0, %2\n\t"
 | 
			
		||||
        "bne- 0b":
 | 
			
		||||
 | 
			
		||||
        "=m"( *pw ), "=&b"( tmp ):
 | 
			
		||||
        "r"( pw ), "m"( *pw ):
 | 
			
		||||
        "cc"
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_decrement( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // return --*pw;
 | 
			
		||||
 | 
			
		||||
    int rv;
 | 
			
		||||
 | 
			
		||||
    __asm__ __volatile__
 | 
			
		||||
    (
 | 
			
		||||
        "sync\n\t"
 | 
			
		||||
        "0:\n\t"
 | 
			
		||||
        "lwarx %1, 0, %2\n\t"
 | 
			
		||||
        "addi %1, %1, -1\n\t"
 | 
			
		||||
        "stwcx. %1, 0, %2\n\t"
 | 
			
		||||
        "bne- 0b\n\t"
 | 
			
		||||
        "isync":
 | 
			
		||||
 | 
			
		||||
        "=m"( *pw ), "=&b"( rv ):
 | 
			
		||||
        "r"( pw ), "m"( *pw ):
 | 
			
		||||
        "memory", "cc"
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_conditional_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // if( *pw != 0 ) ++*pw;
 | 
			
		||||
    // return *pw;
 | 
			
		||||
 | 
			
		||||
    int rv;
 | 
			
		||||
 | 
			
		||||
    __asm__
 | 
			
		||||
    (
 | 
			
		||||
        "0:\n\t"
 | 
			
		||||
        "lwarx %1, 0, %2\n\t"
 | 
			
		||||
        "cmpwi %1, 0\n\t"
 | 
			
		||||
        "beq 1f\n\t"
 | 
			
		||||
        "addi %1, %1, 1\n\t"
 | 
			
		||||
        "1:\n\t"
 | 
			
		||||
        "stwcx. %1, 0, %2\n\t"
 | 
			
		||||
        "bne- 0b":
 | 
			
		||||
 | 
			
		||||
        "=m"( *pw ), "=&b"( rv ):
 | 
			
		||||
        "r"( pw ), "m"( *pw ):
 | 
			
		||||
        "cc"
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class 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_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_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            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_GCC_PPC_HPP_INCLUDED
 | 
			
		||||
@@ -1,167 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_SPARC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_SPARC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_counted_base_gcc_sparc.hpp - g++ on Sparc V8+
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2006 Piotr Wyderski
 | 
			
		||||
//  Copyright (c) 2006 Tomas Puverle
 | 
			
		||||
//  Copyright (c) 2006 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
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Michael van der Westhuizen
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <inttypes.h> // int32_t
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline int32_t compare_and_swap( int32_t * dest_, int32_t compare_, int32_t swap_ )
 | 
			
		||||
{
 | 
			
		||||
    __asm__ __volatile__( "cas [%1], %2, %0"
 | 
			
		||||
                        : "+r" (swap_)
 | 
			
		||||
                        : "r" (dest_), "r" (compare_)
 | 
			
		||||
                        : "memory" );
 | 
			
		||||
 | 
			
		||||
    return swap_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int32_t atomic_fetch_and_add( int32_t * pw, int32_t dv )
 | 
			
		||||
{
 | 
			
		||||
    // long r = *pw;
 | 
			
		||||
    // *pw += dv;
 | 
			
		||||
    // return r;
 | 
			
		||||
 | 
			
		||||
    for( ;; )
 | 
			
		||||
    {
 | 
			
		||||
        int32_t r = *pw;
 | 
			
		||||
 | 
			
		||||
        if( __builtin_expect((compare_and_swap(pw, r, r + dv) == r), 1) )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    atomic_fetch_and_add( pw, 1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int32_t atomic_decrement( int32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    return atomic_fetch_and_add( pw, -1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int32_t atomic_conditional_increment( int32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    // long r = *pw;
 | 
			
		||||
    // if( r != 0 ) ++*pw;
 | 
			
		||||
    // return r;
 | 
			
		||||
 | 
			
		||||
    for( ;; )
 | 
			
		||||
    {
 | 
			
		||||
        int32_t r = *pw;
 | 
			
		||||
 | 
			
		||||
        if( r == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if( __builtin_expect( ( compare_and_swap( pw, r, r + 1 ) == r ), 1 ) )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
    }    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    int32_t use_count_;        // #shared
 | 
			
		||||
    int32_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_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 const_cast< int32_t const volatile & >( use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_SPARC_HPP_INCLUDED
 | 
			
		||||
@@ -1,174 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_X86_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_X86_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_gcc_x86.hpp - g++ on 486+ or AMD64
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 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)
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Ben Hitchings for the #weak + (#shared != 0)
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline int atomic_exchange_and_add( int * pw, int dv )
 | 
			
		||||
{
 | 
			
		||||
    // int r = *pw;
 | 
			
		||||
    // *pw += dv;
 | 
			
		||||
    // return r;
 | 
			
		||||
 | 
			
		||||
    int r;
 | 
			
		||||
 | 
			
		||||
    __asm__ __volatile__
 | 
			
		||||
    (
 | 
			
		||||
        "lock\n\t"
 | 
			
		||||
        "xadd %1, %0":
 | 
			
		||||
        "=m"( *pw ), "=r"( r ): // outputs (%0, %1)
 | 
			
		||||
        "m"( *pw ), "1"( dv ): // inputs (%2, %3 == %1)
 | 
			
		||||
        "memory", "cc" // clobbers
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    return r;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    //atomic_exchange_and_add( pw, 1 );
 | 
			
		||||
 | 
			
		||||
    __asm__
 | 
			
		||||
    (
 | 
			
		||||
        "lock\n\t"
 | 
			
		||||
        "incl %0":
 | 
			
		||||
        "=m"( *pw ): // output (%0)
 | 
			
		||||
        "m"( *pw ): // input (%1)
 | 
			
		||||
        "cc" // clobbers
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_conditional_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    // int rv = *pw;
 | 
			
		||||
    // if( rv != 0 ) ++*pw;
 | 
			
		||||
    // return rv;
 | 
			
		||||
 | 
			
		||||
    int rv, tmp;
 | 
			
		||||
 | 
			
		||||
    __asm__
 | 
			
		||||
    (
 | 
			
		||||
        "movl %0, %%eax\n\t"
 | 
			
		||||
        "0:\n\t"
 | 
			
		||||
        "test %%eax, %%eax\n\t"
 | 
			
		||||
        "je 1f\n\t"
 | 
			
		||||
        "movl %%eax, %2\n\t"
 | 
			
		||||
        "incl %2\n\t"
 | 
			
		||||
        "lock\n\t"
 | 
			
		||||
        "cmpxchgl %2, %0\n\t"
 | 
			
		||||
        "jne 0b\n\t"
 | 
			
		||||
        "1:":
 | 
			
		||||
        "=m"( *pw ), "=&a"( rv ), "=&r"( tmp ): // outputs (%0, %1, %2)
 | 
			
		||||
        "m"( *pw ): // input (%3)
 | 
			
		||||
        "cc" // clobbers
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class 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_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_GCC_X86_HPP_INCLUDED
 | 
			
		||||
@@ -1,108 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_nt.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 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>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    long use_count_;        // #shared
 | 
			
		||||
    long 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_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        ++use_count_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        if( use_count_ == 0 ) return false;
 | 
			
		||||
        ++use_count_;
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( --use_count_ == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        ++weak_count_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( --weak_count_ == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return use_count_;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED
 | 
			
		||||
@@ -1,137 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_PT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_PT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_pt.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 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/assert.hpp>
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    long use_count_;        // #shared
 | 
			
		||||
    long weak_count_;       // #weak + (#shared != 0)
 | 
			
		||||
 | 
			
		||||
    mutable pthread_mutex_t m_;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
 | 
			
		||||
    {
 | 
			
		||||
// HPUX 10.20 / DCE has a nonstandard pthread_mutex_init
 | 
			
		||||
 | 
			
		||||
#if defined(__hpux) && defined(_DECTHREADS_)
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_init( &m_, pthread_mutexattr_default ) == 0 );
 | 
			
		||||
#else
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_init( &m_, 0 ) == 0 );
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual ~sp_counted_base() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_destroy( &m_ ) == 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // dispose() is called when use_count_ drops to zero, to release
 | 
			
		||||
    // the resources managed by *this.
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() = 0; // nothrow
 | 
			
		||||
 | 
			
		||||
    // destroy() is called when weak_count_ drops to zero.
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        delete this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
 | 
			
		||||
    virtual void * get_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 );
 | 
			
		||||
        ++use_count_;
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 );
 | 
			
		||||
        bool r = use_count_ == 0? false: ( ++use_count_, true );
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 );
 | 
			
		||||
        return r;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 );
 | 
			
		||||
        long new_use_count = --use_count_;
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 );
 | 
			
		||||
 | 
			
		||||
        if( new_use_count == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 );
 | 
			
		||||
        ++weak_count_;
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 );
 | 
			
		||||
        long new_weak_count = --weak_count_;
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 );
 | 
			
		||||
 | 
			
		||||
        if( new_weak_count == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 );
 | 
			
		||||
        long r = use_count_;
 | 
			
		||||
        BOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 );
 | 
			
		||||
 | 
			
		||||
        return r;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_PT_HPP_INCLUDED
 | 
			
		||||
@@ -1,162 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SNC_PS3_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SNC_PS3_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_counted_base_gcc_sparc.hpp - g++ on Sparc V8+
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2006 Piotr Wyderski
 | 
			
		||||
//  Copyright (c) 2006 Tomas Puverle
 | 
			
		||||
//  Copyright (c) 2006 Peter Dimov
 | 
			
		||||
//  Copyright (c) 2011 Emil Dotchevski
 | 
			
		||||
//
 | 
			
		||||
//  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
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Michael van der Westhuizen
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <inttypes.h> // uint32_t
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline uint32_t compare_and_swap( uint32_t * dest_, uint32_t compare_, uint32_t swap_ )
 | 
			
		||||
{
 | 
			
		||||
    return __builtin_cellAtomicCompareAndSwap32(dest_,compare_,swap_);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline uint32_t atomic_fetch_and_add( uint32_t * pw, uint32_t dv )
 | 
			
		||||
{
 | 
			
		||||
    // long r = *pw;
 | 
			
		||||
    // *pw += dv;
 | 
			
		||||
    // return r;
 | 
			
		||||
 | 
			
		||||
    for( ;; )
 | 
			
		||||
    {
 | 
			
		||||
        uint32_t r = *pw;
 | 
			
		||||
 | 
			
		||||
        if( __builtin_expect((compare_and_swap(pw, r, r + dv) == r), 1) )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( uint32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    (void) __builtin_cellAtomicIncr32( pw );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline uint32_t atomic_decrement( uint32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    return __builtin_cellAtomicDecr32( pw );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline uint32_t atomic_conditional_increment( uint32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    // long r = *pw;
 | 
			
		||||
    // if( r != 0 ) ++*pw;
 | 
			
		||||
    // return r;
 | 
			
		||||
 | 
			
		||||
    for( ;; )
 | 
			
		||||
    {
 | 
			
		||||
        uint32_t r = *pw;
 | 
			
		||||
 | 
			
		||||
        if( r == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if( __builtin_expect( ( compare_and_swap( pw, r, r + 1 ) == r ), 1 ) )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
    }    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class 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_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 const_cast< uint32_t const volatile & >( use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SNC_PS3_HPP_INCLUDED
 | 
			
		||||
@@ -1,114 +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 <atomic.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class 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_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
 | 
			
		||||
@@ -1,132 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SPIN_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SPIN_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_spin.hpp - spinlock pool atomic emulation
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2008 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/spinlock_pool.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline int atomic_exchange_and_add( int * pw, int dv )
 | 
			
		||||
{
 | 
			
		||||
    spinlock_pool<1>::scoped_lock lock( pw );
 | 
			
		||||
 | 
			
		||||
    int r = *pw;
 | 
			
		||||
    *pw += dv;
 | 
			
		||||
    return r;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    spinlock_pool<1>::scoped_lock lock( pw );
 | 
			
		||||
    ++*pw;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_conditional_increment( int * pw )
 | 
			
		||||
{
 | 
			
		||||
    spinlock_pool<1>::scoped_lock lock( pw );
 | 
			
		||||
 | 
			
		||||
    int rv = *pw;
 | 
			
		||||
    if( rv != 0 ) ++*pw;
 | 
			
		||||
    return rv;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class 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_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
 | 
			
		||||
    {
 | 
			
		||||
        spinlock_pool<1>::scoped_lock lock( &use_count_ );
 | 
			
		||||
        return use_count_;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SPIN_HPP_INCLUDED
 | 
			
		||||
@@ -1,137 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_STD_ATOMIC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_STD_ATOMIC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_counted_base_std_atomic.hpp - C++11 std::atomic
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2007, 2013 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
#include <atomic>
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( std::atomic_int_least32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    pw->fetch_add( 1, std::memory_order_relaxed );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline std::int_least32_t atomic_decrement( std::atomic_int_least32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    return pw->fetch_sub( 1, std::memory_order_acq_rel );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline std::int_least32_t atomic_conditional_increment( std::atomic_int_least32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    // long r = *pw;
 | 
			
		||||
    // if( r != 0 ) ++*pw;
 | 
			
		||||
    // return r;
 | 
			
		||||
 | 
			
		||||
    std::int_least32_t r = pw->load( std::memory_order_relaxed );
 | 
			
		||||
 | 
			
		||||
    for( ;; )
 | 
			
		||||
    {
 | 
			
		||||
        if( r == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if( pw->compare_exchange_weak( r, r + 1, std::memory_order_relaxed, std::memory_order_relaxed ) )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
    }    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    std::atomic_int_least32_t use_count_;	// #shared
 | 
			
		||||
    std::atomic_int_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_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 use_count_.load( std::memory_order_acquire );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_STD_ATOMIC_HPP_INCLUDED
 | 
			
		||||
@@ -1,156 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_counted_base_sync.hpp - g++ 4.1+ __sync intrinsics
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2007 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 <limits.h>
 | 
			
		||||
 | 
			
		||||
#if defined( __ia64__ ) && defined( __INTEL_COMPILER )
 | 
			
		||||
# include <ia64intrin.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if INT_MAX >= 2147483647
 | 
			
		||||
 | 
			
		||||
typedef int sp_int32_t;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
typedef long sp_int32_t;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( sp_int32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    __sync_fetch_and_add( pw, 1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline sp_int32_t atomic_decrement( sp_int32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    return __sync_fetch_and_add( pw, -1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline sp_int32_t atomic_conditional_increment( sp_int32_t * pw )
 | 
			
		||||
{
 | 
			
		||||
    // long r = *pw;
 | 
			
		||||
    // if( r != 0 ) ++*pw;
 | 
			
		||||
    // return r;
 | 
			
		||||
 | 
			
		||||
    sp_int32_t r = *pw;
 | 
			
		||||
 | 
			
		||||
    for( ;; )
 | 
			
		||||
    {
 | 
			
		||||
        if( r == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        sp_int32_t r2 = __sync_val_compare_and_swap( pw, r, r + 1 );
 | 
			
		||||
 | 
			
		||||
        if( r2 == r )
 | 
			
		||||
        {
 | 
			
		||||
            return r;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            r = r2;
 | 
			
		||||
        }
 | 
			
		||||
    }    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    sp_int32_t use_count_;        // #shared
 | 
			
		||||
    sp_int32_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_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 const_cast< sp_int32_t const volatile & >( use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED
 | 
			
		||||
@@ -1,151 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_VACPP_PPC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_VACPP_PPC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_vacpp_ppc.hpp - xlC(vacpp) on POWER
 | 
			
		||||
//   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
 | 
			
		||||
//  Copyright 2012 IBM Corp.
 | 
			
		||||
//
 | 
			
		||||
//  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>
 | 
			
		||||
 | 
			
		||||
extern "builtin" void __lwsync(void);
 | 
			
		||||
extern "builtin" void __isync(void);
 | 
			
		||||
extern "builtin" int __fetch_and_add(volatile int* addr, int val);
 | 
			
		||||
extern "builtin" int __compare_and_swap(volatile int*, int*, int);
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void atomic_increment( int *pw )
 | 
			
		||||
{
 | 
			
		||||
   // ++*pw;
 | 
			
		||||
   __lwsync();
 | 
			
		||||
   __fetch_and_add(pw, 1);
 | 
			
		||||
   __isync();
 | 
			
		||||
} 
 | 
			
		||||
 | 
			
		||||
inline int atomic_decrement( int *pw )
 | 
			
		||||
{
 | 
			
		||||
   // return --*pw;
 | 
			
		||||
   __lwsync();
 | 
			
		||||
   int originalValue = __fetch_and_add(pw, -1);
 | 
			
		||||
   __isync();
 | 
			
		||||
 | 
			
		||||
   return (originalValue - 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline int atomic_conditional_increment( int *pw )
 | 
			
		||||
{
 | 
			
		||||
   // if( *pw != 0 ) ++*pw;
 | 
			
		||||
   // return *pw;
 | 
			
		||||
 | 
			
		||||
   __lwsync();
 | 
			
		||||
   int v = *const_cast<volatile int*>(pw);
 | 
			
		||||
   for (;;)
 | 
			
		||||
   // loop until state is known
 | 
			
		||||
   {
 | 
			
		||||
      if (v == 0) return 0;
 | 
			
		||||
      if (__compare_and_swap(pw, &v, v + 1))
 | 
			
		||||
      {
 | 
			
		||||
         __isync(); return (v + 1);
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class 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)
 | 
			
		||||
    char pad[64] __attribute__((__aligned__(64)));
 | 
			
		||||
            // pad to prevent false sharing
 | 
			
		||||
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_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_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        atomic_increment( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( atomic_decrement( &weak_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            destroy();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    long use_count() const // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        return *const_cast<volatile int*>(&use_count_); 
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_VACPP_PPC_HPP_INCLUDED
 | 
			
		||||
@@ -1,131 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_W32_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_W32_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_base_w32.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 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)
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//  Lock-free algorithm by Alexander Terekhov
 | 
			
		||||
//
 | 
			
		||||
//  Thanks to Ben Hitchings for the #weak + (#shared != 0)
 | 
			
		||||
//  formulation
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_interlocked.hpp>
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
#include <boost/detail/sp_typeinfo.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    sp_counted_base( sp_counted_base const & );
 | 
			
		||||
    sp_counted_base & operator= ( sp_counted_base const & );
 | 
			
		||||
 | 
			
		||||
    long use_count_;        // #shared
 | 
			
		||||
    long 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_untyped_deleter() = 0;
 | 
			
		||||
 | 
			
		||||
    void add_ref_copy()
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_SP_INTERLOCKED_INCREMENT( &use_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool add_ref_lock() // true on success
 | 
			
		||||
    {
 | 
			
		||||
        for( ;; )
 | 
			
		||||
        {
 | 
			
		||||
            long tmp = static_cast< long const volatile& >( use_count_ );
 | 
			
		||||
            if( tmp == 0 ) return false;
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, == 1200 )
 | 
			
		||||
 | 
			
		||||
            // work around a code generation bug
 | 
			
		||||
 | 
			
		||||
            long tmp2 = tmp + 1;
 | 
			
		||||
            if( BOOST_SP_INTERLOCKED_COMPARE_EXCHANGE( &use_count_, tmp2, tmp ) == tmp2 - 1 ) return true;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
            if( BOOST_SP_INTERLOCKED_COMPARE_EXCHANGE( &use_count_, tmp + 1, tmp ) == tmp ) return true;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( BOOST_SP_INTERLOCKED_DECREMENT( &use_count_ ) == 0 )
 | 
			
		||||
        {
 | 
			
		||||
            dispose();
 | 
			
		||||
            weak_release();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_add_ref() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_SP_INTERLOCKED_INCREMENT( &weak_count_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void weak_release() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        if( BOOST_SP_INTERLOCKED_DECREMENT( &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_W32_HPP_INCLUDED
 | 
			
		||||
@@ -1,263 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  detail/sp_counted_impl.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 | 
			
		||||
//  Copyright 2004-2005 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_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>
 | 
			
		||||
 | 
			
		||||
#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 <cstddef>          // std::size_t
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
 | 
			
		||||
void sp_scalar_constructor_hook( void * px, std::size_t size, void * pn );
 | 
			
		||||
void sp_scalar_destructor_hook( void * px, std::size_t size, void * pn );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<class X> class sp_counted_impl_p: public sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    X * px_;
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_p( sp_counted_impl_p const & );
 | 
			
		||||
    sp_counted_impl_p & operator= ( sp_counted_impl_p const & );
 | 
			
		||||
 | 
			
		||||
    typedef sp_counted_impl_p<X> this_type;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    explicit sp_counted_impl_p( X * px ): px_( px )
 | 
			
		||||
    {
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        boost::sp_scalar_constructor_hook( px, sizeof(X), this );
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
 | 
			
		||||
        boost::sp_scalar_destructor_hook( px_, sizeof(X), this );
 | 
			
		||||
#endif
 | 
			
		||||
        boost::checked_delete( px_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & )
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_untyped_deleter()
 | 
			
		||||
    {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_STD_ALLOCATOR)
 | 
			
		||||
 | 
			
		||||
    void * operator new( std::size_t )
 | 
			
		||||
    {
 | 
			
		||||
        return std::allocator<this_type>().allocate( 1, static_cast<this_type *>(0) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void operator delete( void * p )
 | 
			
		||||
    {
 | 
			
		||||
        std::allocator<this_type>().deallocate( static_cast<this_type *>(p), 1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_QUICK_ALLOCATOR)
 | 
			
		||||
 | 
			
		||||
    void * operator new( std::size_t )
 | 
			
		||||
    {
 | 
			
		||||
        return quick_allocator<this_type>::alloc();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void operator delete( void * p )
 | 
			
		||||
    {
 | 
			
		||||
        quick_allocator<this_type>::dealloc( p );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Borland's Codeguard trips up over the -Vx- option here:
 | 
			
		||||
//
 | 
			
		||||
#ifdef __CODEGUARD__
 | 
			
		||||
# pragma option push -Vx-
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class P, class D> class sp_counted_impl_pd: public sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    P ptr; // copy constructor must not throw
 | 
			
		||||
    D del; // copy constructor must not throw
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pd( sp_counted_impl_pd const & );
 | 
			
		||||
    sp_counted_impl_pd & operator= ( sp_counted_impl_pd const & );
 | 
			
		||||
 | 
			
		||||
    typedef sp_counted_impl_pd<P, D> this_type;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    // pre: d(p) must not throw
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pd( P p, D & d ): ptr( p ), del( d )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pd( P p ): ptr( p ), del()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        del( ptr );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti )
 | 
			
		||||
    {
 | 
			
		||||
        return ti == BOOST_SP_TYPEID(D)? &reinterpret_cast<char&>( del ): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_untyped_deleter()
 | 
			
		||||
    {
 | 
			
		||||
        return &reinterpret_cast<char&>( del );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_STD_ALLOCATOR)
 | 
			
		||||
 | 
			
		||||
    void * operator new( std::size_t )
 | 
			
		||||
    {
 | 
			
		||||
        return std::allocator<this_type>().allocate( 1, static_cast<this_type *>(0) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void operator delete( void * p )
 | 
			
		||||
    {
 | 
			
		||||
        std::allocator<this_type>().deallocate( static_cast<this_type *>(p), 1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_SP_USE_QUICK_ALLOCATOR)
 | 
			
		||||
 | 
			
		||||
    void * operator new( std::size_t )
 | 
			
		||||
    {
 | 
			
		||||
        return quick_allocator<this_type>::alloc();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void operator delete( void * p )
 | 
			
		||||
    {
 | 
			
		||||
        quick_allocator<this_type>::dealloc( p );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class P, class D, class A> class sp_counted_impl_pda: public sp_counted_base
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    P p_; // copy constructor must not throw
 | 
			
		||||
    D d_; // copy constructor must not throw
 | 
			
		||||
    A a_; // copy constructor must not throw
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pda( sp_counted_impl_pda const & );
 | 
			
		||||
    sp_counted_impl_pda & operator= ( sp_counted_impl_pda const & );
 | 
			
		||||
 | 
			
		||||
    typedef sp_counted_impl_pda<P, D, A> this_type;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    // pre: d( p ) must not throw
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pda( P p, D & d, A a ): p_( p ), d_( d ), a_( a )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    sp_counted_impl_pda( P p, A a ): p_( p ), d_( a ), a_( a )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void dispose() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
        d_( p_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void destroy() // nothrow
 | 
			
		||||
    {
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
 | 
			
		||||
 | 
			
		||||
        typedef typename std::allocator_traits<A>::template rebind_alloc< this_type > A2;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        typedef typename A::template rebind< this_type >::other A2;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        A2 a2( a_ );
 | 
			
		||||
 | 
			
		||||
        this->~this_type();
 | 
			
		||||
 | 
			
		||||
        a2.deallocate( this, 1 );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_deleter( sp_typeinfo const & ti )
 | 
			
		||||
    {
 | 
			
		||||
        return ti == BOOST_SP_TYPEID( D )? &reinterpret_cast<char&>( d_ ): 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virtual void * get_untyped_deleter()
 | 
			
		||||
    {
 | 
			
		||||
        return &reinterpret_cast<char&>( d_ );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#ifdef __CODEGUARD__
 | 
			
		||||
# pragma option pop
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED
 | 
			
		||||
@@ -1,40 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_DISABLE_DEPRECATED_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_DISABLE_DEPRECATED_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/smart_ptr/detail/sp_disable_deprecated.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2015 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined( __GNUC__ ) && ( defined( __GXX_EXPERIMENTAL_CXX0X__ ) || ( __cplusplus >= 201103L ) )
 | 
			
		||||
 | 
			
		||||
# if defined( BOOST_GCC )
 | 
			
		||||
 | 
			
		||||
#  if BOOST_GCC >= 40600
 | 
			
		||||
#   define BOOST_SP_DISABLE_DEPRECATED
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
# elif defined( __clang__ ) && defined( __has_warning )
 | 
			
		||||
 | 
			
		||||
#  if __has_warning( "-Wdeprecated-declarations" )
 | 
			
		||||
#   define BOOST_SP_DISABLE_DEPRECATED
 | 
			
		||||
#  endif
 | 
			
		||||
 | 
			
		||||
# endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_DISABLE_DEPRECATED_HPP_INCLUDED
 | 
			
		||||
@@ -1,52 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_FORWARD_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_FORWARD_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_forward.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2008,2012 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_GCC ) && __GNUC__ * 100 + __GNUC_MINOR__ <= 404
 | 
			
		||||
 | 
			
		||||
// GCC 4.4 supports an outdated version of rvalue references and creates a copy of the forwarded object.
 | 
			
		||||
// This results in warnings 'returning reference to temporary'. Therefore we use a special version similar to std::forward.
 | 
			
		||||
template< class T > T&& sp_forward( T && t ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return t;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
template< class T > T&& sp_forward( T & t ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return static_cast< T&& >( t );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_FORWARD_HPP_INCLUDED
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -1,163 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_INTERLOCKED_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_INTERLOCKED_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/sp_interlocked.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2005, 2014 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>
 | 
			
		||||
 | 
			
		||||
// BOOST_SP_HAS_INTRIN_H
 | 
			
		||||
 | 
			
		||||
// VC9 has intrin.h, but it collides with <utility>
 | 
			
		||||
#if defined( BOOST_MSVC ) && BOOST_MSVC >= 1600
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_HAS_INTRIN_H
 | 
			
		||||
 | 
			
		||||
// Unlike __MINGW64__, __MINGW64_VERSION_MAJOR is defined by MinGW-w64 for both 32 and 64-bit targets.
 | 
			
		||||
#elif defined( __MINGW64_VERSION_MAJOR )
 | 
			
		||||
 | 
			
		||||
// MinGW-w64 provides intrin.h for both 32 and 64-bit targets.
 | 
			
		||||
# define BOOST_SP_HAS_INTRIN_H
 | 
			
		||||
 | 
			
		||||
// Intel C++ on Windows on VC10+ stdlib
 | 
			
		||||
#elif defined( BOOST_INTEL_WIN ) && defined( _CPPLIB_VER ) && _CPPLIB_VER >= 520
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_HAS_INTRIN_H
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_USE_WINDOWS_H )
 | 
			
		||||
 | 
			
		||||
# include <windows.h>
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_INCREMENT InterlockedIncrement
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_DECREMENT InterlockedDecrement
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_EXCHANGE InterlockedExchange
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_USE_INTRIN_H ) || defined( BOOST_SP_HAS_INTRIN_H )
 | 
			
		||||
 | 
			
		||||
#include <intrin.h>
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_INCREMENT _InterlockedIncrement
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_DECREMENT _InterlockedDecrement
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_EXCHANGE _InterlockedExchange
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd
 | 
			
		||||
 | 
			
		||||
#elif defined( _WIN32_WCE )
 | 
			
		||||
 | 
			
		||||
#if _WIN32_WCE >= 0x600
 | 
			
		||||
 | 
			
		||||
extern "C" long __cdecl _InterlockedIncrement( long volatile * );
 | 
			
		||||
extern "C" long __cdecl _InterlockedDecrement( long volatile * );
 | 
			
		||||
extern "C" long __cdecl _InterlockedCompareExchange( long volatile *, long, long );
 | 
			
		||||
extern "C" long __cdecl _InterlockedExchange( long volatile *, long );
 | 
			
		||||
extern "C" long __cdecl _InterlockedExchangeAdd( long volatile *, long );
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_INCREMENT _InterlockedIncrement
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_DECREMENT _InterlockedDecrement
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_EXCHANGE _InterlockedExchange
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
// under Windows CE we still have old-style Interlocked* functions
 | 
			
		||||
 | 
			
		||||
extern "C" long __cdecl InterlockedIncrement( long* );
 | 
			
		||||
extern "C" long __cdecl InterlockedDecrement( long* );
 | 
			
		||||
extern "C" long __cdecl InterlockedCompareExchange( long*, long, long );
 | 
			
		||||
extern "C" long __cdecl InterlockedExchange( long*, long );
 | 
			
		||||
extern "C" long __cdecl InterlockedExchangeAdd( long*, long );
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_INCREMENT InterlockedIncrement
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_DECREMENT InterlockedDecrement
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_EXCHANGE InterlockedExchange
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_MSVC ) || defined( BOOST_INTEL_WIN )
 | 
			
		||||
 | 
			
		||||
#if defined( __CLRCALL_PURE_OR_CDECL )
 | 
			
		||||
 | 
			
		||||
extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedIncrement( long volatile * );
 | 
			
		||||
extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedDecrement( long volatile * );
 | 
			
		||||
extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedCompareExchange( long volatile *, long, long );
 | 
			
		||||
extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedExchange( long volatile *, long );
 | 
			
		||||
extern "C" long __CLRCALL_PURE_OR_CDECL _InterlockedExchangeAdd( long volatile *, long );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
extern "C" long __cdecl _InterlockedIncrement( long volatile * );
 | 
			
		||||
extern "C" long __cdecl _InterlockedDecrement( long volatile * );
 | 
			
		||||
extern "C" long __cdecl _InterlockedCompareExchange( long volatile *, long, long );
 | 
			
		||||
extern "C" long __cdecl _InterlockedExchange( long volatile *, long );
 | 
			
		||||
extern "C" long __cdecl _InterlockedExchangeAdd( long volatile *, long );
 | 
			
		||||
 | 
			
		||||
# if defined( BOOST_MSVC ) && BOOST_MSVC == 1310
 | 
			
		||||
//From MSDN, Visual Studio .NET 2003 spedific: To declare one of the interlocked functions
 | 
			
		||||
//for use as an intrinsic, the function must be declared with the leading underscore and
 | 
			
		||||
//the new function must appear in a #pragma intrinsic statement.
 | 
			
		||||
#  pragma intrinsic( _InterlockedIncrement )
 | 
			
		||||
#  pragma intrinsic( _InterlockedDecrement )
 | 
			
		||||
#  pragma intrinsic( _InterlockedCompareExchange )
 | 
			
		||||
#  pragma intrinsic( _InterlockedExchange )
 | 
			
		||||
#  pragma intrinsic( _InterlockedExchangeAdd )
 | 
			
		||||
# endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_INCREMENT _InterlockedIncrement
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_DECREMENT _InterlockedDecrement
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_EXCHANGE _InterlockedExchange
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd
 | 
			
		||||
 | 
			
		||||
#elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined( __CYGWIN__ )
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
extern "C" __declspec(dllimport) long __stdcall InterlockedIncrement( long volatile * );
 | 
			
		||||
extern "C" __declspec(dllimport) long __stdcall InterlockedDecrement( long volatile * );
 | 
			
		||||
extern "C" __declspec(dllimport) long __stdcall InterlockedCompareExchange( long volatile *, long, long );
 | 
			
		||||
extern "C" __declspec(dllimport) long __stdcall InterlockedExchange( long volatile *, long );
 | 
			
		||||
extern "C" __declspec(dllimport) long __stdcall InterlockedExchangeAdd( long volatile *, long );
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_INCREMENT ::boost::detail::InterlockedIncrement
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_DECREMENT ::boost::detail::InterlockedDecrement
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_COMPARE_EXCHANGE ::boost::detail::InterlockedCompareExchange
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_EXCHANGE ::boost::detail::InterlockedExchange
 | 
			
		||||
# define BOOST_SP_INTERLOCKED_EXCHANGE_ADD ::boost::detail::InterlockedExchangeAdd
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
# error "Interlocked intrinsics not available"
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_INTERLOCKED_HPP_INCLUDED
 | 
			
		||||
@@ -1,30 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_NOEXCEPT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_NOEXCEPT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_noexcept.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2016 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined( BOOST_MSVC ) && BOOST_MSVC >= 1700 && BOOST_MSVC < 1900
 | 
			
		||||
 | 
			
		||||
#define BOOST_SP_NOEXCEPT BOOST_NOEXCEPT_OR_NOTHROW
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#define BOOST_SP_NOEXCEPT BOOST_NOEXCEPT
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_NOEXCEPT_HPP_INCLUDED
 | 
			
		||||
@@ -1,45 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SP_NULLPTR_T_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SP_NULLPTR_T_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//  detail/sp_nullptr_t.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2013 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_DECLTYPE ) && ( ( defined( __clang__ ) && !defined( _LIBCPP_VERSION ) ) || defined( __INTEL_COMPILER ) )
 | 
			
		||||
 | 
			
		||||
    typedef decltype(nullptr) sp_nullptr_t;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    typedef std::nullptr_t sp_nullptr_t;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_NULLPTR_T_HPP_INCLUDED
 | 
			
		||||
@@ -1,68 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SPINLOCK_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/spinlock.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 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)
 | 
			
		||||
//
 | 
			
		||||
//  struct spinlock
 | 
			
		||||
//  {
 | 
			
		||||
//      void lock();
 | 
			
		||||
//      bool try_lock();
 | 
			
		||||
//      void unlock();
 | 
			
		||||
//
 | 
			
		||||
//      class scoped_lock;
 | 
			
		||||
//  };
 | 
			
		||||
//
 | 
			
		||||
//  #define BOOST_DETAIL_SPINLOCK_INIT <unspecified>
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_USE_PTHREADS )
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_pt.hpp>
 | 
			
		||||
 | 
			
		||||
#elif !defined( BOOST_NO_CXX11_HDR_ATOMIC )
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_std_atomic.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined(__GNUC__) && defined( __arm__ ) && !defined( __thumb__ )
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_gcc_arm.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined( BOOST_SP_HAS_SYNC )
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_sync.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_w32.hpp>
 | 
			
		||||
 | 
			
		||||
#elif defined(BOOST_HAS_PTHREADS)
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_pt.hpp>
 | 
			
		||||
 | 
			
		||||
#elif !defined(BOOST_HAS_THREADS)
 | 
			
		||||
#  include <boost/smart_ptr/detail/spinlock_nt.hpp>
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
#  error Unrecognized threading platform
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_HPP_INCLUDED
 | 
			
		||||
@@ -1,121 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008, 2011 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/yield_k.hpp>
 | 
			
		||||
 | 
			
		||||
#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"
 | 
			
		||||
# define BOOST_SP_ARM_HAS_LDREX
 | 
			
		||||
 | 
			
		||||
#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__)
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_ARM_BARRIER "mcr p15, 0, r0, c7, c10, 5"
 | 
			
		||||
# define BOOST_SP_ARM_HAS_LDREX
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
# define BOOST_SP_ARM_BARRIER ""
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class spinlock
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    int v_;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    bool try_lock()
 | 
			
		||||
    {
 | 
			
		||||
        int r;
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_SP_ARM_HAS_LDREX
 | 
			
		||||
 | 
			
		||||
        __asm__ __volatile__(
 | 
			
		||||
            "ldrex %0, [%2]; \n"
 | 
			
		||||
            "cmp %0, %1; \n"
 | 
			
		||||
            "strexne %0, %1, [%2]; \n"
 | 
			
		||||
            BOOST_SP_ARM_BARRIER :
 | 
			
		||||
            "=&r"( r ): // outputs
 | 
			
		||||
            "r"( 1 ), "r"( &v_ ): // inputs
 | 
			
		||||
            "memory", "cc" );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
        __asm__ __volatile__(
 | 
			
		||||
            "swp %0, %1, [%2];\n"
 | 
			
		||||
            BOOST_SP_ARM_BARRIER :
 | 
			
		||||
            "=&r"( r ): // outputs
 | 
			
		||||
            "r"( 1 ), "r"( &v_ ): // inputs
 | 
			
		||||
            "memory", "cc" );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        return r == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void lock()
 | 
			
		||||
    {
 | 
			
		||||
        for( unsigned k = 0; !try_lock(); ++k )
 | 
			
		||||
        {
 | 
			
		||||
            boost::detail::yield( k );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void unlock()
 | 
			
		||||
    {
 | 
			
		||||
        __asm__ __volatile__( BOOST_SP_ARM_BARRIER ::: "memory" );
 | 
			
		||||
        *const_cast< int volatile* >( &v_ ) = 0;
 | 
			
		||||
        __asm__ __volatile__( BOOST_SP_ARM_BARRIER ::: "memory" );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
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}
 | 
			
		||||
 | 
			
		||||
#undef BOOST_SP_ARM_BARRIER
 | 
			
		||||
#undef BOOST_SP_ARM_HAS_LDREX
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED
 | 
			
		||||
@@ -1,89 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_NT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SPINLOCK_NT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 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/assert.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class spinlock
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    bool locked_;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    inline bool try_lock()
 | 
			
		||||
    {
 | 
			
		||||
        if( locked_ )
 | 
			
		||||
        {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            locked_ = true;
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline void lock()
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( !locked_ );
 | 
			
		||||
        locked_ = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    inline void unlock()
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( locked_ );
 | 
			
		||||
        locked_ = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
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 { false }
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_NT_HPP_INCLUDED
 | 
			
		||||
@@ -1,91 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_POOL_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SPINLOCK_POOL_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  boost/detail/spinlock_pool.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 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)
 | 
			
		||||
//
 | 
			
		||||
//  spinlock_pool<0> is reserved for atomic<>, when/if it arrives
 | 
			
		||||
//  spinlock_pool<1> is reserved for shared_ptr reference counts
 | 
			
		||||
//  spinlock_pool<2> is reserved for shared_ptr atomic access
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/spinlock.hpp>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template< int M > class spinlock_pool
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    static spinlock pool_[ 41 ];
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    static spinlock & spinlock_for( void const * pv )
 | 
			
		||||
    {
 | 
			
		||||
#if defined(__VMS) && __INITIAL_POINTER_SIZE == 64  
 | 
			
		||||
        std::size_t i = reinterpret_cast< unsigned long long >( pv ) % 41;
 | 
			
		||||
#else  
 | 
			
		||||
        std::size_t i = reinterpret_cast< std::size_t >( pv ) % 41;
 | 
			
		||||
#endif  
 | 
			
		||||
        return pool_[ i ];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class scoped_lock
 | 
			
		||||
    {
 | 
			
		||||
    private:
 | 
			
		||||
 | 
			
		||||
        spinlock & sp_;
 | 
			
		||||
 | 
			
		||||
        scoped_lock( scoped_lock const & );
 | 
			
		||||
        scoped_lock & operator=( scoped_lock const & );
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
 | 
			
		||||
        explicit scoped_lock( void const * pv ): sp_( spinlock_for( pv ) )
 | 
			
		||||
        {
 | 
			
		||||
            sp_.lock();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ~scoped_lock()
 | 
			
		||||
        {
 | 
			
		||||
            sp_.unlock();
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< int M > spinlock spinlock_pool< M >::pool_[ 41 ] =
 | 
			
		||||
{
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, 
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, 
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, 
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, 
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, 
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, 
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, 
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, BOOST_DETAIL_SPINLOCK_INIT, 
 | 
			
		||||
    BOOST_DETAIL_SPINLOCK_INIT
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_POOL_HPP_INCLUDED
 | 
			
		||||
@@ -1,79 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_PT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SPINLOCK_PT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 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 <pthread.h>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class spinlock
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    pthread_mutex_t v_;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    bool try_lock()
 | 
			
		||||
    {
 | 
			
		||||
        return pthread_mutex_trylock( &v_ ) == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void lock()
 | 
			
		||||
    {
 | 
			
		||||
        pthread_mutex_lock( &v_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void unlock()
 | 
			
		||||
    {
 | 
			
		||||
        pthread_mutex_unlock( &v_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
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 { PTHREAD_MUTEX_INITIALIZER }
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_PT_HPP_INCLUDED
 | 
			
		||||
@@ -1,83 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_STD_ATOMIC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SPINLOCK_STD_ATOMIC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2014 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/yield_k.hpp>
 | 
			
		||||
#include <atomic>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class spinlock
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    std::atomic_flag v_;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    bool try_lock()
 | 
			
		||||
    {
 | 
			
		||||
        return !v_.test_and_set( std::memory_order_acquire );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void lock()
 | 
			
		||||
    {
 | 
			
		||||
        for( unsigned k = 0; !try_lock(); ++k )
 | 
			
		||||
        {
 | 
			
		||||
            boost::detail::yield( k );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void unlock()
 | 
			
		||||
    {
 | 
			
		||||
        v_ .clear( std::memory_order_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 { ATOMIC_FLAG_INIT }
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_STD_ATOMIC_HPP_INCLUDED
 | 
			
		||||
@@ -1,87 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/yield_k.hpp>
 | 
			
		||||
 | 
			
		||||
#if defined( __ia64__ ) && defined( __INTEL_COMPILER )
 | 
			
		||||
# include <ia64intrin.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class spinlock
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    int v_;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    bool try_lock()
 | 
			
		||||
    {
 | 
			
		||||
        int r = __sync_lock_test_and_set( &v_, 1 );
 | 
			
		||||
        return r == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void lock()
 | 
			
		||||
    {
 | 
			
		||||
        for( unsigned k = 0; !try_lock(); ++k )
 | 
			
		||||
        {
 | 
			
		||||
            boost::detail::yield( k );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void unlock()
 | 
			
		||||
    {
 | 
			
		||||
        __sync_lock_release( &v_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
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_SYNC_HPP_INCLUDED
 | 
			
		||||
@@ -1,113 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_W32_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_SPINLOCK_W32_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_interlocked.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/yield_k.hpp>
 | 
			
		||||
 | 
			
		||||
// BOOST_COMPILER_FENCE
 | 
			
		||||
 | 
			
		||||
#if defined(__INTEL_COMPILER)
 | 
			
		||||
 | 
			
		||||
#define BOOST_COMPILER_FENCE __memory_barrier();
 | 
			
		||||
 | 
			
		||||
#elif defined( _MSC_VER ) && _MSC_VER >= 1310
 | 
			
		||||
 | 
			
		||||
extern "C" void _ReadWriteBarrier();
 | 
			
		||||
#pragma intrinsic( _ReadWriteBarrier )
 | 
			
		||||
 | 
			
		||||
#define BOOST_COMPILER_FENCE _ReadWriteBarrier();
 | 
			
		||||
 | 
			
		||||
#elif defined(__GNUC__)
 | 
			
		||||
 | 
			
		||||
#define BOOST_COMPILER_FENCE __asm__ __volatile__( "" : : : "memory" );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#define BOOST_COMPILER_FENCE
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class spinlock
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    long v_;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    bool try_lock()
 | 
			
		||||
    {
 | 
			
		||||
        long r = BOOST_SP_INTERLOCKED_EXCHANGE( &v_, 1 );
 | 
			
		||||
 | 
			
		||||
        BOOST_COMPILER_FENCE
 | 
			
		||||
 | 
			
		||||
        return r == 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void lock()
 | 
			
		||||
    {
 | 
			
		||||
        for( unsigned k = 0; !try_lock(); ++k )
 | 
			
		||||
        {
 | 
			
		||||
            boost::detail::yield( k );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void unlock()
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_COMPILER_FENCE
 | 
			
		||||
        *const_cast< long volatile* >( &v_ ) = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
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_W32_HPP_INCLUDED
 | 
			
		||||
@@ -1,177 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
// MS compatible compilers support #pragma once
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
 | 
			
		||||
# pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  yield_k.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 Peter Dimov
 | 
			
		||||
//  Copyright (c) Microsoft Corporation 2014
 | 
			
		||||
//
 | 
			
		||||
//  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
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/predef.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) )
 | 
			
		||||
 | 
			
		||||
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 !BOOST_COMP_CLANG || !defined __MINGW32__
 | 
			
		||||
  extern "C" void __stdcall Sleep( unsigned long ms );
 | 
			
		||||
#else
 | 
			
		||||
#include <_mingw.h>
 | 
			
		||||
#if !defined __MINGW64_VERSION_MAJOR
 | 
			
		||||
  extern "C" void __stdcall Sleep( unsigned long ms );
 | 
			
		||||
#else
 | 
			
		||||
  extern "C" __declspec(dllimport) void __stdcall Sleep( unsigned long ms );
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
inline void yield( unsigned k )
 | 
			
		||||
{
 | 
			
		||||
    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
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
inline void yield( unsigned k )
 | 
			
		||||
{
 | 
			
		||||
    if( k < 4 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
#if defined( BOOST_SMT_PAUSE )
 | 
			
		||||
    else if( k < 16 )
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_SMT_PAUSE
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
    else if( k < 32 || k & 1 )
 | 
			
		||||
    {
 | 
			
		||||
        sched_yield();
 | 
			
		||||
    }
 | 
			
		||||
    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 );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
} // 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
 | 
			
		||||
@@ -1,165 +0,0 @@
 | 
			
		||||
#ifndef BOOST_ENABLE_SHARED_FROM_RAW_HPP_INCLUDED
 | 
			
		||||
#define BOOST_ENABLE_SHARED_FROM_RAW_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  enable_shared_from_raw.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2002, 2009, 2014 Peter Dimov
 | 
			
		||||
//  Copyright 2008-2009 Frank Mori Hess
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/shared_ptr.hpp>
 | 
			
		||||
#include <boost/weak_ptr.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/detail/workaround.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
template<typename T> boost::shared_ptr<T> shared_from_raw(T *);
 | 
			
		||||
template<typename T> boost::weak_ptr<T> weak_from_raw(T *);
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
template< class X, class Y > inline void sp_enable_shared_from_this( boost::shared_ptr<X> * ppx, Y const * py, boost::enable_shared_from_raw const * pe );
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
class enable_shared_from_raw
 | 
			
		||||
{
 | 
			
		||||
protected:
 | 
			
		||||
 | 
			
		||||
    enable_shared_from_raw()
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    enable_shared_from_raw( enable_shared_from_raw const & )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    enable_shared_from_raw & operator=( enable_shared_from_raw const & )
 | 
			
		||||
    {
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~enable_shared_from_raw()
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( shared_this_.use_count() <= 1 ); // make sure no dangling shared_ptr objects exist
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    void init_if_expired() const
 | 
			
		||||
    {
 | 
			
		||||
        if( weak_this_.expired() )
 | 
			
		||||
        {
 | 
			
		||||
            shared_this_.reset( static_cast<void*>(0), detail::esft2_deleter_wrapper() );
 | 
			
		||||
            weak_this_ = shared_this_;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void init_if_empty() const
 | 
			
		||||
    {
 | 
			
		||||
        if( weak_this_._empty() )
 | 
			
		||||
        {
 | 
			
		||||
            shared_this_.reset( static_cast<void*>(0), detail::esft2_deleter_wrapper() );
 | 
			
		||||
            weak_this_ = shared_this_;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
 | 
			
		||||
public:
 | 
			
		||||
#else
 | 
			
		||||
private:
 | 
			
		||||
    template<class Y> friend class shared_ptr;
 | 
			
		||||
    template<typename T> friend boost::shared_ptr<T> shared_from_raw(T *);
 | 
			
		||||
    template<typename T> friend boost::weak_ptr<T> weak_from_raw(T *);
 | 
			
		||||
    template< class X, class Y > friend inline void detail::sp_enable_shared_from_this( boost::shared_ptr<X> * ppx, Y const * py, boost::enable_shared_from_raw const * pe );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    shared_ptr<void const volatile> shared_from_this() const
 | 
			
		||||
    {
 | 
			
		||||
        init_if_expired();
 | 
			
		||||
        return shared_ptr<void const volatile>( weak_this_ );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    shared_ptr<void const volatile> shared_from_this() const volatile
 | 
			
		||||
    {
 | 
			
		||||
        return const_cast< enable_shared_from_raw const * >( this )->shared_from_this();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_ptr<void const volatile> weak_from_this() const
 | 
			
		||||
    {
 | 
			
		||||
        init_if_empty();
 | 
			
		||||
        return weak_this_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_ptr<void const volatile> weak_from_this() const volatile
 | 
			
		||||
    {
 | 
			
		||||
        return const_cast< enable_shared_from_raw const * >( this )->weak_from_this();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Note: invoked automatically by shared_ptr; do not call
 | 
			
		||||
    template<class X, class Y> void _internal_accept_owner( shared_ptr<X> * ppx, Y * ) const
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( ppx != 0 );
 | 
			
		||||
 | 
			
		||||
        if( weak_this_.expired() )
 | 
			
		||||
        {
 | 
			
		||||
            weak_this_ = *ppx;
 | 
			
		||||
        }
 | 
			
		||||
        else if( shared_this_.use_count() != 0 )
 | 
			
		||||
        {
 | 
			
		||||
            BOOST_ASSERT( ppx->unique() ); // no weak_ptrs should exist either, but there's no way to check that
 | 
			
		||||
 | 
			
		||||
            detail::esft2_deleter_wrapper * pd = boost::get_deleter<detail::esft2_deleter_wrapper>( shared_this_ );
 | 
			
		||||
            BOOST_ASSERT( pd != 0 );
 | 
			
		||||
 | 
			
		||||
            pd->set_deleter( *ppx );
 | 
			
		||||
 | 
			
		||||
            ppx->reset( shared_this_, ppx->get() );
 | 
			
		||||
            shared_this_.reset();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    mutable weak_ptr<void const volatile> weak_this_;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    mutable shared_ptr<void const volatile> shared_this_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
boost::shared_ptr<T> shared_from_raw(T *p)
 | 
			
		||||
{
 | 
			
		||||
    BOOST_ASSERT(p != 0);
 | 
			
		||||
    return boost::shared_ptr<T>(p->enable_shared_from_raw::shared_from_this(), p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
    return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
    template< class X, class Y > inline void sp_enable_shared_from_this( boost::shared_ptr<X> * ppx, Y const * py, boost::enable_shared_from_raw const * pe )
 | 
			
		||||
    {
 | 
			
		||||
        if( pe != 0 )
 | 
			
		||||
        {
 | 
			
		||||
            pe->_internal_accept_owner( ppx, const_cast< Y* >( py ) );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
} // namepsace detail
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_ENABLE_SHARED_FROM_RAW_HPP_INCLUDED
 | 
			
		||||
@@ -1,90 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  enable_shared_from_this.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright 2002, 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
 | 
			
		||||
//
 | 
			
		||||
//  http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/weak_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/shared_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_noexcept.hpp>
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template<class T> class enable_shared_from_this
 | 
			
		||||
{
 | 
			
		||||
protected:
 | 
			
		||||
 | 
			
		||||
    enable_shared_from_this() BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    enable_shared_from_this(enable_shared_from_this const &) BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    enable_shared_from_this & operator=(enable_shared_from_this const &) BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~enable_shared_from_this() BOOST_SP_NOEXCEPT // ~weak_ptr<T> newer throws, so this call also must not throw
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    shared_ptr<T> shared_from_this()
 | 
			
		||||
    {
 | 
			
		||||
        shared_ptr<T> p( weak_this_ );
 | 
			
		||||
        BOOST_ASSERT( p.get() == this );
 | 
			
		||||
        return p;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    shared_ptr<T const> shared_from_this() const
 | 
			
		||||
    {
 | 
			
		||||
        shared_ptr<T const> p( weak_this_ );
 | 
			
		||||
        BOOST_ASSERT( p.get() == this );
 | 
			
		||||
        return p;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_ptr<T> weak_from_this() BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return weak_this_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    weak_ptr<T const> weak_from_this() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return weak_this_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
public: // actually private, but avoids compiler template friendship issues
 | 
			
		||||
 | 
			
		||||
    // Note: invoked automatically by shared_ptr; do not call
 | 
			
		||||
    template<class X, class Y> void _internal_accept_owner( shared_ptr<X> const * ppx, Y * py ) const
 | 
			
		||||
    {
 | 
			
		||||
        if( weak_this_.expired() )
 | 
			
		||||
        {
 | 
			
		||||
            weak_this_ = shared_ptr<T>( *ppx, py );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    mutable weak_ptr<T> weak_this_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
 | 
			
		||||
@@ -1,361 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_INTRUSIVE_PTR_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_INTRUSIVE_PTR_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  intrusive_ptr.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2001, 2002 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/intrusive_ptr.html for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
 | 
			
		||||
#include <boost/assert.hpp>
 | 
			
		||||
#include <boost/detail/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>
 | 
			
		||||
 | 
			
		||||
#include <boost/config/no_tr1/functional.hpp>           // for std::less
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_IOSTREAM)
 | 
			
		||||
#if !defined(BOOST_NO_IOSFWD)
 | 
			
		||||
#include <iosfwd>               // for std::basic_ostream
 | 
			
		||||
#else
 | 
			
		||||
#include <ostream>
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  intrusive_ptr
 | 
			
		||||
//
 | 
			
		||||
//  A smart pointer that uses intrusive reference counting.
 | 
			
		||||
//
 | 
			
		||||
//  Relies on unqualified calls to
 | 
			
		||||
//  
 | 
			
		||||
//      void intrusive_ptr_add_ref(T * p);
 | 
			
		||||
//      void intrusive_ptr_release(T * p);
 | 
			
		||||
//
 | 
			
		||||
//          (p != 0)
 | 
			
		||||
//
 | 
			
		||||
//  The object is responsible for destroying itself.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
template<class T> class intrusive_ptr
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    typedef intrusive_ptr this_type;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    typedef T element_type;
 | 
			
		||||
 | 
			
		||||
    BOOST_CONSTEXPR intrusive_ptr() BOOST_SP_NOEXCEPT : px( 0 )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr( T * p, bool add_ref = true ): px( p )
 | 
			
		||||
    {
 | 
			
		||||
        if( px != 0 && add_ref ) intrusive_ptr_add_ref( px );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_MEMBER_TEMPLATES) || defined(BOOST_MSVC6_MEMBER_TEMPLATES)
 | 
			
		||||
 | 
			
		||||
    template<class U>
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr( intrusive_ptr<U> const & rhs, typename boost::detail::sp_enable_if_convertible<U,T>::type = boost::detail::sp_empty() )
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr( intrusive_ptr<U> const & rhs )
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
    : px( rhs.get() )
 | 
			
		||||
    {
 | 
			
		||||
        if( px != 0 ) intrusive_ptr_add_ref( px );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr(intrusive_ptr const & rhs): px( rhs.px )
 | 
			
		||||
    {
 | 
			
		||||
        if( px != 0 ) intrusive_ptr_add_ref( px );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~intrusive_ptr()
 | 
			
		||||
    {
 | 
			
		||||
        if( px != 0 ) intrusive_ptr_release( px );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_MEMBER_TEMPLATES) || defined(BOOST_MSVC6_MEMBER_TEMPLATES)
 | 
			
		||||
 | 
			
		||||
    template<class U> intrusive_ptr & operator=(intrusive_ptr<U> const & rhs)
 | 
			
		||||
    {
 | 
			
		||||
        this_type(rhs).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Move support
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr(intrusive_ptr && rhs) BOOST_SP_NOEXCEPT : px( rhs.px )
 | 
			
		||||
    {
 | 
			
		||||
        rhs.px = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr & operator=(intrusive_ptr && rhs) BOOST_SP_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        this_type( static_cast< intrusive_ptr && >( rhs ) ).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class U> friend class intrusive_ptr;
 | 
			
		||||
 | 
			
		||||
    template<class U>
 | 
			
		||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr(intrusive_ptr<U> && rhs, typename boost::detail::sp_enable_if_convertible<U,T>::type = boost::detail::sp_empty())
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr(intrusive_ptr<U> && rhs)
 | 
			
		||||
 | 
			
		||||
#endif        
 | 
			
		||||
    : px( rhs.px )
 | 
			
		||||
    {
 | 
			
		||||
        rhs.px = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class U>
 | 
			
		||||
    intrusive_ptr & operator=(intrusive_ptr<U> && rhs) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        this_type( static_cast< intrusive_ptr<U> && >( rhs ) ).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr & operator=(intrusive_ptr const & rhs)
 | 
			
		||||
    {
 | 
			
		||||
        this_type(rhs).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    intrusive_ptr & operator=(T * rhs)
 | 
			
		||||
    {
 | 
			
		||||
        this_type(rhs).swap(*this);
 | 
			
		||||
        return *this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void reset() BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        this_type().swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void reset( T * rhs )
 | 
			
		||||
    {
 | 
			
		||||
        this_type( rhs ).swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void reset( T * rhs, bool add_ref )
 | 
			
		||||
    {
 | 
			
		||||
        this_type( rhs, add_ref ).swap( *this );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T * get() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T * detach() BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        T * ret = px;
 | 
			
		||||
        px = 0;
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T & operator*() const
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( px != 0 );
 | 
			
		||||
        return *px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T * operator->() const
 | 
			
		||||
    {
 | 
			
		||||
        BOOST_ASSERT( px != 0 );
 | 
			
		||||
        return px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
// implicit conversion to "bool"
 | 
			
		||||
#include <boost/smart_ptr/detail/operator_bool.hpp>
 | 
			
		||||
 | 
			
		||||
    void swap(intrusive_ptr & rhs) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        T * tmp = px;
 | 
			
		||||
        px = rhs.px;
 | 
			
		||||
        rhs.px = tmp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    T * px;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator==(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return a.get() == b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator!=(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator==(intrusive_ptr<T> const & a, U * b)
 | 
			
		||||
{
 | 
			
		||||
    return a.get() == b;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator!=(intrusive_ptr<T> const & a, U * b)
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator==(T * a, intrusive_ptr<U> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return a == b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> inline bool operator!=(T * a, intrusive_ptr<U> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return a != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if __GNUC__ == 2 && __GNUC_MINOR__ <= 96
 | 
			
		||||
 | 
			
		||||
// Resolve the ambiguity between our op!= and the one in rel_ops
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=(intrusive_ptr<T> const & a, intrusive_ptr<T> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return a.get() != b.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( intrusive_ptr<T> const & p, boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator==( boost::detail::sp_nullptr_t, intrusive_ptr<T> const & p ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( intrusive_ptr<T> const & p, boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator!=( boost::detail::sp_nullptr_t, intrusive_ptr<T> const & p ) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    return p.get() != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class T> inline bool operator<(intrusive_ptr<T> const & a, intrusive_ptr<T> const & b)
 | 
			
		||||
{
 | 
			
		||||
    return std::less<T *>()(a.get(), b.get());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T> void swap(intrusive_ptr<T> & lhs, intrusive_ptr<T> & rhs)
 | 
			
		||||
{
 | 
			
		||||
    lhs.swap(rhs);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// mem_fn support
 | 
			
		||||
 | 
			
		||||
template<class T> T * get_pointer(intrusive_ptr<T> const & p)
 | 
			
		||||
{
 | 
			
		||||
    return p.get();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> intrusive_ptr<T> static_pointer_cast(intrusive_ptr<U> const & p)
 | 
			
		||||
{
 | 
			
		||||
    return static_cast<T *>(p.get());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> intrusive_ptr<T> const_pointer_cast(intrusive_ptr<U> const & p)
 | 
			
		||||
{
 | 
			
		||||
    return const_cast<T *>(p.get());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T, class U> intrusive_ptr<T> dynamic_pointer_cast(intrusive_ptr<U> const & p)
 | 
			
		||||
{
 | 
			
		||||
    return dynamic_cast<T *>(p.get());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// operator<<
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_IOSTREAM)
 | 
			
		||||
 | 
			
		||||
#if defined(BOOST_NO_TEMPLATED_IOSTREAMS) || ( defined(__GNUC__) &&  (__GNUC__ < 3) )
 | 
			
		||||
 | 
			
		||||
template<class Y> std::ostream & operator<< (std::ostream & os, intrusive_ptr<Y> const & p)
 | 
			
		||||
{
 | 
			
		||||
    os << p.get();
 | 
			
		||||
    return os;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
// in STLport's no-iostreams mode no iostream symbols can be used
 | 
			
		||||
#ifndef _STLP_NO_IOSTREAMS
 | 
			
		||||
 | 
			
		||||
# if defined(BOOST_MSVC) && BOOST_WORKAROUND(BOOST_MSVC, < 1300 && __SGI_STL_PORT)
 | 
			
		||||
// MSVC6 has problems finding std::basic_ostream through the using declaration in namespace _STL
 | 
			
		||||
using std::basic_ostream;
 | 
			
		||||
template<class E, class T, class Y> basic_ostream<E, T> & operator<< (basic_ostream<E, T> & os, intrusive_ptr<Y> const & p)
 | 
			
		||||
# else
 | 
			
		||||
template<class E, class T, class Y> std::basic_ostream<E, T> & operator<< (std::basic_ostream<E, T> & os, intrusive_ptr<Y> const & p)
 | 
			
		||||
# endif 
 | 
			
		||||
{
 | 
			
		||||
    os << p.get();
 | 
			
		||||
    return os;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // _STLP_NO_IOSTREAMS
 | 
			
		||||
 | 
			
		||||
#endif // __GNUC__ < 3
 | 
			
		||||
 | 
			
		||||
#endif // !defined(BOOST_NO_IOSTREAM)
 | 
			
		||||
 | 
			
		||||
// hash_value
 | 
			
		||||
 | 
			
		||||
template< class T > struct hash;
 | 
			
		||||
 | 
			
		||||
template< class T > std::size_t hash_value( boost::intrusive_ptr<T> const & p )
 | 
			
		||||
{
 | 
			
		||||
    return boost::hash< T* >()( p.get() );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_INTRUSIVE_PTR_HPP_INCLUDED
 | 
			
		||||
@@ -1,187 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 *          Copyright Andrey Semashev 2007 - 2013.
 | 
			
		||||
 * 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)
 | 
			
		||||
 */
 | 
			
		||||
/*!
 | 
			
		||||
 * \file   intrusive_ref_counter.hpp
 | 
			
		||||
 * \author Andrey Semashev
 | 
			
		||||
 * \date   12.03.2009
 | 
			
		||||
 *
 | 
			
		||||
 * This header contains a reference counter class for \c intrusive_ptr.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef BOOST_SMART_PTR_INTRUSIVE_REF_COUNTER_HPP_INCLUDED_
 | 
			
		||||
#define BOOST_SMART_PTR_INTRUSIVE_REF_COUNTER_HPP_INCLUDED_
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/atomic_count.hpp>
 | 
			
		||||
 | 
			
		||||
#ifdef BOOST_HAS_PRAGMA_ONCE
 | 
			
		||||
#pragma once
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER)
 | 
			
		||||
#pragma warning(push)
 | 
			
		||||
// This is a bogus MSVC warning, which is flagged by friend declarations of intrusive_ptr_add_ref and intrusive_ptr_release in intrusive_ref_counter:
 | 
			
		||||
// 'name' : the inline specifier cannot be used when a friend declaration refers to a specialization of a function template
 | 
			
		||||
// Note that there is no inline specifier in the declarations.
 | 
			
		||||
#pragma warning(disable: 4396)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
namespace sp_adl_block {
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
 * \brief Thread unsafe reference counter policy for \c intrusive_ref_counter
 | 
			
		||||
 *
 | 
			
		||||
 * The policy instructs the \c intrusive_ref_counter base class to implement
 | 
			
		||||
 * a reference counter suitable for single threaded use only. Pointers to the same
 | 
			
		||||
 * object with this kind of reference counter must not be used by different threads.
 | 
			
		||||
 */
 | 
			
		||||
struct thread_unsafe_counter
 | 
			
		||||
{
 | 
			
		||||
    typedef unsigned int type;
 | 
			
		||||
 | 
			
		||||
    static unsigned int load(unsigned int const& counter) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return counter;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static void increment(unsigned int& counter) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        ++counter;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static unsigned int decrement(unsigned int& counter) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return --counter;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
 * \brief Thread safe reference counter policy for \c intrusive_ref_counter
 | 
			
		||||
 *
 | 
			
		||||
 * The policy instructs the \c intrusive_ref_counter base class to implement
 | 
			
		||||
 * a thread-safe reference counter, if the target platform supports multithreading.
 | 
			
		||||
 */
 | 
			
		||||
struct thread_safe_counter
 | 
			
		||||
{
 | 
			
		||||
    typedef boost::detail::atomic_count type;
 | 
			
		||||
 | 
			
		||||
    static unsigned int load(boost::detail::atomic_count const& counter) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast< unsigned int >(static_cast< long >(counter));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static void increment(boost::detail::atomic_count& counter) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        ++counter;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static unsigned int decrement(boost::detail::atomic_count& counter) BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return static_cast< unsigned int >(--counter);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< typename DerivedT, typename CounterPolicyT = thread_safe_counter >
 | 
			
		||||
class intrusive_ref_counter;
 | 
			
		||||
 | 
			
		||||
template< typename DerivedT, typename CounterPolicyT >
 | 
			
		||||
void intrusive_ptr_add_ref(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_NOEXCEPT;
 | 
			
		||||
template< typename DerivedT, typename CounterPolicyT >
 | 
			
		||||
void intrusive_ptr_release(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_NOEXCEPT;
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
 * \brief A reference counter base class
 | 
			
		||||
 *
 | 
			
		||||
 * This base class can be used with user-defined classes to add support
 | 
			
		||||
 * for \c intrusive_ptr. The class contains a reference counter defined by the \c CounterPolicyT.
 | 
			
		||||
 * Upon releasing the last \c intrusive_ptr referencing the object
 | 
			
		||||
 * derived from the \c intrusive_ref_counter class, operator \c delete
 | 
			
		||||
 * is automatically called on the pointer to the object.
 | 
			
		||||
 *
 | 
			
		||||
 * The other template parameter, \c DerivedT, is the user's class that derives from \c intrusive_ref_counter.
 | 
			
		||||
 */
 | 
			
		||||
template< typename DerivedT, typename CounterPolicyT >
 | 
			
		||||
class intrusive_ref_counter
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
    //! Reference counter type
 | 
			
		||||
    typedef typename CounterPolicyT::type counter_type;
 | 
			
		||||
    //! Reference counter
 | 
			
		||||
    mutable counter_type m_ref_counter;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    /*!
 | 
			
		||||
     * Default constructor
 | 
			
		||||
     *
 | 
			
		||||
     * \post <tt>use_count() == 0</tt>
 | 
			
		||||
     */
 | 
			
		||||
    intrusive_ref_counter() BOOST_NOEXCEPT : m_ref_counter(0)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*!
 | 
			
		||||
     * Copy constructor
 | 
			
		||||
     *
 | 
			
		||||
     * \post <tt>use_count() == 0</tt>
 | 
			
		||||
     */
 | 
			
		||||
    intrusive_ref_counter(intrusive_ref_counter const&) BOOST_NOEXCEPT : m_ref_counter(0)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*!
 | 
			
		||||
     * Assignment
 | 
			
		||||
     *
 | 
			
		||||
     * \post The reference counter is not modified after assignment
 | 
			
		||||
     */
 | 
			
		||||
    intrusive_ref_counter& operator= (intrusive_ref_counter const&) BOOST_NOEXCEPT { return *this; }
 | 
			
		||||
 | 
			
		||||
    /*!
 | 
			
		||||
     * \return The reference counter
 | 
			
		||||
     */
 | 
			
		||||
    unsigned int use_count() const BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return CounterPolicyT::load(m_ref_counter);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    /*!
 | 
			
		||||
     * Destructor
 | 
			
		||||
     */
 | 
			
		||||
    BOOST_DEFAULTED_FUNCTION(~intrusive_ref_counter(), {})
 | 
			
		||||
 | 
			
		||||
    friend void intrusive_ptr_add_ref< DerivedT, CounterPolicyT >(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_NOEXCEPT;
 | 
			
		||||
    friend void intrusive_ptr_release< DerivedT, CounterPolicyT >(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_NOEXCEPT;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< typename DerivedT, typename CounterPolicyT >
 | 
			
		||||
inline void intrusive_ptr_add_ref(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    CounterPolicyT::increment(p->m_ref_counter);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< typename DerivedT, typename CounterPolicyT >
 | 
			
		||||
inline void intrusive_ptr_release(const intrusive_ref_counter< DerivedT, CounterPolicyT >* p) BOOST_NOEXCEPT
 | 
			
		||||
{
 | 
			
		||||
    if (CounterPolicyT::decrement(p->m_ref_counter) == 0)
 | 
			
		||||
        delete static_cast< const DerivedT* >(p);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace sp_adl_block
 | 
			
		||||
 | 
			
		||||
using sp_adl_block::intrusive_ref_counter;
 | 
			
		||||
using sp_adl_block::thread_unsafe_counter;
 | 
			
		||||
using sp_adl_block::thread_safe_counter;
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER)
 | 
			
		||||
#pragma warning(pop)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // BOOST_SMART_PTR_INTRUSIVE_REF_COUNTER_HPP_INCLUDED_
 | 
			
		||||
@@ -1,22 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//  make_shared.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2007, 2008, 2012 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/make_shared.html
 | 
			
		||||
//  for documentation.
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/make_shared_object.hpp>
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) && !defined( BOOST_NO_SFINAE )
 | 
			
		||||
# include <boost/smart_ptr/make_shared_array.hpp>
 | 
			
		||||
# include <boost/smart_ptr/allocate_shared_array.hpp>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
 | 
			
		||||
@@ -1,66 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2012-2017 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_MAKE_SHARED_ARRAY_HPP
 | 
			
		||||
#define BOOST_SMART_PTR_MAKE_SHARED_ARRAY_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/smart_ptr/allocate_shared_array.hpp>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename detail::sp_if_size_array<T>::type
 | 
			
		||||
make_shared()
 | 
			
		||||
{
 | 
			
		||||
    return boost::allocate_shared<T>(std::allocator<typename
 | 
			
		||||
        detail::sp_array_scalar<T>::type>());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename detail::sp_if_size_array<T>::type
 | 
			
		||||
make_shared(const typename detail::sp_array_element<T>::type& value)
 | 
			
		||||
{
 | 
			
		||||
    return boost::allocate_shared<T>(std::allocator<typename
 | 
			
		||||
        detail::sp_array_scalar<T>::type>(), value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename detail::sp_if_array<T>::type
 | 
			
		||||
make_shared(std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
    return boost::allocate_shared<T>(std::allocator<typename
 | 
			
		||||
        detail::sp_array_scalar<T>::type>(), size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename detail::sp_if_array<T>::type
 | 
			
		||||
make_shared(std::size_t size,
 | 
			
		||||
    const typename detail::sp_array_element<T>::type& value)
 | 
			
		||||
{
 | 
			
		||||
    return boost::allocate_shared<T>(std::allocator<typename
 | 
			
		||||
        detail::sp_array_scalar<T>::type>(), size, value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename detail::sp_if_size_array<T>::type
 | 
			
		||||
make_shared_noinit()
 | 
			
		||||
{
 | 
			
		||||
    return allocate_shared_noinit<T>(std::allocator<typename
 | 
			
		||||
        detail::sp_array_scalar<T>::type>());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename detail::sp_if_array<T>::type
 | 
			
		||||
make_shared_noinit(std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
    return allocate_shared_noinit<T>(std::allocator<typename
 | 
			
		||||
        detail::sp_array_scalar<T>::type>(), size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} /* boost */
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,801 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//  make_shared_object.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2007, 2008, 2012 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0.
 | 
			
		||||
//  See accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/make_shared.html
 | 
			
		||||
//  for documentation.
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <boost/move/core.hpp>
 | 
			
		||||
#include <boost/move/utility_core.hpp>
 | 
			
		||||
#include <boost/smart_ptr/shared_ptr.hpp>
 | 
			
		||||
#include <boost/smart_ptr/detail/sp_forward.hpp>
 | 
			
		||||
#include <boost/type_traits/type_with_alignment.hpp>
 | 
			
		||||
#include <boost/type_traits/alignment_of.hpp>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
#include <new>
 | 
			
		||||
 | 
			
		||||
namespace boost
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
namespace detail
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
template< std::size_t N, std::size_t A > struct sp_aligned_storage
 | 
			
		||||
{
 | 
			
		||||
    union type
 | 
			
		||||
    {
 | 
			
		||||
        char data_[ N ];
 | 
			
		||||
        typename boost::type_with_alignment< A >::type align_;
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class T > class sp_ms_deleter
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type;
 | 
			
		||||
 | 
			
		||||
    bool initialized_;
 | 
			
		||||
    storage_type storage_;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    void destroy()
 | 
			
		||||
    {
 | 
			
		||||
        if( initialized_ )
 | 
			
		||||
        {
 | 
			
		||||
#if defined( __GNUC__ )
 | 
			
		||||
 | 
			
		||||
            // fixes incorrect aliasing warning
 | 
			
		||||
            T * p = reinterpret_cast< T* >( storage_.data_ );
 | 
			
		||||
            p->~T();
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
            reinterpret_cast< T* >( storage_.data_ )->~T();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
            initialized_ = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_ms_deleter() BOOST_NOEXCEPT : initialized_( false )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template<class A> explicit sp_ms_deleter( A const & ) BOOST_NOEXCEPT : initialized_( false )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // optimization: do not copy storage_
 | 
			
		||||
    sp_ms_deleter( sp_ms_deleter const & ) BOOST_NOEXCEPT : initialized_( false )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~sp_ms_deleter()
 | 
			
		||||
    {
 | 
			
		||||
        destroy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void operator()( T * )
 | 
			
		||||
    {
 | 
			
		||||
        destroy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static void operator_fn( T* ) // operator() can't be static
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * address() BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return storage_.data_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void set_initialized() BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        initialized_ = true;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class T, class A > class sp_as_deleter
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type;
 | 
			
		||||
 | 
			
		||||
    storage_type storage_;
 | 
			
		||||
    A a_;
 | 
			
		||||
    bool initialized_;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
 | 
			
		||||
    void destroy()
 | 
			
		||||
    {
 | 
			
		||||
        if( initialized_ )
 | 
			
		||||
        {
 | 
			
		||||
            T * p = reinterpret_cast< T* >( storage_.data_ );
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
 | 
			
		||||
 | 
			
		||||
            std::allocator_traits<A>::destroy( a_, p );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
            p->~T();
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
            initialized_ = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
 | 
			
		||||
    sp_as_deleter( A const & a ) BOOST_NOEXCEPT : a_( a ), initialized_( false )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // optimization: do not copy storage_
 | 
			
		||||
    sp_as_deleter( sp_as_deleter const & r ) BOOST_NOEXCEPT : a_( r.a_), initialized_( false )
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ~sp_as_deleter()
 | 
			
		||||
    {
 | 
			
		||||
        destroy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void operator()( T * )
 | 
			
		||||
    {
 | 
			
		||||
        destroy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static void operator_fn( T* ) // operator() can't be static
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void * address() BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        return storage_.data_;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void set_initialized() BOOST_NOEXCEPT
 | 
			
		||||
    {
 | 
			
		||||
        initialized_ = true;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template< class T > struct sp_if_not_array
 | 
			
		||||
{
 | 
			
		||||
    typedef boost::shared_ptr< T > type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 | 
			
		||||
 | 
			
		||||
template< class T > struct sp_if_not_array< T[] >
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if !defined( __BORLANDC__ ) || !BOOST_WORKAROUND( __BORLANDC__, < 0x600 )
 | 
			
		||||
 | 
			
		||||
template< class T, std::size_t N > struct sp_if_not_array< T[N] >
 | 
			
		||||
{
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace detail
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_FUNCTION_TEMPLATE_ORDERING )
 | 
			
		||||
# define BOOST_SP_MSD( T ) boost::detail::sp_inplace_tag< boost::detail::sp_ms_deleter< T > >()
 | 
			
		||||
#else
 | 
			
		||||
# define BOOST_SP_MSD( T ) boost::detail::sp_ms_deleter< T >()
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// _noinit versions
 | 
			
		||||
 | 
			
		||||
template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared_noinit()
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T;
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared_noinit( A const & a )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T;
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
// Variadic templates, rvalue reference
 | 
			
		||||
 | 
			
		||||
template< class T, class... Args > typename boost::detail::sp_if_not_array< T >::type make_shared( Args && ... args )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T( boost::detail::sp_forward<Args>( args )... );
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A, class... Args > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, Args && ... args )
 | 
			
		||||
{
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
 | 
			
		||||
 | 
			
		||||
    typedef typename std::allocator_traits<A>::template rebind_alloc<T> A2;
 | 
			
		||||
    A2 a2( a );
 | 
			
		||||
 | 
			
		||||
    typedef boost::detail::sp_as_deleter< T, A2 > D;
 | 
			
		||||
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_inplace_tag<D>(), a2 );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    typedef boost::detail::sp_ms_deleter< T > D;
 | 
			
		||||
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), boost::detail::sp_inplace_tag<D>(), a );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    D * pd = static_cast< D* >( pt._internal_get_untyped_deleter() );
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
#if !defined( BOOST_NO_CXX11_ALLOCATOR )
 | 
			
		||||
 | 
			
		||||
    std::allocator_traits<A2>::construct( a2, static_cast< T* >( pv ), boost::detail::sp_forward<Args>( args )... );
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T( boost::detail::sp_forward<Args>( args )... );
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
// Common zero-argument versions
 | 
			
		||||
 | 
			
		||||
template< class T > typename boost::detail::sp_if_not_array< T >::type make_shared()
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T();
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A > typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T();
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// C++03 version
 | 
			
		||||
 | 
			
		||||
template< class T, class A1 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A, class A1 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A1, class A2 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A, class A1, class A2 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A1, class A2, class A3 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A, class A1, class A2, class A3 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A1, class A2, class A3, class A4 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 ),
 | 
			
		||||
        boost::forward<A4>( a4 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A, class A1, class A2, class A3, class A4 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 ),
 | 
			
		||||
        boost::forward<A4>( a4 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A1, class A2, class A3, class A4, class A5 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 ),
 | 
			
		||||
        boost::forward<A4>( a4 ),
 | 
			
		||||
        boost::forward<A5>( a5 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 ),
 | 
			
		||||
        boost::forward<A4>( a4 ),
 | 
			
		||||
        boost::forward<A5>( a5 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 ),
 | 
			
		||||
        boost::forward<A4>( a4 ),
 | 
			
		||||
        boost::forward<A5>( a5 ),
 | 
			
		||||
        boost::forward<A6>( a6 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 ),
 | 
			
		||||
        boost::forward<A4>( a4 ),
 | 
			
		||||
        boost::forward<A5>( a5 ),
 | 
			
		||||
        boost::forward<A6>( a6 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 ),
 | 
			
		||||
        boost::forward<A4>( a4 ),
 | 
			
		||||
        boost::forward<A5>( a5 ),
 | 
			
		||||
        boost::forward<A6>( a6 ),
 | 
			
		||||
        boost::forward<A7>( a7 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 ),
 | 
			
		||||
        boost::forward<A4>( a4 ),
 | 
			
		||||
        boost::forward<A5>( a5 ),
 | 
			
		||||
        boost::forward<A6>( a6 ),
 | 
			
		||||
        boost::forward<A7>( a7 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 ),
 | 
			
		||||
        boost::forward<A4>( a4 ),
 | 
			
		||||
        boost::forward<A5>( a5 ),
 | 
			
		||||
        boost::forward<A6>( a6 ),
 | 
			
		||||
        boost::forward<A7>( a7 ),
 | 
			
		||||
        boost::forward<A8>( a8 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 ),
 | 
			
		||||
        boost::forward<A4>( a4 ),
 | 
			
		||||
        boost::forward<A5>( a5 ),
 | 
			
		||||
        boost::forward<A6>( a6 ),
 | 
			
		||||
        boost::forward<A7>( a7 ),
 | 
			
		||||
        boost::forward<A8>( a8 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8, BOOST_FWD_REF(A9) a9 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 ),
 | 
			
		||||
        boost::forward<A4>( a4 ),
 | 
			
		||||
        boost::forward<A5>( a5 ),
 | 
			
		||||
        boost::forward<A6>( a6 ),
 | 
			
		||||
        boost::forward<A7>( a7 ),
 | 
			
		||||
        boost::forward<A8>( a8 ),
 | 
			
		||||
        boost::forward<A9>( a9 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
 | 
			
		||||
typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8, BOOST_FWD_REF(A9) a9 )
 | 
			
		||||
{
 | 
			
		||||
    boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );
 | 
			
		||||
 | 
			
		||||
    void * pv = pd->address();
 | 
			
		||||
 | 
			
		||||
    ::new( pv ) T(
 | 
			
		||||
        boost::forward<A1>( a1 ),
 | 
			
		||||
        boost::forward<A2>( a2 ),
 | 
			
		||||
        boost::forward<A3>( a3 ),
 | 
			
		||||
        boost::forward<A4>( a4 ),
 | 
			
		||||
        boost::forward<A5>( a5 ),
 | 
			
		||||
        boost::forward<A6>( a6 ),
 | 
			
		||||
        boost::forward<A7>( a7 ),
 | 
			
		||||
        boost::forward<A8>( a8 ),
 | 
			
		||||
        boost::forward<A9>( a9 )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    pd->set_initialized();
 | 
			
		||||
 | 
			
		||||
    T * pt2 = static_cast< T* >( pv );
 | 
			
		||||
 | 
			
		||||
    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
 | 
			
		||||
    return boost::shared_ptr< T >( pt, pt2 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
 | 
			
		||||
 | 
			
		||||
#undef BOOST_SP_MSD
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_OBJECT_HPP_INCLUDED
 | 
			
		||||
@@ -1,110 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2012-2015 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_MAKE_UNIQUE_HPP
 | 
			
		||||
#define BOOST_SMART_PTR_MAKE_UNIQUE_HPP
 | 
			
		||||
 | 
			
		||||
#include <boost/config.hpp>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <utility>
 | 
			
		||||
 | 
			
		||||
namespace boost {
 | 
			
		||||
namespace detail {
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct up_if_object {
 | 
			
		||||
    typedef std::unique_ptr<T> type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct up_if_object<T[]> { };
 | 
			
		||||
 | 
			
		||||
template<class T, std::size_t N>
 | 
			
		||||
struct up_if_object<T[N]> { };
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct up_if_array { };
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct up_if_array<T[]> {
 | 
			
		||||
    typedef std::unique_ptr<T[]> type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct up_remove_reference {
 | 
			
		||||
    typedef T type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct up_remove_reference<T&> {
 | 
			
		||||
    typedef T type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct up_remove_reference<T&&> {
 | 
			
		||||
    typedef T type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct up_element { };
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
struct up_element<T[]> {
 | 
			
		||||
    typedef T type;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} /* detail */
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename detail::up_if_object<T>::type
 | 
			
		||||
make_unique()
 | 
			
		||||
{
 | 
			
		||||
    return std::unique_ptr<T>(new T());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 | 
			
		||||
template<class T, class... Args>
 | 
			
		||||
inline typename detail::up_if_object<T>::type
 | 
			
		||||
make_unique(Args&&... args)
 | 
			
		||||
{
 | 
			
		||||
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename detail::up_if_object<T>::type
 | 
			
		||||
make_unique(typename detail::up_remove_reference<T>::type&& value)
 | 
			
		||||
{
 | 
			
		||||
    return std::unique_ptr<T>(new T(std::move(value)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename detail::up_if_object<T>::type
 | 
			
		||||
make_unique_noinit()
 | 
			
		||||
{
 | 
			
		||||
    return std::unique_ptr<T>(new T);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename detail::up_if_array<T>::type
 | 
			
		||||
make_unique(std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
    return std::unique_ptr<T>(new typename
 | 
			
		||||
        detail::up_element<T>::type[size]());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<class T>
 | 
			
		||||
inline typename detail::up_if_array<T>::type
 | 
			
		||||
make_unique_noinit(std::size_t size)
 | 
			
		||||
{
 | 
			
		||||
    return std::unique_ptr<T>(new typename
 | 
			
		||||
        detail::up_element<T>::type[size]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} /* boost */
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -1,34 +0,0 @@
 | 
			
		||||
#ifndef BOOST_SMART_PTR_OWNER_LESS_HPP_INCLUDED
 | 
			
		||||
#define BOOST_SMART_PTR_OWNER_LESS_HPP_INCLUDED
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//  owner_less.hpp
 | 
			
		||||
//
 | 
			
		||||
//  Copyright (c) 2008 Frank Mori Hess
 | 
			
		||||
//  Copyright (c) 2016 Peter Dimov
 | 
			
		||||
//
 | 
			
		||||
//  Distributed under the Boost Software License, Version 1.0. (See
 | 
			
		||||
//  accompanying file LICENSE_1_0.txt or copy at
 | 
			
		||||
//  http://www.boost.org/LICENSE_1_0.txt)
 | 
			
		||||
//
 | 
			
		||||
//  See http://www.boost.org/libs/smart_ptr/smart_ptr.htm for documentation.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
    {
 | 
			
		||||
        return u.owner_before( v );
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace boost
 | 
			
		||||
 | 
			
		||||
#endif  // #ifndef BOOST_SMART_PTR_OWNER_LESS_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