mirror of
https://github.com/boostorg/multi_index.git
synced 2026-07-21 13:23:43 +00:00
removed C++03 polyfills (#90)
* removed simulated variadic function args * removed detail/allocator_traits.hpp in favor of Boost.Core functionality * removed usage of Boost.Move * avoided pessimizing-move warnings * removed usage of BOOST_DEDUCED_TYPENAME * removed usage of BOOST_NO_CXX11_HDR_INITIALIZER_LIST * removed usage of BOOST_NO_MEMBER_TEMPLATES * removed usage of BOOST_NO_SFINAE * removed leftover pp line * removed usage of BOOST_NO_MEMBER_TEMPLATE_FRIENDS * removed usage of BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP * removed usage of BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL * removed usage of BOOST_NO_CXX11_HDR_TYPE_TRAITS * removed usage of BOOST_NO_CXX11_HDR_RANDOM * removed usage of BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS * removed usage of BOOST_NO_CXX11_DECLTYPE * removed workarounds for pre-C++11 compilers * updated dependencies * removed usage of BOOST_MULTI_INDEX_MEMBER and similar in examples * updated docs * added C++11 badge * updated as per Alexander Grund's review * editorial * removed unneeded #includes
This commit is contained in:
+2
-2
@@ -3,12 +3,13 @@
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
cmake_minimum_required(VERSION 3.5...3.16)
|
||||
cmake_minimum_required(VERSION 3.8...3.16)
|
||||
|
||||
project(boost_multi_index VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
|
||||
|
||||
add_library(boost_multi_index INTERFACE)
|
||||
add_library(Boost::multi_index ALIAS boost_multi_index)
|
||||
target_compile_features(boost_multi_index INTERFACE cxx_std_11)
|
||||
|
||||
target_include_directories(boost_multi_index INTERFACE include)
|
||||
|
||||
@@ -20,7 +21,6 @@ target_link_libraries(boost_multi_index
|
||||
Boost::container_hash
|
||||
Boost::core
|
||||
Boost::integer
|
||||
Boost::move
|
||||
Boost::mp11
|
||||
Boost::preprocessor
|
||||
Boost::smart_ptr
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
[](https://github.com/boostorg/multi_index/tree/master) [](https://github.com/boostorg/multi_index/actions/workflows/ci.yml) [](https://drone.cpp.al/boostorg/multi_index) [](https://pdimov.github.io/boostdep-report/master/multi_index.html) [](https://www.boost.org/doc/libs/master/libs/multi_index) [](https://regression.boost.org/master/developer/multi_index.html)<br/>
|
||||
[](https://github.com/boostorg/multi_index/tree/develop) [](https://github.com/boostorg/multi_index/actions/workflows/ci.yml) [](https://drone.cpp.al/boostorg/multi_index) [](https://pdimov.github.io/boostdep-report/develop/multi_index.html) [](https://www.boost.org/doc/libs/develop/libs/multi_index) [](https://regression.boost.org/develop/developer/multi_index.html)<br/>
|
||||
[](https://www.boost.org/users/license.html) <img alt="Header-only library" src="https://img.shields.io/badge/build-header--only-blue.svg">
|
||||
[](https://www.boost.org/users/license.html) <img alt="C++11 required" src="https://img.shields.io/badge/standard-C%2b%2b11-blue.svg"> <img alt="Header-only library" src="https://img.shields.io/badge/build-header--only-blue.svg">
|
||||
|
||||
[Boost.MultiIndex](http://boost.org/libs/multi_index) provides a class template
|
||||
named `multi_index_container` which enables the construction of containers
|
||||
|
||||
@@ -12,7 +12,6 @@ constant boost_dependencies :
|
||||
/boost/container_hash//boost_container_hash
|
||||
/boost/core//boost_core
|
||||
/boost/integer//boost_integer
|
||||
/boost/move//boost_move
|
||||
/boost/mp11//boost_mp11
|
||||
/boost/preprocessor//boost_preprocessor
|
||||
/boost/smart_ptr//boost_smart_ptr
|
||||
|
||||
@@ -1,234 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0.1 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Boost.MultiIndex Documentation - Compiler specifics</title>
|
||||
<link rel="stylesheet" href="style.css" type="text/css">
|
||||
<link rel="start" href="index.html">
|
||||
<link rel="prev" href="reference/key_extraction.html">
|
||||
<link rel="up" href="index.html">
|
||||
<link rel="next" href="performance.html">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1><img src="../../../boost.png" alt="boost.png (6897 bytes)" align=
|
||||
"middle" width="277" height="86">Boost.MultiIndex Compiler specifics</h1>
|
||||
|
||||
<div class="prev_link"><a href="reference/key_extraction.html"><img src="prev.gif" alt="key extraction" border="0"><br>
|
||||
Key extraction
|
||||
</a></div>
|
||||
<div class="up_link"><a href="index.html"><img src="up.gif" alt="index" border="0"><br>
|
||||
Index
|
||||
</a></div>
|
||||
<div class="next_link"><a href="performance.html"><img src="next.gif" alt="performance" border="0"><br>
|
||||
Performance
|
||||
</a></div><br clear="all" style="clear: all;">
|
||||
|
||||
<hr>
|
||||
|
||||
<p>
|
||||
Boost.MultiIndex utilizes some C++11 capabilities but is also equipped
|
||||
to work reasonably well in decent C++03-compliant environments.
|
||||
We list some of the possible limitations along with suitable workarounds when available.
|
||||
</p>
|
||||
|
||||
<h2>Contents</h2>
|
||||
|
||||
<ul>
|
||||
<li><a href="#move">Move semantics</a></li>
|
||||
<li><a href="#allocator_awareness">Allocator awareness</a></li>
|
||||
<li><a href="#emplace">Emplace functions</a></li>
|
||||
<li><a href="#initializer_list">Initializer lists</a></li>
|
||||
<li><a href="#tuple">Tuples</a></li>
|
||||
<li><a href="#legacy">Legacy compilers</a></li>
|
||||
</ul>
|
||||
|
||||
<h2><a name="move">Move semantics</a></h2>
|
||||
|
||||
<p>
|
||||
Boost.MultiIndex uses <a href="../../../doc/html/move.html">Boost.Move</a>
|
||||
to support compilers without rvalue references. In such scenarios, taking
|
||||
advantage of <code>multi_index_container<Value></code> capabilities for
|
||||
increased efficiency in insertion and handling of moveable-only elements will
|
||||
require that <code>Value</code> be suitably instrumented.
|
||||
</p>
|
||||
|
||||
<h2><a name="allocator_awareness">Allocator awareness</a></h2>
|
||||
|
||||
<p>
|
||||
In pre-C++11 compilers or defective environments without proper
|
||||
<a href="https://en.cppreference.com/w/cpp/named_req/AllocatorAwareContainer">allocator
|
||||
awareness</a> machinery (basically, <code>std::allocator_traits</code>),
|
||||
Boost.MultiIndex behaves as if
|
||||
<code>std::allocator_traits<allocator_type>::propagate_on_container_*::value</code>
|
||||
were <code>false</code> for all allocators.
|
||||
</p>
|
||||
|
||||
<h2><a name="emplace">Emplace functions</a></h2>
|
||||
|
||||
<p>
|
||||
In compilers without variadic template support, Boost.MultiIndex emplace
|
||||
functions emulate this missing functionality by accepting up to
|
||||
<code>BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS</code>
|
||||
construction arguments that are internally forwarded with
|
||||
<a href="../../../doc/html/move.html">Boost.Move</a>:
|
||||
only constant lvalue references and rvalues are permitted as construction arguments
|
||||
in such case.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<code>BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS</code>, which by default is 5, can
|
||||
be globally defined by the user to a different value.
|
||||
</p>
|
||||
|
||||
<h2><a name="initializer_list">Initializer lists</a></h2>
|
||||
|
||||
<p>
|
||||
No transparent emulation of this functionality can be provided in the absence of
|
||||
<code>std::initializer_list</code>: consider
|
||||
<a href="../../../libs/assign/index.html">Boost.Assign</a> as a
|
||||
possible replacement.
|
||||
</p>
|
||||
|
||||
<h2><a name="tuple">Tuples</a></h2>
|
||||
|
||||
<p>
|
||||
Everywhere where <code>std::tuple</code>s are used in the library interface,
|
||||
<code>boost::tuple</code>s can be resorted to in their place. The converse, however,
|
||||
is not true.
|
||||
</p>
|
||||
|
||||
<h2><a name="legacy">Legacy compilers</a></h2>
|
||||
|
||||
<p>
|
||||
Boost.MultiIndex support for legacy compilers is not actively kept, so if you happen
|
||||
to work with an old environment you might need to use a former version of the library.
|
||||
A table is provided of some legacy compilers along with the latest version of
|
||||
Boost.MultiIndex known to work for them (frequently with limitations as explained
|
||||
in the corresponding compiler specifics section). If you successfully try one of those
|
||||
with newer versions of Boost.MultiIndex than stated here, please report back so that
|
||||
the information can be updated.
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<table cellspacing="0" cellpadding="5">
|
||||
<caption><b>Support for legacy compilers.</b></caption>
|
||||
<tr>
|
||||
<th>Compiler</th>
|
||||
<th>Latest known<br>compatible version</th>
|
||||
<th>Date</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Borland C++ Builder 6.4 through 2006, CodeGear C++Builder 2010</td>
|
||||
<td>Never worked with Boost.MultiIndex</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr class="odd_tr">
|
||||
<td>Comeau C/C++ 4.3.10.1 for Windows (VC++ 9.0 backend)</td>
|
||||
<td><a href="http://www.boost.org/doc/libs/1_38_0/libs/multi_index/doc/compiler_specifics.html#comeau_43101_win_vc7_71">Boost 1.38</a></td>
|
||||
<td>February 2009</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Compaq C++ 6.5-042 through 7.1-006 for Tru64 UNIX</td>
|
||||
<td><a href="http://www.boost.org/doc/libs/1_38_0/libs/multi_index/doc/compiler_specifics.html#compaq_65">Boost 1.38</a></td>
|
||||
<td>February 2009</td>
|
||||
</tr>
|
||||
<tr class="odd_tr">
|
||||
<td>GCC 3.2 through 3.4</td>
|
||||
<td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#gcc_32">Boost 1.41</a></td>
|
||||
<td>November 2009</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>HP aC++ A.06.12 through A.06.17 for HP-UX IA64</td>
|
||||
<td><a href="http://www.boost.org/doc/libs/1_38_0/libs/multi_index/doc/compiler_specifics.html#acc_612_ia64">Boost 1.38</a></td>
|
||||
<td>February 2009</td>
|
||||
</tr>
|
||||
<tr class="odd_tr">
|
||||
<td>HP aC++ A.03.80 through A.03.85 for HP-UX PA-RISC</td>
|
||||
<td><a href="http://www.boost.org/doc/libs/1_38_0/libs/multi_index/doc/compiler_specifics.html#acc_380_pa_risc">Boost 1.38</a></td>
|
||||
<td>February 2009</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>IBM VisualAge C++ V6.0 for AIX</td>
|
||||
<td><a href="http://www.boost.org/doc/libs/1_33_1/libs/multi_index/doc/compiler_specifics.html#va_60">Boost 1.33.1</a></td>
|
||||
<td>December 2006</td>
|
||||
</tr>
|
||||
<tr class="odd_tr">
|
||||
<td>IBM XL C/C++ V9.0 through V10.1 for AIX</td>
|
||||
<td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#xl_90">Boost 1.41</a></td>
|
||||
<td>November 2009</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Intel C++ Compiler for Linux 8.1 through 11.1</td>
|
||||
<td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#intel_81_lin">Boost 1.41</a></td>
|
||||
<td>November 2009</td>
|
||||
</tr>
|
||||
<tr class="odd_tr">
|
||||
<td>Intel C++ Compiler for Mac OS 9.1 through 11.0</td>
|
||||
<td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#intel_91_mac">Boost 1.41</a></td>
|
||||
<td>November 2009</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Intel C++ Compiler for Windows 32-bit 8.0 through 11.1</td>
|
||||
<td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#intel_80_win">Boost 1.41</a></td>
|
||||
<td>November 2009</td>
|
||||
</tr>
|
||||
<tr class="odd_tr">
|
||||
<td>Intel C++ Compiler for Windows 64-bit 10.0 through 11.11</td>
|
||||
<td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#intel_100_win64">Boost 1.41</a></td>
|
||||
<td>November 2009</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Metrowerks CodeWarrior 8.3</td>
|
||||
<td><a href="http://www.boost.org/doc/libs/1_36_0/libs/multi_index/doc/compiler_specifics.html#cw_83">Boost 1.36</a></td>
|
||||
<td>August 2008</td>
|
||||
</tr>
|
||||
<tr class="odd_tr">
|
||||
<td>Metrowerks CodeWarrior 9 through 9.5</td>
|
||||
<td><a href="http://www.boost.org/doc/libs/1_34_1/libs/multi_index/doc/compiler_specifics.html#cw_9x">Boost 1.34.1</a></td>
|
||||
<td>July 2007</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Microsoft Visual C++ 6.0 Service Pack 5</td>
|
||||
<td><a href="http://www.boost.org/doc/libs/1_36_0/libs/multi_index/doc/compiler_specifics.html#msvc_60">Boost 1.36</a></td>
|
||||
<td>August 2008</td>
|
||||
</tr>
|
||||
<tr class="odd_tr">
|
||||
<td>Microsoft Visual C++ 7.0</td>
|
||||
<td><a href="http://www.boost.org/doc/libs/1_35_0/libs/multi_index/doc/compiler_specifics.html#msvc_70">Boost 1.35</a></td>
|
||||
<td>March 2008</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Sun Studio 10 through 12 Update 1 for Solaris</td>
|
||||
<td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#sun_10">Boost 1.41</a></td>
|
||||
<td>November 2009</td>
|
||||
</tr>
|
||||
</table>
|
||||
</p>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="prev_link"><a href="reference/key_extraction.html"><img src="prev.gif" alt="key extraction" border="0"><br>
|
||||
Key extraction
|
||||
</a></div>
|
||||
<div class="up_link"><a href="index.html"><img src="up.gif" alt="index" border="0"><br>
|
||||
Index
|
||||
</a></div>
|
||||
<div class="next_link"><a href="performance.html"><img src="next.gif" alt="performance" border="0"><br>
|
||||
Performance
|
||||
</a></div><br clear="all" style="clear: all;">
|
||||
|
||||
<br>
|
||||
|
||||
<p>Revised November 1st 2025</p>
|
||||
|
||||
<p>© Copyright 2003-2025 Joaquín M López Muñoz.
|
||||
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>)
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
+2
-3
@@ -67,7 +67,6 @@ examples of use developed in the documentation:
|
||||
<ul>
|
||||
<li><a href="tutorial/index.html">Tutorial</a></li>
|
||||
<li><a href="reference/index.html">Reference</a></li>
|
||||
<li><a href="compiler_specifics.html">Compiler specifics</a></li>
|
||||
<li><a href="performance.html">Performance</a></li>
|
||||
<li><a href="examples.html">Examples</a></li>
|
||||
<li><a href="tests.html">Tests</a></li>
|
||||
@@ -86,9 +85,9 @@ Tutorial
|
||||
|
||||
<br>
|
||||
|
||||
<p>Revised April 19th 2015</p>
|
||||
<p>Revised November 7th 2025</p>
|
||||
|
||||
<p>© Copyright 2003-2015 Joaquín M López Muñoz.
|
||||
<p>© Copyright 2003-2025 Joaquín M López Muñoz.
|
||||
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">
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<title>Boost.MultiIndex Documentation - Performance</title>
|
||||
<link rel="stylesheet" href="style.css" type="text/css">
|
||||
<link rel="start" href="index.html">
|
||||
<link rel="prev" href="compiler_specifics.html">
|
||||
<link rel="prev" href="reference/key_extraction.html">
|
||||
<link rel="up" href="index.html">
|
||||
<link rel="next" href="examples.html">
|
||||
</head>
|
||||
@@ -15,8 +15,8 @@
|
||||
<h1><img src="../../../boost.png" alt="boost.png (6897 bytes)" align=
|
||||
"middle" width="277" height="86">Boost.MultiIndex Performance</h1>
|
||||
|
||||
<div class="prev_link"><a href="compiler_specifics.html"><img src="prev.gif" alt="compiler specifics" border="0"><br>
|
||||
Compiler specifics
|
||||
<div class="prev_link"><a href="reference/key_extraction.html"><img src="prev.gif" alt="key extraction" border="0"><br>
|
||||
Key extraction
|
||||
</a></div>
|
||||
<div class="up_link"><a href="index.html"><img src="up.gif" alt="index" border="0"><br>
|
||||
Index
|
||||
@@ -737,8 +737,8 @@ some improvements both in space consumption and execution time.
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="prev_link"><a href="compiler_specifics.html"><img src="prev.gif" alt="compiler specifics" border="0"><br>
|
||||
Compiler specifics
|
||||
<div class="prev_link"><a href="reference/key_extraction.html"><img src="prev.gif" alt="key extraction" border="0"><br>
|
||||
Key extraction
|
||||
</a></div>
|
||||
<div class="up_link"><a href="index.html"><img src="up.gif" alt="index" border="0"><br>
|
||||
Index
|
||||
@@ -749,9 +749,9 @@ Examples
|
||||
|
||||
<br>
|
||||
|
||||
<p>Revised April 18th 2020</p>
|
||||
<p>Revised November 7th 2025</p>
|
||||
|
||||
<p>© Copyright 2003-2020 Joaquín M López Muñoz.
|
||||
<p>© Copyright 2003-2025 Joaquín M López Muñoz.
|
||||
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">
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<link rel="start" href="../index.html">
|
||||
<link rel="prev" href="rnd_indices.html">
|
||||
<link rel="up" href="index.html">
|
||||
<link rel="next" href="../compiler_specifics.html">
|
||||
<link rel="next" href="../performance.html">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@@ -21,8 +21,8 @@ Random access indices
|
||||
<div class="up_link"><a href="index.html"><img src="../up.gif" alt="Boost.MultiIndex reference" border="0"><br>
|
||||
Boost.MultiIndex reference
|
||||
</a></div>
|
||||
<div class="next_link"><a href="../compiler_specifics.html"><img src="../next.gif" alt="compiler specifics" border="0"><br>
|
||||
Compiler specifics
|
||||
<div class="next_link"><a href="../performance.html"><img src="../next.gif" alt="performance" border="0"><br>
|
||||
Performance
|
||||
</a></div><br clear="all" style="clear: all;">
|
||||
|
||||
<hr>
|
||||
@@ -2246,13 +2246,13 @@ Random access indices
|
||||
<div class="up_link"><a href="index.html"><img src="../up.gif" alt="Boost.MultiIndex reference" border="0"><br>
|
||||
Boost.MultiIndex reference
|
||||
</a></div>
|
||||
<div class="next_link"><a href="../compiler_specifics.html"><img src="../next.gif" alt="compiler specifics" border="0"><br>
|
||||
Compiler specifics
|
||||
<div class="next_link"><a href="../performance.html"><img src="../next.gif" alt="performance" border="0"><br>
|
||||
Performance
|
||||
</a></div><br clear="all" style="clear: all;">
|
||||
|
||||
<br>
|
||||
|
||||
<p>Revised November 3rd 2025</p>
|
||||
<p>Revised November 7th 2025</p>
|
||||
|
||||
<p>© Copyright 2003-2025 Joaquín M López Muñoz.
|
||||
Distributed under the Boost Software
|
||||
|
||||
@@ -99,6 +99,8 @@ Acknowledgements
|
||||
instead of a <code>boost::tuple</code> (and similarly for the rest of affected
|
||||
class templates).
|
||||
</li>
|
||||
<li>Removed internal workarounds and fallbacks to support pre-C++11 compilers.
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
@@ -504,7 +506,7 @@ Acknowledgements
|
||||
</li>
|
||||
<li>Random access indices provide <code>shrink_to_fit()</code>.</li>
|
||||
</ul>
|
||||
Refer to the <a href="compiler_specifics.html">compiler specifics</a> section for limitations
|
||||
Refer to the compiler specifics section for limitations
|
||||
on pre-C++11 compilers.
|
||||
</li>
|
||||
<li>The following classes are deprecated:
|
||||
@@ -823,8 +825,7 @@ Acknowledgements
|
||||
Boost 1.32 release. This results in much shorter and more readable error
|
||||
messages and has also a beneficial impact on compilers with strict limits on
|
||||
symbol name lengths. Additionally, a section on further
|
||||
<a href="compiler_specifics.html#symbol_reduction">reduction of symbol name
|
||||
lengths</a> has been added.
|
||||
reduction of symbol name lengths has been added.
|
||||
</li>
|
||||
<li>Restructured some parts of the documentation, new examples.</li>
|
||||
<li>Maintenance fixes.</li>
|
||||
@@ -845,7 +846,7 @@ Acknowledgements
|
||||
|
||||
<br>
|
||||
|
||||
<p>Revised November 3rd 2025</p>
|
||||
<p>Revised November 7th 2025</p>
|
||||
|
||||
<p>© Copyright 2003-2025 Joaquín M López Muñoz.
|
||||
Distributed under the Boost Software
|
||||
|
||||
+4
-8
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex basic example.
|
||||
*
|
||||
* Copyright 2003-2022 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -47,10 +47,6 @@ struct id{};
|
||||
struct name{};
|
||||
struct age{};
|
||||
|
||||
/* see Compiler specifics: Use of member_offset for info on
|
||||
* BOOST_MULTI_INDEX_MEMBER
|
||||
*/
|
||||
|
||||
/* Define a multi_index_container of employees with following indices:
|
||||
* - a unique index sorted by employee::id,
|
||||
* - a non-unique index sorted by employee::name,
|
||||
@@ -61,11 +57,11 @@ typedef multi_index_container<
|
||||
employee,
|
||||
indexed_by<
|
||||
ordered_unique<
|
||||
tag<id>, BOOST_MULTI_INDEX_MEMBER(employee,int,id)>,
|
||||
tag<id>, member<employee,int,&employee::id> >,
|
||||
ordered_non_unique<
|
||||
tag<name>,BOOST_MULTI_INDEX_MEMBER(employee,std::string,name)>,
|
||||
tag<name>,member<employee,std::string,&employee::name> >,
|
||||
ordered_non_unique<
|
||||
tag<age>, BOOST_MULTI_INDEX_MEMBER(employee,int,age)> >
|
||||
tag<age>, member<employee,int,&employee::age> > >
|
||||
> employee_set;
|
||||
|
||||
template<typename Tag,typename MultiIndexContainer>
|
||||
|
||||
+1
-45
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex example of a bidirectional map.
|
||||
*
|
||||
* Copyright 2003-2009 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -44,30 +44,6 @@ struct bidirectional_map
|
||||
ToType second;
|
||||
};
|
||||
|
||||
#if defined(BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS) ||\
|
||||
defined(BOOST_MSVC)&&(BOOST_MSVC<1300) ||\
|
||||
defined(BOOST_INTEL_CXX_VERSION)&&defined(_MSC_VER)&&\
|
||||
(BOOST_INTEL_CXX_VERSION<=700)
|
||||
|
||||
/* see Compiler specifics: Use of member_offset for info on member<> and
|
||||
* member_offset<>
|
||||
*/
|
||||
|
||||
BOOST_STATIC_CONSTANT(unsigned,from_offset=offsetof(value_type,first));
|
||||
BOOST_STATIC_CONSTANT(unsigned,to_offset =offsetof(value_type,second));
|
||||
|
||||
typedef multi_index_container<
|
||||
value_type,
|
||||
indexed_by<
|
||||
ordered_unique<
|
||||
tag<from>,member_offset<value_type,FromType,from_offset> >,
|
||||
ordered_unique<
|
||||
tag<to>, member_offset<value_type,ToType,to_offset> >
|
||||
>
|
||||
> type;
|
||||
|
||||
#else
|
||||
|
||||
/* A bidirectional map can be simulated as a multi_index_container
|
||||
* of pairs of (FromType,ToType) with two unique indices, one
|
||||
* for each member of the pair.
|
||||
@@ -82,8 +58,6 @@ struct bidirectional_map
|
||||
tag<to>, member<value_type,ToType,&value_type::second> >
|
||||
>
|
||||
> type;
|
||||
|
||||
#endif
|
||||
};
|
||||
|
||||
/* a dictionary is a bidirectional map from strings to strings */
|
||||
@@ -108,22 +82,6 @@ int main()
|
||||
std::string word;
|
||||
std::getline(std::cin,word);
|
||||
|
||||
#if defined(BOOST_NO_MEMBER_TEMPLATES) /* use global get<> and family instead */
|
||||
|
||||
dictionary::iterator it=get<from>(d).find(word);
|
||||
if(it!=d.end()){
|
||||
std::cout<<word<<" is said "<<it->second<<" in English"<<std::endl;
|
||||
}
|
||||
else{
|
||||
nth_index<dictionary,1>::type::iterator it2=get<1>(d).find(word);
|
||||
if(it2!=get<1>(d).end()){
|
||||
std::cout<<word<<" is said "<<it2->first<<" in Spanish"<<std::endl;
|
||||
}
|
||||
else std::cout<<"No such word in the dictionary"<<std::endl;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/* search the queried word on the from index (Spanish) */
|
||||
|
||||
dictionary::iterator it=d.get<from>().find(word);
|
||||
@@ -143,7 +101,5 @@ int main()
|
||||
else std::cout<<"No such word in the dictionary"<<std::endl;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+12
-16
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex example: complex searches and foreign keys.
|
||||
*
|
||||
* Copyright 2003-2008 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -88,10 +88,6 @@ struct car_model
|
||||
}
|
||||
};
|
||||
|
||||
/* see Compiler specifics: Use of member_offset for info on
|
||||
* BOOST_MULTI_INDEX_MEMBER
|
||||
*/
|
||||
|
||||
/* Car manufacturers are stored in a multi_index_container with one single
|
||||
* index on the name member. This is functionally equivalent to an std::set,
|
||||
* though in this latter case we woud have to define a non-default comparison
|
||||
@@ -102,7 +98,7 @@ typedef multi_index_container<
|
||||
car_manufacturer,
|
||||
indexed_by<
|
||||
ordered_unique<
|
||||
BOOST_MULTI_INDEX_MEMBER(car_manufacturer,std::string,name)
|
||||
member<car_manufacturer,std::string,&car_manufacturer::name>
|
||||
>
|
||||
>
|
||||
> car_manufacturer_table;
|
||||
@@ -118,18 +114,18 @@ typedef multi_index_container<
|
||||
car_model,
|
||||
indexed_by<
|
||||
ordered_unique<
|
||||
tag<model>,BOOST_MULTI_INDEX_MEMBER(car_model,std::string,model)
|
||||
tag<model>,member<car_model,std::string,&car_model::model>
|
||||
>,
|
||||
ordered_non_unique<
|
||||
tag<manufacturer>,
|
||||
key_from_key<
|
||||
BOOST_MULTI_INDEX_MEMBER(car_manufacturer,const std::string,name),
|
||||
BOOST_MULTI_INDEX_MEMBER(
|
||||
car_model,const car_manufacturer *,manufacturer)
|
||||
member<car_manufacturer,const std::string,&car_manufacturer::name>,
|
||||
member<
|
||||
car_model,const car_manufacturer *,&car_model::manufacturer>
|
||||
>
|
||||
>,
|
||||
ordered_non_unique<
|
||||
tag<price>,BOOST_MULTI_INDEX_MEMBER(car_model,int,price)
|
||||
tag<price>,member<car_model,int,&car_model::price>
|
||||
>
|
||||
>
|
||||
> car_table;
|
||||
@@ -138,7 +134,7 @@ typedef multi_index_container<
|
||||
* actual objects. These views are used in the complex search performed
|
||||
* in the program. Resorting to multi_index of pointers eliminates
|
||||
* unnecessary copying of objects, and provides us with an opportunity
|
||||
* to show how BOOST_MULTI_INDEX_MEMBER can be used with pointer
|
||||
* to show how boost::multi_index::member can be used with pointer
|
||||
* type elements.
|
||||
* car_table_price_view indexes (pointers to) car_models by price.
|
||||
*/
|
||||
@@ -146,7 +142,7 @@ typedef multi_index_container<
|
||||
typedef multi_index_container<
|
||||
const car_model*,
|
||||
indexed_by<
|
||||
ordered_non_unique<BOOST_MULTI_INDEX_MEMBER(car_model,const int,price)>
|
||||
ordered_non_unique<member<car_model,const int,&car_model::price> >
|
||||
>
|
||||
> car_table_price_view;
|
||||
|
||||
@@ -159,9 +155,9 @@ typedef multi_index_container<
|
||||
indexed_by<
|
||||
ordered_non_unique<
|
||||
key_from_key<
|
||||
BOOST_MULTI_INDEX_MEMBER(car_manufacturer,const std::string,name),
|
||||
BOOST_MULTI_INDEX_MEMBER(
|
||||
car_model,const car_manufacturer * const,manufacturer)
|
||||
member<car_manufacturer,const std::string,&car_manufacturer::name>,
|
||||
member<
|
||||
car_model,const car_manufacturer * const,&car_model::manufacturer>
|
||||
>
|
||||
>
|
||||
>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex example of composite keys.
|
||||
*
|
||||
* Copyright 2003-2008 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -57,26 +57,22 @@ struct file_entry
|
||||
* file and size. These indices are firstly ordered by directory, as commands
|
||||
* work on a current directory basis. Composite keys are just fine to model
|
||||
* this.
|
||||
* NB: The use of derivation here instead of simple typedef is explained in
|
||||
* Compiler specifics: type hiding.
|
||||
* NB: The use of derivation here instead of simple typedef helps produce
|
||||
* shorter symbol names in compilation
|
||||
*/
|
||||
|
||||
struct name_key:composite_key<
|
||||
file_entry,
|
||||
BOOST_MULTI_INDEX_MEMBER(file_entry,const file_entry*,dir),
|
||||
BOOST_MULTI_INDEX_MEMBER(file_entry,std::string,name)
|
||||
member<file_entry,const file_entry*,&file_entry::dir>,
|
||||
member<file_entry,std::string,&file_entry::name>
|
||||
>{};
|
||||
|
||||
struct size_key:composite_key<
|
||||
file_entry,
|
||||
BOOST_MULTI_INDEX_MEMBER(file_entry,const file_entry* const,dir),
|
||||
BOOST_MULTI_INDEX_MEMBER(file_entry,unsigned,size)
|
||||
member<file_entry,const file_entry* const,&file_entry::dir>,
|
||||
member<file_entry,unsigned,&file_entry::size>
|
||||
>{};
|
||||
|
||||
/* see Compiler specifics: composite_key in compilers without partial
|
||||
* template specialization, for info on composite_key_result_less
|
||||
*/
|
||||
|
||||
typedef multi_index_container<
|
||||
file_entry,
|
||||
indexed_by<
|
||||
|
||||
+2
-4
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex example of functions used as key extractors.
|
||||
*
|
||||
* Copyright 2003-2008 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -54,15 +54,13 @@ std::string::size_type name_record_length(const name_record& r)
|
||||
|
||||
/* multi_index_container with indices based on name_record::name()
|
||||
* and name_record_length().
|
||||
* See Compiler specifics: Use of const_mem_fun_explicit and
|
||||
* mem_fun_explicit for info on BOOST_MULTI_INDEX_CONST_MEM_FUN.
|
||||
*/
|
||||
|
||||
typedef multi_index_container<
|
||||
name_record,
|
||||
indexed_by<
|
||||
ordered_unique<
|
||||
BOOST_MULTI_INDEX_CONST_MEM_FUN(name_record,std::string,name)
|
||||
const_mem_fun<name_record,std::string,&name_record::name>
|
||||
>,
|
||||
ordered_non_unique<
|
||||
global_fun<const name_record&,std::string::size_type,name_record_length>
|
||||
|
||||
+3
-7
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex example of use of hashed indices.
|
||||
*
|
||||
* Copyright 2003-2008 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -37,19 +37,15 @@ struct word_counter_entry
|
||||
word_counter_entry(std::string word_):word(word_),occurrences(0){}
|
||||
};
|
||||
|
||||
/* see Compiler specifics: Use of member_offset for info on
|
||||
* BOOST_MULTI_INDEX_MEMBER
|
||||
*/
|
||||
|
||||
typedef multi_index_container<
|
||||
word_counter_entry,
|
||||
indexed_by<
|
||||
ordered_non_unique<
|
||||
BOOST_MULTI_INDEX_MEMBER(word_counter_entry,unsigned int,occurrences),
|
||||
member<word_counter_entry,unsigned int,&word_counter_entry::occurrences>,
|
||||
std::greater<unsigned int> /* sorted beginning with most frequent */
|
||||
>,
|
||||
hashed_unique<
|
||||
BOOST_MULTI_INDEX_MEMBER(word_counter_entry,std::string,word)
|
||||
member<word_counter_entry,std::string,&word_counter_entry::word>
|
||||
>
|
||||
>
|
||||
> word_counter;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex example of use of Boost.Interprocess allocators.
|
||||
*
|
||||
* Copyright 2003-2008 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -104,22 +104,18 @@ struct partial_str_less
|
||||
* * We are using a Boost.Interprocess specific allocator.
|
||||
*/
|
||||
|
||||
/* see Compiler specifics: Use of member_offset for info on
|
||||
* BOOST_MULTI_INDEX_MEMBER
|
||||
*/
|
||||
|
||||
typedef multi_index_container<
|
||||
book,
|
||||
indexed_by<
|
||||
ordered_non_unique<
|
||||
BOOST_MULTI_INDEX_MEMBER(book,shared_string,author)
|
||||
member<book,shared_string,&book::author>
|
||||
>,
|
||||
ordered_non_unique<
|
||||
BOOST_MULTI_INDEX_MEMBER(book,shared_string,name),
|
||||
member<book,shared_string,&book::name>,
|
||||
partial_str_less
|
||||
>,
|
||||
ordered_non_unique<
|
||||
BOOST_MULTI_INDEX_MEMBER(book,unsigned,prize)
|
||||
member<book,unsigned,&book::prize>
|
||||
>
|
||||
>,
|
||||
bip::allocator<book,bip::managed_mapped_file::segment_manager>
|
||||
|
||||
+2
-15
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex example of use of rearrange facilities.
|
||||
*
|
||||
* Copyright 2003-2020 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -22,11 +22,8 @@
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <iterator>
|
||||
#include <vector>
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_RANDOM)
|
||||
#include <random>
|
||||
#endif
|
||||
#include <vector>
|
||||
|
||||
using boost::multi_index_container;
|
||||
using namespace boost::multi_index;
|
||||
@@ -197,22 +194,12 @@ struct random_shuffler
|
||||
|
||||
private:
|
||||
deck_view dv;
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_RANDOM)
|
||||
std::mt19937 e;
|
||||
|
||||
void shuffle_view()
|
||||
{
|
||||
std::shuffle(dv.begin(),dv.end(),e);
|
||||
}
|
||||
#else
|
||||
/* for pre-C++11 compilers we use std::random_shuffle */
|
||||
|
||||
void shuffle_view()
|
||||
{
|
||||
std::random_shuffle(dv.begin(),dv.end());
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
/* Repeat a given shuffling algorithm repeats_num times
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
#include <boost/container_hash/hash_fwd.hpp>
|
||||
#include <boost/core/enable_if.hpp>
|
||||
#include <boost/core/ref.hpp>
|
||||
#include <boost/multi_index/detail/access_specifier.hpp>
|
||||
#include <boost/multi_index/detail/augmented_stdtuple.hpp>
|
||||
#include <boost/multi_index/detail/cons_stdtuple.hpp>
|
||||
#include <boost/mp11/algorithm.hpp>
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
/* Copyright 2003-2013 Joaquin M Lopez Munoz.
|
||||
* 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/multi_index for library home page.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_MULTI_INDEX_DETAIL_ACCESS_SPECIFIER_HPP
|
||||
#define BOOST_MULTI_INDEX_DETAIL_ACCESS_SPECIFIER_HPP
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
|
||||
/* In those compilers that do not accept the member template friend syntax,
|
||||
* some protected and private sections might need to be specified as
|
||||
* public.
|
||||
*/
|
||||
|
||||
#if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
|
||||
#define BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS public
|
||||
#define BOOST_MULTI_INDEX_PRIVATE_IF_MEMBER_TEMPLATE_FRIENDS public
|
||||
#else
|
||||
#define BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS protected
|
||||
#define BOOST_MULTI_INDEX_PRIVATE_IF_MEMBER_TEMPLATE_FRIENDS private
|
||||
#endif
|
||||
|
||||
/* GCC does not correctly support in-class using declarations for template
|
||||
* functions. See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=9810
|
||||
* MSVC 7.1/8.0 seem to have a similar problem, though the conditions in
|
||||
* which the error happens are not that simple. I have yet to isolate this
|
||||
* into a snippet suitable for bug reporting.
|
||||
* Sun Studio also has this problem, which might be related, from the
|
||||
* information gathered at Sun forums, with a known issue notified at the
|
||||
* internal bug report 6421933. The bug is present up to Studio Express 2,
|
||||
* the latest preview version of the future Sun Studio 12. As of this writing
|
||||
* (October 2006) it is not known whether a fix will finally make it into the
|
||||
* official Sun Studio 12.
|
||||
*/
|
||||
|
||||
#if BOOST_WORKAROUND(__GNUC__,==3)&&(__GNUC_MINOR__<4)||\
|
||||
BOOST_WORKAROUND(BOOST_MSVC,==1310)||\
|
||||
BOOST_WORKAROUND(BOOST_MSVC,==1400)||\
|
||||
BOOST_WORKAROUND(__SUNPRO_CC,BOOST_TESTED_AT(0x590))
|
||||
#define BOOST_MULTI_INDEX_PRIVATE_IF_USING_DECL_FOR_TEMPL_FUNCTIONS public
|
||||
#else
|
||||
#define BOOST_MULTI_INDEX_PRIVATE_IF_USING_DECL_FOR_TEMPL_FUNCTIONS private
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright 2003-2013 Joaquin M Lopez Munoz.
|
||||
/* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -25,14 +25,8 @@ namespace detail{
|
||||
template<typename T>
|
||||
void adl_swap(T& x,T& y)
|
||||
{
|
||||
|
||||
#if !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL)
|
||||
using std::swap;
|
||||
swap(x,y);
|
||||
#else
|
||||
std::swap(x,y);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
} /* namespace multi_index::detail */
|
||||
|
||||
@@ -1,173 +0,0 @@
|
||||
/* Copyright 2003-2020 Joaquin M Lopez Munoz.
|
||||
* 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/multi_index for library home page.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_MULTI_INDEX_DETAIL_ALLOCATOR_TRAITS_HPP
|
||||
#define BOOST_MULTI_INDEX_DETAIL_ALLOCATOR_TRAITS_HPP
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
|
||||
#include <boost/type_traits/is_empty.hpp>
|
||||
#include <memory>
|
||||
#else
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/move/core.hpp>
|
||||
#include <boost/move/utility_core.hpp>
|
||||
#include <boost/multi_index/detail/vartempl_support.hpp>
|
||||
#include <boost/type_traits/integral_constant.hpp>
|
||||
#include <boost/type_traits/is_empty.hpp>
|
||||
#include <new>
|
||||
#endif
|
||||
|
||||
namespace boost{
|
||||
|
||||
namespace multi_index{
|
||||
|
||||
namespace detail{
|
||||
|
||||
/* poor man's replacement of std::allocator_traits */
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
|
||||
|
||||
template<typename T> struct void_helper{typedef void type;};
|
||||
|
||||
template<typename Allocator,typename=void>
|
||||
struct allocator_is_always_equal:boost::is_empty<Allocator>{};
|
||||
|
||||
template<typename Allocator>
|
||||
struct allocator_is_always_equal<
|
||||
Allocator,
|
||||
typename void_helper<
|
||||
typename std::allocator_traits<Allocator>::is_always_equal
|
||||
>::type
|
||||
>:std::allocator_traits<Allocator>::is_always_equal{};
|
||||
|
||||
template<typename Allocator>
|
||||
struct allocator_traits:std::allocator_traits<Allocator>
|
||||
{
|
||||
/* wrap std::allocator_traits alias templates for use in C++03 codebase */
|
||||
|
||||
typedef std::allocator_traits<Allocator> super;
|
||||
|
||||
/* pre-C++17 compatibilty */
|
||||
|
||||
typedef allocator_is_always_equal<Allocator> is_always_equal;
|
||||
|
||||
template<typename T>
|
||||
struct rebind_alloc
|
||||
{
|
||||
typedef typename super::template rebind_alloc<T> type;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct rebind_traits
|
||||
{
|
||||
typedef typename super::template rebind_traits<T> type;
|
||||
};
|
||||
};
|
||||
|
||||
#else
|
||||
|
||||
/* not a full std::allocator_traits rewrite (not needed) */
|
||||
|
||||
template<typename Allocator>
|
||||
struct allocator_traits
|
||||
{
|
||||
typedef Allocator allocator_type;
|
||||
typedef typename Allocator::value_type value_type;
|
||||
typedef typename Allocator::pointer pointer;
|
||||
typedef typename Allocator::const_pointer const_pointer;
|
||||
|
||||
/* [const_]void_pointer not provided as boost::pointer_traits's
|
||||
* rebind_to has been seen to fail with things like
|
||||
* boost::interprocess::offset_ptr in relatively old environments.
|
||||
*/
|
||||
|
||||
typedef typename Allocator::difference_type difference_type;
|
||||
typedef typename Allocator::size_type size_type;
|
||||
|
||||
typedef boost::false_type propagate_on_container_copy_assignment;
|
||||
typedef boost::false_type propagate_on_container_move_assignment;
|
||||
typedef boost::false_type propagate_on_container_swap;
|
||||
typedef boost::is_empty<Allocator> is_always_equal;
|
||||
|
||||
template<typename T>
|
||||
struct rebind_alloc
|
||||
{
|
||||
typedef typename Allocator::template rebind<T>::other type;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct rebind_traits
|
||||
{
|
||||
typedef allocator_traits<typename rebind_alloc<T>::type> type;
|
||||
};
|
||||
|
||||
static pointer allocate(Allocator& a,size_type n){return a.allocate(n);}
|
||||
static pointer allocate(Allocator& a,size_type n,const_pointer p)
|
||||
/* should've been const_void_pointer p */
|
||||
{return a.allocate(n,p);}
|
||||
static void deallocate(Allocator& a,pointer p,size_type n)
|
||||
{a.deallocate(p,n);}
|
||||
template<typename T>
|
||||
static void construct(Allocator&,T* p,const T& x)
|
||||
{::new (static_cast<void*>(p)) T(x);}
|
||||
template<typename T>
|
||||
static void construct(Allocator&,T* p,BOOST_RV_REF(T) x)
|
||||
{::new (static_cast<void*>(p)) T(boost::move(x));}
|
||||
|
||||
template<typename T,BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
|
||||
static void construct(Allocator&,T* p,BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
|
||||
{
|
||||
vartempl_placement_new(p,BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);
|
||||
}
|
||||
|
||||
#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1500))
|
||||
/* MSVC issues spurious warnings about unreferencend formal parameters in
|
||||
* destroy<T> when T is a class with trivial dtor.
|
||||
*/
|
||||
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4100)
|
||||
#endif
|
||||
|
||||
template<typename T>
|
||||
static void destroy(Allocator&,T* p){p->~T();}
|
||||
|
||||
#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1500))
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
static size_type max_size(Allocator& a)BOOST_NOEXCEPT{return a.max_size();}
|
||||
|
||||
static Allocator select_on_container_copy_construction(const Allocator& a)
|
||||
{
|
||||
return a;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
template<typename Allocator,typename T>
|
||||
struct rebind_alloc_for
|
||||
{
|
||||
typedef typename allocator_traits<Allocator>::
|
||||
template rebind_alloc<T>::type type;
|
||||
};
|
||||
|
||||
} /* namespace multi_index::detail */
|
||||
|
||||
} /* namespace multi_index */
|
||||
|
||||
} /* namespace boost */
|
||||
|
||||
#endif
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright 2003-2022 Joaquin M Lopez Munoz.
|
||||
/* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -16,8 +16,8 @@
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <algorithm>
|
||||
#include <boost/core/noncopyable.hpp>
|
||||
#include <boost/core/allocator_access.hpp>
|
||||
#include <boost/multi_index/detail/adl_swap.hpp>
|
||||
#include <boost/multi_index/detail/allocator_traits.hpp>
|
||||
#include <boost/type_traits/integral_constant.hpp>
|
||||
#include <memory>
|
||||
|
||||
@@ -46,18 +46,15 @@ namespace detail{
|
||||
template<typename T,typename Allocator=std::allocator<T> >
|
||||
struct auto_space:private noncopyable
|
||||
{
|
||||
typedef typename rebind_alloc_for<
|
||||
Allocator,T>
|
||||
::type allocator;
|
||||
typedef allocator_traits<allocator> alloc_traits;
|
||||
typedef typename alloc_traits::pointer pointer;
|
||||
typedef typename alloc_traits::size_type size_type;
|
||||
typedef allocator_rebind_t<Allocator,T> allocator;
|
||||
typedef allocator_pointer_t<allocator> pointer;
|
||||
typedef allocator_size_type_t<allocator> size_type;
|
||||
|
||||
explicit auto_space(const Allocator& al=Allocator(),size_type n=1):
|
||||
al_(al),n_(n),data_(n_?alloc_traits::allocate(al_,n_):pointer(0))
|
||||
al_(al),n_(n),data_(n_?allocator_allocate(al_,n_):pointer(0))
|
||||
{}
|
||||
|
||||
~auto_space(){if(n_)alloc_traits::deallocate(al_,data_,n_);}
|
||||
~auto_space(){if(n_)allocator_deallocate(al_,data_,n_);}
|
||||
|
||||
Allocator get_allocator()const{return al_;}
|
||||
|
||||
@@ -68,7 +65,8 @@ struct auto_space:private noncopyable
|
||||
swap(
|
||||
x,
|
||||
boost::integral_constant<
|
||||
bool,alloc_traits::propagate_on_container_swap::value>());
|
||||
bool,
|
||||
allocator_propagate_on_container_swap_t<allocator>::value>());
|
||||
}
|
||||
|
||||
void swap(auto_space& x,boost::true_type /* swap_allocators */)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright 2003-2023 Joaquin M Lopez Munoz.
|
||||
/* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -15,8 +15,8 @@
|
||||
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <algorithm>
|
||||
#include <boost/core/allocator_access.hpp>
|
||||
#include <boost/core/noncopyable.hpp>
|
||||
#include <boost/multi_index/detail/allocator_traits.hpp>
|
||||
#include <boost/multi_index/detail/auto_space.hpp>
|
||||
#include <boost/multi_index/detail/hash_index_node.hpp>
|
||||
#include <boost/preprocessor/repetition/repeat.hpp>
|
||||
@@ -129,10 +129,10 @@ class bucket_array:bucket_array_base<>
|
||||
{
|
||||
typedef bucket_array_base<> super;
|
||||
typedef hashed_index_base_node_impl<
|
||||
typename rebind_alloc_for<
|
||||
allocator_rebind_t<
|
||||
Allocator,
|
||||
char
|
||||
>::type
|
||||
>
|
||||
> base_node_impl_type;
|
||||
|
||||
public:
|
||||
@@ -224,12 +224,8 @@ void swap(bucket_array<Allocator>& x,bucket_array<Allocator>& y)
|
||||
* somehow invalid archive.
|
||||
*/
|
||||
|
||||
#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
namespace serialization{
|
||||
#else
|
||||
namespace multi_index{
|
||||
namespace detail{
|
||||
#endif
|
||||
|
||||
template<class Archive,typename Allocator>
|
||||
inline void load_construct_data(
|
||||
@@ -239,12 +235,8 @@ inline void load_construct_data(
|
||||
throw_exception(boost::multi_index::detail::bad_archive_exception());
|
||||
}
|
||||
|
||||
#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
} /* namespace serialization */
|
||||
#else
|
||||
} /* namespace multi_index::detail */
|
||||
} /* namespace multi_index */
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright 2003-2022 Joaquin M Lopez Munoz.
|
||||
/* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -16,14 +16,13 @@
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <algorithm>
|
||||
#include <boost/core/addressof.hpp>
|
||||
#include <boost/core/allocator_access.hpp>
|
||||
#include <boost/core/no_exceptions_support.hpp>
|
||||
#include <boost/core/noncopyable.hpp>
|
||||
#include <boost/move/core.hpp>
|
||||
#include <boost/move/utility_core.hpp>
|
||||
#include <boost/multi_index/detail/allocator_traits.hpp>
|
||||
#include <boost/multi_index/detail/auto_space.hpp>
|
||||
#include <boost/multi_index/detail/raw_ptr.hpp>
|
||||
#include <functional>
|
||||
#include <utility>
|
||||
|
||||
namespace boost{
|
||||
|
||||
@@ -66,21 +65,18 @@ struct copy_map_value_copier
|
||||
struct copy_map_value_mover
|
||||
{
|
||||
template<typename Value>
|
||||
BOOST_RV_REF(Value) operator()(Value& x)const{return boost::move(x);}
|
||||
Value&& operator()(Value& x)const{return std::move(x);}
|
||||
};
|
||||
|
||||
template <typename Node,typename Allocator>
|
||||
class copy_map:private noncopyable
|
||||
{
|
||||
typedef typename rebind_alloc_for<
|
||||
Allocator,Node
|
||||
>::type allocator_type;
|
||||
typedef allocator_traits<allocator_type> alloc_traits;
|
||||
typedef typename alloc_traits::pointer pointer;
|
||||
typedef allocator_rebind_t<Allocator,Node> allocator_type;
|
||||
typedef allocator_pointer_t<allocator_type> pointer;
|
||||
|
||||
public:
|
||||
typedef const copy_map_entry<Node>* const_iterator;
|
||||
typedef typename alloc_traits::size_type size_type;
|
||||
typedef const copy_map_entry<Node>* const_iterator;
|
||||
typedef allocator_size_type_t<allocator_type> size_type;
|
||||
|
||||
copy_map(
|
||||
const Allocator& al,size_type size,Node* header_org,Node* header_cpy):
|
||||
@@ -92,7 +88,7 @@ public:
|
||||
{
|
||||
if(!released){
|
||||
for(size_type i=0;i<n;++i){
|
||||
alloc_traits::destroy(
|
||||
allocator_destroy(
|
||||
al_,boost::addressof((spc.data()+i)->second->value()));
|
||||
deallocate((spc.data()+i)->second);
|
||||
}
|
||||
@@ -128,12 +124,12 @@ private:
|
||||
|
||||
pointer allocate()
|
||||
{
|
||||
return alloc_traits::allocate(al_,1);
|
||||
return allocator_allocate(al_,1);
|
||||
}
|
||||
|
||||
void deallocate(Node* node)
|
||||
{
|
||||
alloc_traits::deallocate(al_,static_cast<pointer>(node),1);
|
||||
allocator_deallocate(al_,static_cast<pointer>(node),1);
|
||||
}
|
||||
|
||||
template<typename ValueAccess>
|
||||
@@ -142,7 +138,7 @@ private:
|
||||
(spc.data()+n)->first=node;
|
||||
(spc.data()+n)->second=raw_ptr<Node*>(allocate());
|
||||
BOOST_TRY{
|
||||
alloc_traits::construct(
|
||||
allocator_construct(
|
||||
al_,boost::addressof((spc.data()+n)->second->value()),
|
||||
access(node->value()));
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright 2003-2020 Joaquin M Lopez Munoz.
|
||||
/* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -14,7 +14,7 @@
|
||||
#endif
|
||||
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <boost/multi_index/detail/allocator_traits.hpp>
|
||||
#include <boost/core/allocator_access.hpp>
|
||||
#include <boost/multi_index/detail/raw_ptr.hpp>
|
||||
#include <utility>
|
||||
|
||||
@@ -99,19 +99,17 @@ struct hashed_index_node_impl;
|
||||
template<typename Allocator>
|
||||
struct hashed_index_base_node_impl
|
||||
{
|
||||
typedef typename rebind_alloc_for<
|
||||
typedef allocator_rebind_t<
|
||||
Allocator,hashed_index_base_node_impl
|
||||
>::type base_allocator;
|
||||
typedef typename rebind_alloc_for<
|
||||
> base_allocator;
|
||||
typedef allocator_rebind_t<
|
||||
Allocator,hashed_index_node_impl<Allocator>
|
||||
>::type node_allocator;
|
||||
typedef allocator_traits<base_allocator> base_alloc_traits;
|
||||
typedef allocator_traits<node_allocator> node_alloc_traits;
|
||||
typedef typename base_alloc_traits::pointer base_pointer;
|
||||
typedef typename base_alloc_traits::const_pointer const_base_pointer;
|
||||
typedef typename node_alloc_traits::pointer pointer;
|
||||
typedef typename node_alloc_traits::const_pointer const_pointer;
|
||||
typedef typename node_alloc_traits::difference_type difference_type;
|
||||
> node_allocator;
|
||||
typedef allocator_pointer_t<base_allocator> base_pointer;
|
||||
typedef allocator_const_pointer_t<base_allocator> const_base_pointer;
|
||||
typedef allocator_pointer_t<node_allocator> pointer;
|
||||
typedef allocator_const_pointer_t<node_allocator> const_pointer;
|
||||
typedef allocator_difference_type_t<node_allocator> difference_type;
|
||||
|
||||
pointer& prior(){return prior_;}
|
||||
pointer prior()const{return prior_;}
|
||||
@@ -689,14 +687,14 @@ private:
|
||||
template<typename Super>
|
||||
struct hashed_index_node_trampoline:
|
||||
hashed_index_node_impl<
|
||||
typename rebind_alloc_for<
|
||||
allocator_rebind_t<
|
||||
typename Super::allocator_type,char
|
||||
>::type
|
||||
>
|
||||
>
|
||||
{
|
||||
typedef typename rebind_alloc_for<
|
||||
typedef allocator_rebind_t<
|
||||
typename Super::allocator_type,char
|
||||
>::type impl_allocator_type;
|
||||
> impl_allocator_type;
|
||||
typedef hashed_index_node_impl<impl_allocator_type> impl_type;
|
||||
};
|
||||
|
||||
|
||||
@@ -15,17 +15,14 @@
|
||||
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <boost/core/addressof.hpp>
|
||||
#include <boost/core/allocator_access.hpp>
|
||||
#include <boost/core/no_exceptions_support.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/move/utility_core.hpp>
|
||||
#include <boost/multi_index/detail/allocator_traits.hpp>
|
||||
#include <boost/multi_index/detail/copy_map.hpp>
|
||||
#include <boost/multi_index/detail/do_not_copy_elements_tag.hpp>
|
||||
#include <boost/multi_index/detail/index_access_sequence.hpp>
|
||||
#include <boost/multi_index/detail/node_handle.hpp>
|
||||
#include <boost/multi_index/detail/node_type.hpp>
|
||||
#include <boost/multi_index/detail/type_list.hpp>
|
||||
#include <boost/multi_index/detail/vartempl_support.hpp>
|
||||
#include <boost/multi_index_container_fwd.hpp>
|
||||
#include <boost/tuple/tuple.hpp>
|
||||
#include <utility>
|
||||
@@ -63,9 +60,7 @@ protected:
|
||||
typedef multi_index_container<
|
||||
Value,IndexSpecifierList,Allocator> final_type;
|
||||
typedef tuples::null_type ctor_args_list;
|
||||
typedef typename rebind_alloc_for<
|
||||
Allocator,typename Allocator::value_type
|
||||
>::type final_allocator_type;
|
||||
typedef Allocator final_allocator_type;
|
||||
typedef node_handle<
|
||||
final_node_type,final_allocator_type> final_node_handle_type;
|
||||
typedef empty_type_list index_type_list;
|
||||
@@ -87,8 +82,7 @@ protected:
|
||||
|
||||
private:
|
||||
typedef Value value_type;
|
||||
typedef allocator_traits<Allocator> alloc_traits;
|
||||
typedef typename alloc_traits::size_type size_type;
|
||||
typedef allocator_size_type_t<Allocator> size_type;
|
||||
|
||||
protected:
|
||||
explicit index_base(const ctor_args_list&,const Allocator&){}
|
||||
@@ -120,7 +114,7 @@ protected:
|
||||
{
|
||||
x=final().allocate_node();
|
||||
BOOST_TRY{
|
||||
final().construct_value(x,boost::move(const_cast<value_type&>(v)));
|
||||
final().construct_value(x,std::move(const_cast<value_type&>(v)));
|
||||
}
|
||||
BOOST_CATCH(...){
|
||||
final().deallocate_node(x);
|
||||
@@ -183,7 +177,7 @@ protected:
|
||||
|
||||
bool replace_(const value_type& v,index_node_type* x,rvalue_tag)
|
||||
{
|
||||
x->value()=boost::move(const_cast<value_type&>(v));
|
||||
x->value()=std::move(const_cast<value_type&>(v));
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -241,11 +235,10 @@ protected:
|
||||
std::pair<final_node_type*,bool> final_transfer_(Index& x,final_node_type* n)
|
||||
{return final().transfer_(x,n);}
|
||||
|
||||
template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
|
||||
std::pair<final_node_type*,bool> final_emplace_(
|
||||
BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
|
||||
template<typename... Args>
|
||||
std::pair<final_node_type*,bool> final_emplace_(Args&&... args)
|
||||
{
|
||||
return final().emplace_(BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);
|
||||
return final().emplace_(std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
std::pair<final_node_type*,bool> final_insert_(
|
||||
@@ -266,12 +259,11 @@ protected:
|
||||
final_node_handle_type& nh,final_node_type* position)
|
||||
{return final().insert_nh_(nh,position);}
|
||||
|
||||
template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
|
||||
template<typename... Args>
|
||||
std::pair<final_node_type*,bool> final_emplace_hint_(
|
||||
final_node_type* position,BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
|
||||
final_node_type* position,Args&&... args)
|
||||
{
|
||||
return final().emplace_hint_(
|
||||
position,BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);
|
||||
return final().emplace_hint_(position,std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
final_node_handle_type final_extract_(final_node_type* x)
|
||||
@@ -294,8 +286,8 @@ protected:
|
||||
template<typename Index>
|
||||
void final_transfer_range_(
|
||||
Index& x,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator first,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator last)
|
||||
typename Index::iterator first,
|
||||
typename Index::iterator last)
|
||||
{final().transfer_range_(x,first,last);}
|
||||
|
||||
void final_swap_(final_type& x){final().swap_(x);}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright 2003-2023 Joaquin M Lopez Munoz.
|
||||
/* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -105,12 +105,8 @@ Node* node_from_value(const Value* p)
|
||||
* somehow invalid archive.
|
||||
*/
|
||||
|
||||
#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
namespace serialization{
|
||||
#else
|
||||
namespace multi_index{
|
||||
namespace detail{
|
||||
#endif
|
||||
|
||||
template<class Archive,typename Value,typename Allocator>
|
||||
inline void load_construct_data(
|
||||
@@ -120,12 +116,8 @@ inline void load_construct_data(
|
||||
throw_exception(boost::multi_index::detail::bad_archive_exception());
|
||||
}
|
||||
|
||||
#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
} /* namespace serialization */
|
||||
#else
|
||||
} /* namespace multi_index::detail */
|
||||
} /* namespace multi_index */
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright 2003-2019 Joaquin M Lopez Munoz.
|
||||
/* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -16,8 +16,7 @@
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <boost/detail/workaround.hpp>
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS)||\
|
||||
BOOST_WORKAROUND(_LIBCPP_VERSION,<30700)||\
|
||||
#if BOOST_WORKAROUND(_LIBCPP_VERSION,<30700)||\
|
||||
BOOST_WORKAROUND(BOOST_LIBSTDCXX_VERSION,<40802)
|
||||
/* libc++: std::is_function<void() const> fails,
|
||||
* https://bugs.llvm.org/show_bug.cgi?id=20084
|
||||
|
||||
@@ -37,8 +37,7 @@ struct is_transparent:std::true_type{};
|
||||
|
||||
} /* namespace boost */
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)&&!defined(BOOST_NO_SFINAE_EXPR)&& \
|
||||
!defined(BOOST_NO_CXX11_DECLTYPE)&& \
|
||||
#if !defined(BOOST_NO_SFINAE_EXPR)&& \
|
||||
(defined(BOOST_NO_CXX11_FINAL)||defined(BOOST_IS_FINAL))
|
||||
|
||||
#include <boost/core/enable_if.hpp>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright 2003-2022 Joaquin M Lopez Munoz.
|
||||
/* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -16,20 +16,16 @@
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <algorithm>
|
||||
#include <boost/core/addressof.hpp>
|
||||
#include <boost/core/allocator_access.hpp>
|
||||
#include <boost/core/enable_if.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/move/core.hpp>
|
||||
#include <boost/move/utility_core.hpp>
|
||||
#include <boost/multi_index_container_fwd.hpp>
|
||||
#include <boost/multi_index/detail/allocator_traits.hpp>
|
||||
#include <boost/type_traits/aligned_storage.hpp>
|
||||
#include <boost/type_traits/alignment_of.hpp>
|
||||
#include <new>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
#include <boost/core/enable_if.hpp>
|
||||
#include <boost/type_traits/is_const.hpp>
|
||||
#include <boost/type_traits/is_same.hpp>
|
||||
#endif
|
||||
#include <new>
|
||||
#include <utility>
|
||||
|
||||
namespace boost{
|
||||
|
||||
@@ -49,16 +45,12 @@ public:
|
||||
typedef typename Node::value_type value_type;
|
||||
typedef Allocator allocator_type;
|
||||
|
||||
private:
|
||||
typedef allocator_traits<allocator_type> alloc_traits;
|
||||
|
||||
public:
|
||||
node_handle()BOOST_NOEXCEPT:node(0){}
|
||||
|
||||
node_handle(BOOST_RV_REF(node_handle) x)BOOST_NOEXCEPT:node(x.node)
|
||||
node_handle(node_handle&& x)BOOST_NOEXCEPT:node(x.node)
|
||||
{
|
||||
if(!x.empty()){
|
||||
move_construct_allocator(boost::move(x));
|
||||
move_construct_allocator(std::move(x));
|
||||
x.destroy_allocator();
|
||||
x.node=0;
|
||||
}
|
||||
@@ -72,15 +64,16 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
node_handle& operator=(BOOST_RV_REF(node_handle) x)
|
||||
node_handle& operator=(node_handle&& x)
|
||||
{
|
||||
if(this!=&x){
|
||||
if(!empty()){
|
||||
delete_node();
|
||||
if(!x.empty()){
|
||||
BOOST_MULTI_INDEX_IF_CONSTEXPR(
|
||||
alloc_traits::propagate_on_container_move_assignment::value){
|
||||
move_assign_allocator(boost::move(x));
|
||||
allocator_propagate_on_container_move_assignment_t<
|
||||
allocator_type>::value){
|
||||
move_assign_allocator(std::move(x));
|
||||
}
|
||||
x.destroy_allocator();
|
||||
}
|
||||
@@ -89,7 +82,7 @@ public:
|
||||
}
|
||||
}
|
||||
else if(!x.empty()){
|
||||
move_construct_allocator(boost::move(x));
|
||||
move_construct_allocator(std::move(x));
|
||||
x.destroy_allocator();
|
||||
}
|
||||
node=x.node;
|
||||
@@ -115,24 +108,24 @@ public:
|
||||
|
||||
void swap(node_handle& x)
|
||||
BOOST_NOEXCEPT_IF(
|
||||
alloc_traits::propagate_on_container_swap::value||
|
||||
alloc_traits::is_always_equal::value)
|
||||
allocator_propagate_on_container_swap_t<allocator_type>::value||
|
||||
allocator_is_always_equal_t<allocator_type>::value)
|
||||
{
|
||||
if(!empty()){
|
||||
if(!x.empty()){
|
||||
BOOST_MULTI_INDEX_IF_CONSTEXPR(
|
||||
alloc_traits::propagate_on_container_swap::value){
|
||||
allocator_propagate_on_container_swap_t<allocator_type>::value){
|
||||
using std::swap;
|
||||
swap(*allocator_ptr(),*x.allocator_ptr());
|
||||
}
|
||||
}
|
||||
else{
|
||||
x.move_construct_allocator(boost::move(*this));
|
||||
x.move_construct_allocator(std::move(*this));
|
||||
destroy_allocator();
|
||||
}
|
||||
}
|
||||
else if(!x.empty()){
|
||||
move_construct_allocator(boost::move(x));
|
||||
move_construct_allocator(std::move(x));
|
||||
x.destroy_allocator();
|
||||
}
|
||||
std::swap(node,x.node);
|
||||
@@ -145,8 +138,6 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(node_handle)
|
||||
|
||||
template <typename,typename,typename>
|
||||
friend class boost::multi_index::multi_index_container;
|
||||
|
||||
@@ -177,30 +168,27 @@ private:
|
||||
|
||||
#include <boost/multi_index/detail/restore_wstrict_aliasing.hpp>
|
||||
|
||||
void move_construct_allocator(BOOST_RV_REF(node_handle) x)
|
||||
void move_construct_allocator(node_handle&& x)
|
||||
{
|
||||
::new (static_cast<void*>(allocator_ptr()))
|
||||
allocator_type(boost::move(*x.allocator_ptr()));
|
||||
allocator_type(std::move(*x.allocator_ptr()));
|
||||
}
|
||||
|
||||
void move_assign_allocator(BOOST_RV_REF(node_handle) x)
|
||||
void move_assign_allocator(node_handle&& x)
|
||||
{
|
||||
*allocator_ptr()=boost::move(*x.allocator_ptr());
|
||||
*allocator_ptr()=std::move(*x.allocator_ptr());
|
||||
}
|
||||
|
||||
void destroy_allocator(){allocator_ptr()->~allocator_type();}
|
||||
|
||||
void delete_node()
|
||||
{
|
||||
typedef typename rebind_alloc_for<
|
||||
allocator_type,Node
|
||||
>::type node_allocator;
|
||||
typedef detail::allocator_traits<node_allocator> node_alloc_traits;
|
||||
typedef typename node_alloc_traits::pointer node_pointer;
|
||||
typedef allocator_rebind_t<allocator_type,Node> node_allocator;
|
||||
typedef allocator_pointer_t<node_allocator> node_pointer;
|
||||
|
||||
alloc_traits::destroy(*allocator_ptr(),boost::addressof(node->value()));
|
||||
allocator_destroy(*allocator_ptr(),boost::addressof(node->value()));
|
||||
node_allocator nal(*allocator_ptr());
|
||||
node_alloc_traits::deallocate(nal,static_cast<node_pointer>(node),1);
|
||||
allocator_deallocate(nal,static_cast<node_pointer>(node),1);
|
||||
}
|
||||
|
||||
Node* node;
|
||||
@@ -220,31 +208,26 @@ template<typename Iterator,typename NodeHandle>
|
||||
struct insert_return_type
|
||||
{
|
||||
insert_return_type(
|
||||
Iterator position_,bool inserted_,BOOST_RV_REF(NodeHandle) node_):
|
||||
position(position_),inserted(inserted_),node(boost::move(node_)){}
|
||||
insert_return_type(BOOST_RV_REF(insert_return_type) x):
|
||||
position(x.position),inserted(x.inserted),node(boost::move(x.node)){}
|
||||
Iterator position_,bool inserted_,NodeHandle&& node_):
|
||||
position(position_),inserted(inserted_),node(std::move(node_)){}
|
||||
insert_return_type(insert_return_type&& x):
|
||||
position(x.position),inserted(x.inserted),node(std::move(x.node)){}
|
||||
|
||||
insert_return_type& operator=(BOOST_RV_REF(insert_return_type) x)
|
||||
insert_return_type& operator=(insert_return_type&& x)
|
||||
{
|
||||
position=x.position;
|
||||
inserted=x.inserted;
|
||||
node=boost::move(x.node);
|
||||
node=std::move(x.node);
|
||||
return *this;
|
||||
}
|
||||
|
||||
Iterator position;
|
||||
bool inserted;
|
||||
NodeHandle node;
|
||||
|
||||
private:
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(insert_return_type)
|
||||
};
|
||||
|
||||
/* utility for SFINAEing merge and related operations */
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
|
||||
#define BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(Dst,Src,T) \
|
||||
typename enable_if_c< \
|
||||
!is_const< Dst >::value&&!is_const< Src >::value&& \
|
||||
@@ -252,12 +235,6 @@ typename enable_if_c< \
|
||||
T \
|
||||
>::type
|
||||
|
||||
#else
|
||||
|
||||
#define BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(Dst,Src,T) T
|
||||
|
||||
#endif
|
||||
|
||||
} /* namespace multi_index::detail */
|
||||
|
||||
} /* namespace multi_index */
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
#endif
|
||||
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/mp11/algorithm.hpp>
|
||||
#include <boost/multi_index_container_fwd.hpp>
|
||||
#include <boost/multi_index/detail/header_holder.hpp>
|
||||
|
||||
@@ -44,15 +44,11 @@
|
||||
#include <algorithm>
|
||||
#include <boost/call_traits.hpp>
|
||||
#include <boost/core/addressof.hpp>
|
||||
#include <boost/core/allocator_access.hpp>
|
||||
#include <boost/core/no_exceptions_support.hpp>
|
||||
#include <boost/core/ref.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/move/core.hpp>
|
||||
#include <boost/move/utility_core.hpp>
|
||||
#include <boost/mp11/utility.hpp>
|
||||
#include <boost/multi_index/detail/access_specifier.hpp>
|
||||
#include <boost/multi_index/detail/adl_swap.hpp>
|
||||
#include <boost/multi_index/detail/allocator_traits.hpp>
|
||||
#include <boost/multi_index/detail/bidir_node_iterator.hpp>
|
||||
#include <boost/multi_index/detail/do_not_copy_elements_tag.hpp>
|
||||
#include <boost/multi_index/detail/index_node_base.hpp>
|
||||
@@ -66,18 +62,14 @@
|
||||
#include <boost/multi_index/detail/type_list.hpp>
|
||||
#include <boost/multi_index/detail/unbounded.hpp>
|
||||
#include <boost/multi_index/detail/value_compare.hpp>
|
||||
#include <boost/multi_index/detail/vartempl_support.hpp>
|
||||
#include <boost/multi_index/detail/ord_index_impl_fwd.hpp>
|
||||
#include <boost/tuple/tuple.hpp>
|
||||
#include <boost/type_traits/is_same.hpp>
|
||||
#include <initializer_list>
|
||||
#include <iterator>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
#include <initializer_list>
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION)
|
||||
#include <boost/bind/bind.hpp>
|
||||
#include <boost/multi_index/detail/bad_archive_exception.hpp>
|
||||
@@ -130,24 +122,10 @@ template<
|
||||
typename KeyFromValue,typename Compare,
|
||||
typename SuperMeta,typename TagList,typename Category,typename AugmentPolicy
|
||||
>
|
||||
class ordered_index_impl:
|
||||
BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS SuperMeta::type
|
||||
class ordered_index_impl:protected SuperMeta::type
|
||||
{
|
||||
#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)&&\
|
||||
BOOST_WORKAROUND(__MWERKS__,<=0x3003)
|
||||
/* The "ISO C++ Template Parser" option in CW8.3 has a problem with the
|
||||
* lifetime of const references bound to temporaries --precisely what
|
||||
* scopeguards are.
|
||||
*/
|
||||
|
||||
#pragma parse_mfunc_templ off
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
|
||||
/* cross-index access */
|
||||
|
||||
template <typename,typename,typename> friend class index_base;
|
||||
#endif
|
||||
|
||||
typedef typename SuperMeta::type super;
|
||||
|
||||
@@ -181,15 +159,11 @@ public:
|
||||
#endif
|
||||
|
||||
typedef iterator const_iterator;
|
||||
|
||||
private:
|
||||
typedef allocator_traits<allocator_type> alloc_traits;
|
||||
|
||||
public:
|
||||
typedef typename alloc_traits::size_type size_type;
|
||||
typedef typename alloc_traits::difference_type difference_type;
|
||||
typedef typename alloc_traits::pointer pointer;
|
||||
typedef typename alloc_traits::const_pointer const_pointer;
|
||||
typedef allocator_size_type_t<allocator_type> size_type;
|
||||
typedef allocator_difference_type_t<
|
||||
allocator_type> difference_type;
|
||||
typedef allocator_pointer_t<allocator_type> pointer;
|
||||
typedef allocator_const_pointer_t<allocator_type> const_pointer;
|
||||
typedef typename
|
||||
std::reverse_iterator<iterator> reverse_iterator;
|
||||
typedef typename
|
||||
@@ -297,11 +271,27 @@ public:
|
||||
|
||||
/* modifiers */
|
||||
|
||||
BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL(
|
||||
pair_return_type,emplace,emplace_impl)
|
||||
template<typename... Args>
|
||||
std::pair<iterator,bool> emplace(Args&&... args)
|
||||
{
|
||||
BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT;
|
||||
std::pair<final_node_type*,bool>p=
|
||||
this->final_emplace_(std::forward<Args>(args)...);
|
||||
return std::pair<iterator,bool>(make_iterator(p.first),p.second);
|
||||
}
|
||||
|
||||
BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL_EXTRA_ARG(
|
||||
iterator,emplace_hint,emplace_hint_impl,iterator,position)
|
||||
template<typename... Args>
|
||||
iterator emplace_hint(iterator position,Args&&... args)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT;
|
||||
std::pair<final_node_type*,bool>p=
|
||||
this->final_emplace_hint_(
|
||||
static_cast<final_node_type*>(position.get_node()),
|
||||
std::forward<Args>(args)...);
|
||||
return make_iterator(p.first);
|
||||
}
|
||||
|
||||
std::pair<iterator,bool> insert(const value_type& x)
|
||||
{
|
||||
@@ -310,7 +300,7 @@ public:
|
||||
return std::pair<iterator,bool>(make_iterator(p.first),p.second);
|
||||
}
|
||||
|
||||
std::pair<iterator,bool> insert(BOOST_RV_REF(value_type) x)
|
||||
std::pair<iterator,bool> insert(value_type&& x)
|
||||
{
|
||||
BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT;
|
||||
std::pair<final_node_type*,bool> p=this->final_insert_rv_(x);
|
||||
@@ -327,7 +317,7 @@ public:
|
||||
return make_iterator(p.first);
|
||||
}
|
||||
|
||||
iterator insert(iterator position,BOOST_RV_REF(value_type) x)
|
||||
iterator insert(iterator position,value_type&& x)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
@@ -344,22 +334,20 @@ public:
|
||||
for(;first!=last;++first)this->final_insert_ref_(*first);
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
void insert(std::initializer_list<value_type> list)
|
||||
{
|
||||
insert(list.begin(),list.end());
|
||||
}
|
||||
#endif
|
||||
|
||||
insert_return_type insert(BOOST_RV_REF(node_type) nh)
|
||||
insert_return_type insert(node_type&& nh)
|
||||
{
|
||||
if(nh)BOOST_MULTI_INDEX_CHECK_EQUAL_ALLOCATORS(*this,nh);
|
||||
BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT;
|
||||
std::pair<final_node_type*,bool> p=this->final_insert_nh_(nh);
|
||||
return insert_return_type(make_iterator(p.first),p.second,boost::move(nh));
|
||||
return insert_return_type(make_iterator(p.first),p.second,std::move(nh));
|
||||
}
|
||||
|
||||
iterator insert(const_iterator position,BOOST_RV_REF(node_type) nh)
|
||||
iterator insert(const_iterator position,node_type&& nh)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
@@ -433,7 +421,7 @@ public:
|
||||
x,static_cast<final_node_type*>(position.get_node()));
|
||||
}
|
||||
|
||||
bool replace(iterator position,BOOST_RV_REF(value_type) x)
|
||||
bool replace(iterator position,value_type&& x)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_DEREFERENCEABLE_ITERATOR(position);
|
||||
@@ -533,12 +521,12 @@ public:
|
||||
|
||||
template<typename Index>
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(ordered_index_impl,Index,void)
|
||||
merge(BOOST_RV_REF(Index) x){merge(static_cast<Index&>(x));}
|
||||
merge(Index&& x){merge(static_cast<Index&>(x));}
|
||||
|
||||
template<typename Index>
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(
|
||||
ordered_index_impl,Index,pair_return_type)
|
||||
merge(Index& x,BOOST_DEDUCED_TYPENAME Index::iterator i)
|
||||
merge(Index& x,typename Index::iterator i)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(i);
|
||||
BOOST_MULTI_INDEX_CHECK_DEREFERENCEABLE_ITERATOR(i);
|
||||
@@ -559,7 +547,7 @@ public:
|
||||
template<typename Index>
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(
|
||||
ordered_index_impl,Index,pair_return_type)
|
||||
merge(BOOST_RV_REF(Index) x,BOOST_DEDUCED_TYPENAME Index::iterator i)
|
||||
merge(Index&& x,typename Index::iterator i)
|
||||
{
|
||||
return merge(static_cast<Index&>(x),i);
|
||||
}
|
||||
@@ -568,8 +556,8 @@ public:
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(ordered_index_impl,Index,void)
|
||||
merge(
|
||||
Index& x,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator first,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator last)
|
||||
typename Index::iterator first,
|
||||
typename Index::iterator last)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(first);
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(last);
|
||||
@@ -586,9 +574,9 @@ public:
|
||||
template<typename Index>
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(ordered_index_impl,Index,void)
|
||||
merge(
|
||||
BOOST_RV_REF(Index) x,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator first,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator last)
|
||||
Index&& x,
|
||||
typename Index::iterator first,
|
||||
typename Index::iterator last)
|
||||
{
|
||||
merge(static_cast<Index&>(x),first,last);
|
||||
}
|
||||
@@ -718,7 +706,7 @@ public:
|
||||
return range(lower,upper,dispatch());
|
||||
}
|
||||
|
||||
BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
|
||||
protected:
|
||||
ordered_index_impl(const ctor_args_list& args_list,const allocator_type& al):
|
||||
super(args_list.get_tail(),al),
|
||||
key(tuples::get<0>(args_list.get_head())),
|
||||
@@ -1351,29 +1339,6 @@ private:
|
||||
}
|
||||
#endif
|
||||
|
||||
template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
|
||||
std::pair<iterator,bool> emplace_impl(BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
|
||||
{
|
||||
BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT;
|
||||
std::pair<final_node_type*,bool>p=
|
||||
this->final_emplace_(BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);
|
||||
return std::pair<iterator,bool>(make_iterator(p.first),p.second);
|
||||
}
|
||||
|
||||
template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
|
||||
iterator emplace_hint_impl(
|
||||
iterator position,BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT;
|
||||
std::pair<final_node_type*,bool>p=
|
||||
this->final_emplace_hint_(
|
||||
static_cast<final_node_type*>(position.get_node()),
|
||||
BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);
|
||||
return make_iterator(p.first);
|
||||
}
|
||||
|
||||
template<typename LowerBounder,typename UpperBounder>
|
||||
std::pair<iterator,iterator>
|
||||
range(LowerBounder lower,UpperBounder upper,none_unbounded_tag)const
|
||||
@@ -1527,11 +1492,6 @@ protected: /* for the benefit of AugmentPolicy::augmented_interface */
|
||||
#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
|
||||
safe_container safe;
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)&&\
|
||||
BOOST_WORKAROUND(__MWERKS__,<=0x3003)
|
||||
#pragma parse_mfunc_templ reset
|
||||
#endif
|
||||
};
|
||||
|
||||
template<
|
||||
@@ -1568,14 +1528,12 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
ordered_index& operator=(
|
||||
std::initializer_list<BOOST_DEDUCED_TYPENAME super::value_type> list)
|
||||
std::initializer_list<typename super::value_type> list)
|
||||
{
|
||||
this->final()=list;
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
||||
protected:
|
||||
ordered_index(
|
||||
|
||||
@@ -41,8 +41,8 @@
|
||||
#endif
|
||||
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <boost/core/allocator_access.hpp>
|
||||
#include <cstddef>
|
||||
#include <boost/multi_index/detail/allocator_traits.hpp>
|
||||
#include <boost/multi_index/detail/raw_ptr.hpp>
|
||||
|
||||
#if !defined(BOOST_MULTI_INDEX_DISABLE_COMPRESSED_ORDERED_INDEX_NODES)
|
||||
@@ -69,15 +69,14 @@ struct ordered_index_node_impl; /* fwd decl. */
|
||||
template<typename AugmentPolicy,typename Allocator>
|
||||
struct ordered_index_node_traits
|
||||
{
|
||||
typedef typename rebind_alloc_for<
|
||||
typedef allocator_rebind_t<
|
||||
Allocator,
|
||||
ordered_index_node_impl<AugmentPolicy,Allocator>
|
||||
>::type allocator;
|
||||
typedef allocator_traits<allocator> alloc_traits;
|
||||
typedef typename alloc_traits::pointer pointer;
|
||||
typedef typename alloc_traits::const_pointer const_pointer;
|
||||
typedef typename alloc_traits::difference_type difference_type;
|
||||
typedef typename alloc_traits::size_type size_type;
|
||||
> allocator;
|
||||
typedef allocator_pointer_t<allocator> pointer;
|
||||
typedef allocator_const_pointer_t<allocator> const_pointer;
|
||||
typedef allocator_difference_type_t<allocator> difference_type;
|
||||
typedef allocator_size_type_t<allocator> size_type;
|
||||
};
|
||||
|
||||
template<typename AugmentPolicy,typename Allocator>
|
||||
@@ -579,18 +578,18 @@ template<typename AugmentPolicy,typename Super>
|
||||
struct ordered_index_node_trampoline:
|
||||
ordered_index_node_impl<
|
||||
AugmentPolicy,
|
||||
typename rebind_alloc_for<
|
||||
allocator_rebind_t<
|
||||
typename Super::allocator_type,
|
||||
char
|
||||
>::type
|
||||
>
|
||||
>
|
||||
{
|
||||
typedef ordered_index_node_impl<
|
||||
AugmentPolicy,
|
||||
typename rebind_alloc_for<
|
||||
allocator_rebind_t<
|
||||
typename Super::allocator_type,
|
||||
char
|
||||
>::type
|
||||
>
|
||||
> impl_type;
|
||||
};
|
||||
|
||||
|
||||
@@ -82,7 +82,7 @@ template<
|
||||
>
|
||||
inline Node* ordered_index_find(
|
||||
Node* top,Node* y,const KeyFromValue& key,
|
||||
const BOOST_DEDUCED_TYPENAME KeyFromValue::result_type& x,
|
||||
const typename KeyFromValue::result_type& x,
|
||||
const CompatibleCompare& comp,std::true_type)
|
||||
{
|
||||
return ordered_index_find(top,y,key,x,comp,std::false_type());
|
||||
@@ -130,7 +130,7 @@ template<
|
||||
>
|
||||
inline Node* ordered_index_lower_bound(
|
||||
Node* top,Node* y,const KeyFromValue& key,
|
||||
const BOOST_DEDUCED_TYPENAME KeyFromValue::result_type& x,
|
||||
const typename KeyFromValue::result_type& x,
|
||||
const CompatibleCompare& comp,std::true_type)
|
||||
{
|
||||
return ordered_index_lower_bound(top,y,key,x,comp,std::false_type());
|
||||
@@ -176,7 +176,7 @@ template<
|
||||
>
|
||||
inline Node* ordered_index_upper_bound(
|
||||
Node* top,Node* y,const KeyFromValue& key,
|
||||
const BOOST_DEDUCED_TYPENAME KeyFromValue::result_type& x,
|
||||
const typename KeyFromValue::result_type& x,
|
||||
const CompatibleCompare& comp,std::true_type)
|
||||
{
|
||||
return ordered_index_upper_bound(top,y,key,x,comp,std::false_type());
|
||||
@@ -224,7 +224,7 @@ template<
|
||||
>
|
||||
inline std::pair<Node*,Node*> ordered_index_equal_range(
|
||||
Node* top,Node* y,const KeyFromValue& key,
|
||||
const BOOST_DEDUCED_TYPENAME KeyFromValue::result_type& x,
|
||||
const typename KeyFromValue::result_type& x,
|
||||
const CompatibleCompare& comp,std::true_type)
|
||||
{
|
||||
return ordered_index_equal_range(top,y,key,x,comp,std::false_type());
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright 2003-2022 Joaquin M Lopez Munoz.
|
||||
/* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -14,9 +14,9 @@
|
||||
#endif
|
||||
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <boost/core/allocator_access.hpp>
|
||||
#include <algorithm>
|
||||
#include <boost/core/noncopyable.hpp>
|
||||
#include <boost/multi_index/detail/allocator_traits.hpp>
|
||||
#include <boost/multi_index/detail/auto_space.hpp>
|
||||
#include <boost/multi_index/detail/rnd_index_ptr_array.hpp>
|
||||
|
||||
@@ -44,10 +44,10 @@ class random_access_index_loader_base:private noncopyable
|
||||
{
|
||||
protected:
|
||||
typedef random_access_index_node_impl<
|
||||
typename rebind_alloc_for<
|
||||
allocator_rebind_t<
|
||||
Allocator,
|
||||
char
|
||||
>::type
|
||||
>
|
||||
> node_impl_type;
|
||||
typedef typename node_impl_type::pointer node_impl_pointer;
|
||||
typedef random_access_index_ptr_array<Allocator> ptr_array;
|
||||
@@ -93,8 +93,7 @@ protected:
|
||||
}
|
||||
|
||||
private:
|
||||
typedef allocator_traits<Allocator> alloc_traits;
|
||||
typedef typename alloc_traits::size_type size_type;
|
||||
typedef allocator_size_type_t<Allocator> size_type;
|
||||
|
||||
void preprocess()
|
||||
{
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright 2003-2021 Joaquin M Lopez Munoz.
|
||||
/* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -14,9 +14,9 @@
|
||||
#endif
|
||||
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <boost/core/allocator_access.hpp>
|
||||
#include <algorithm>
|
||||
#include <boost/integer/common_factor_rt.hpp>
|
||||
#include <boost/multi_index/detail/allocator_traits.hpp>
|
||||
#include <boost/multi_index/detail/raw_ptr.hpp>
|
||||
#include <cstddef>
|
||||
#include <functional>
|
||||
@@ -30,18 +30,16 @@ namespace detail{
|
||||
template<typename Allocator>
|
||||
struct random_access_index_node_impl
|
||||
{
|
||||
typedef typename rebind_alloc_for<
|
||||
typedef allocator_rebind_t<
|
||||
Allocator,random_access_index_node_impl
|
||||
>::type node_allocator;
|
||||
typedef allocator_traits<node_allocator> node_alloc_traits;
|
||||
typedef typename node_alloc_traits::pointer pointer;
|
||||
typedef typename node_alloc_traits::const_pointer const_pointer;
|
||||
typedef typename node_alloc_traits::difference_type difference_type;
|
||||
typedef typename rebind_alloc_for<
|
||||
> node_allocator;
|
||||
typedef allocator_pointer_t<node_allocator> pointer;
|
||||
typedef allocator_const_pointer_t<node_allocator> const_pointer;
|
||||
typedef allocator_difference_type_t<node_allocator> difference_type;
|
||||
typedef allocator_rebind_t<
|
||||
Allocator,pointer
|
||||
>::type ptr_allocator;
|
||||
typedef allocator_traits<ptr_allocator> ptr_alloc_traits;
|
||||
typedef typename ptr_alloc_traits::pointer ptr_pointer;
|
||||
> ptr_allocator;
|
||||
typedef allocator_pointer_t<ptr_allocator> ptr_pointer;
|
||||
|
||||
ptr_pointer& up(){return up_;}
|
||||
ptr_pointer up()const{return up_;}
|
||||
@@ -195,17 +193,17 @@ private:
|
||||
template<typename Super>
|
||||
struct random_access_index_node_trampoline:
|
||||
random_access_index_node_impl<
|
||||
typename rebind_alloc_for<
|
||||
allocator_rebind_t<
|
||||
typename Super::allocator_type,
|
||||
char
|
||||
>::type
|
||||
>
|
||||
>
|
||||
{
|
||||
typedef random_access_index_node_impl<
|
||||
typename rebind_alloc_for<
|
||||
allocator_rebind_t<
|
||||
typename Super::allocator_type,
|
||||
char
|
||||
>::type
|
||||
>
|
||||
> impl_type;
|
||||
};
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright 2003-2015 Joaquin M Lopez Munoz.
|
||||
/* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -83,7 +83,7 @@ template<typename Node,typename Allocator,typename Compare>
|
||||
void random_access_index_inplace_merge(
|
||||
const Allocator& al,
|
||||
random_access_index_ptr_array<Allocator>& ptrs,
|
||||
BOOST_DEDUCED_TYPENAME Node::impl_ptr_pointer first1,Compare comp)
|
||||
typename Node::impl_ptr_pointer first1,Compare comp)
|
||||
{
|
||||
typedef typename Node::value_type value_type;
|
||||
typedef typename Node::impl_pointer impl_pointer;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright 2003-2022 Joaquin M Lopez Munoz.
|
||||
/* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -14,9 +14,9 @@
|
||||
#endif
|
||||
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <boost/core/allocator_access.hpp>
|
||||
#include <algorithm>
|
||||
#include <boost/core/noncopyable.hpp>
|
||||
#include <boost/multi_index/detail/allocator_traits.hpp>
|
||||
#include <boost/multi_index/detail/auto_space.hpp>
|
||||
#include <boost/multi_index/detail/rnd_index_node.hpp>
|
||||
|
||||
@@ -32,20 +32,21 @@ template<typename Allocator>
|
||||
class random_access_index_ptr_array:private noncopyable
|
||||
{
|
||||
typedef random_access_index_node_impl<
|
||||
typename rebind_alloc_for<
|
||||
allocator_rebind_t<
|
||||
Allocator,
|
||||
char
|
||||
>::type
|
||||
>
|
||||
> node_impl_type;
|
||||
|
||||
public:
|
||||
typedef typename node_impl_type::pointer value_type;
|
||||
typedef typename rebind_alloc_for<
|
||||
typedef allocator_rebind_t<
|
||||
Allocator,value_type
|
||||
>::type value_allocator;
|
||||
typedef allocator_traits<value_allocator> alloc_traits;
|
||||
typedef typename alloc_traits::pointer pointer;
|
||||
typedef typename alloc_traits::size_type size_type;
|
||||
> value_allocator;
|
||||
typedef allocator_pointer_t<
|
||||
value_allocator> pointer;
|
||||
typedef allocator_size_type_t<
|
||||
value_allocator> size_type;
|
||||
|
||||
random_access_index_ptr_array(
|
||||
const Allocator& al,value_type end_,size_type sz):
|
||||
|
||||
@@ -46,7 +46,7 @@ ranked_node_size(Pointer x)
|
||||
|
||||
template<typename Pointer>
|
||||
inline Pointer ranked_index_nth(
|
||||
BOOST_DEDUCED_TYPENAME ranked_node_size_type<Pointer>::type n,Pointer end_)
|
||||
typename ranked_node_size_type<Pointer>::type n,Pointer end_)
|
||||
{
|
||||
typedef typename ranked_node_size_type<Pointer>::type size_type;
|
||||
|
||||
@@ -108,7 +108,7 @@ template<
|
||||
>
|
||||
inline typename Node::size_type ranked_index_find_rank(
|
||||
Node* top,Node* y,const KeyFromValue& key,
|
||||
const BOOST_DEDUCED_TYPENAME KeyFromValue::result_type& x,
|
||||
const typename KeyFromValue::result_type& x,
|
||||
const CompatibleCompare& comp,std::true_type)
|
||||
{
|
||||
return ranked_index_find_rank(top,y,key,x,comp,std::false_type());
|
||||
@@ -163,7 +163,7 @@ template<
|
||||
>
|
||||
inline typename Node::size_type ranked_index_lower_bound_rank(
|
||||
Node* top,Node* y,const KeyFromValue& key,
|
||||
const BOOST_DEDUCED_TYPENAME KeyFromValue::result_type& x,
|
||||
const typename KeyFromValue::result_type& x,
|
||||
const CompatibleCompare& comp,std::true_type)
|
||||
{
|
||||
return ranked_index_lower_bound_rank(top,y,key,x,comp,std::false_type());
|
||||
@@ -216,7 +216,7 @@ template<
|
||||
>
|
||||
inline typename Node::size_type ranked_index_upper_bound_rank(
|
||||
Node* top,Node* y,const KeyFromValue& key,
|
||||
const BOOST_DEDUCED_TYPENAME KeyFromValue::result_type& x,
|
||||
const typename KeyFromValue::result_type& x,
|
||||
const CompatibleCompare& comp,std::true_type)
|
||||
{
|
||||
return ranked_index_upper_bound_rank(top,y,key,x,comp,std::false_type());
|
||||
@@ -273,7 +273,7 @@ template<
|
||||
inline std::pair<typename Node::size_type,typename Node::size_type>
|
||||
ranked_index_equal_range_rank(
|
||||
Node* top,Node* y,const KeyFromValue& key,
|
||||
const BOOST_DEDUCED_TYPENAME KeyFromValue::result_type& x,
|
||||
const typename KeyFromValue::result_type& x,
|
||||
const CompatibleCompare& comp,std::true_type)
|
||||
{
|
||||
return ranked_index_equal_range_rank(top,y,key,x,comp,std::false_type());
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright 2003-2023 Joaquin M Lopez Munoz.
|
||||
/* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -120,7 +120,6 @@
|
||||
#include <algorithm>
|
||||
#include <boost/core/addressof.hpp>
|
||||
#include <boost/core/noncopyable.hpp>
|
||||
#include <boost/multi_index/detail/access_specifier.hpp>
|
||||
#include <boost/multi_index/detail/any_container_view.hpp>
|
||||
#include <boost/multi_index/detail/iter_adaptor.hpp>
|
||||
#include <boost/multi_index/safe_mode_errors.hpp>
|
||||
@@ -349,9 +348,7 @@ protected:
|
||||
|
||||
const safe_container_base* owner()const{return cont;}
|
||||
|
||||
BOOST_MULTI_INDEX_PRIVATE_IF_MEMBER_TEMPLATE_FRIENDS:
|
||||
|
||||
#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
|
||||
private:
|
||||
friend class safe_container_base;
|
||||
template<typename>
|
||||
friend class safe_mode::safe_container;
|
||||
@@ -360,7 +357,6 @@ BOOST_MULTI_INDEX_PRIVATE_IF_MEMBER_TEMPLATE_FRIENDS:
|
||||
template<typename Dst,typename Iterator>
|
||||
friend void safe_mode_detail::transfer_equivalent_iterators(
|
||||
Dst&,Iterator,boost::true_type);
|
||||
#endif
|
||||
|
||||
inline void attach(safe_container_base* cont_);
|
||||
|
||||
@@ -374,16 +370,13 @@ class safe_container_base:private noncopyable
|
||||
public:
|
||||
safe_container_base(){}
|
||||
|
||||
BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
|
||||
|
||||
#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
|
||||
protected:
|
||||
friend class safe_iterator_base;
|
||||
template<typename Iterator>
|
||||
friend void safe_mode::detach_equivalent_iterators(Iterator&);
|
||||
template<typename Dst,typename Iterator>
|
||||
friend void safe_mode_detail::transfer_equivalent_iterators(
|
||||
Dst&,Iterator,boost::true_type);
|
||||
#endif
|
||||
|
||||
~safe_container_base()
|
||||
{
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright 2003-2019 Joaquin M Lopez Munoz.
|
||||
/* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -14,8 +14,8 @@
|
||||
#endif
|
||||
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <boost/core/allocator_access.hpp>
|
||||
#include <algorithm>
|
||||
#include <boost/multi_index/detail/allocator_traits.hpp>
|
||||
#include <boost/multi_index/detail/raw_ptr.hpp>
|
||||
|
||||
namespace boost{
|
||||
@@ -29,13 +29,14 @@ namespace detail{
|
||||
template<typename Allocator>
|
||||
struct sequenced_index_node_impl
|
||||
{
|
||||
typedef typename rebind_alloc_for<
|
||||
typedef allocator_rebind_t<
|
||||
Allocator,sequenced_index_node_impl
|
||||
>::type node_allocator;
|
||||
typedef allocator_traits<node_allocator> alloc_traits;
|
||||
typedef typename alloc_traits::pointer pointer;
|
||||
typedef typename alloc_traits::const_pointer const_pointer;
|
||||
typedef typename alloc_traits::difference_type difference_type;
|
||||
> node_allocator;
|
||||
typedef allocator_pointer_t<node_allocator> pointer;
|
||||
typedef allocator_const_pointer_t<
|
||||
node_allocator> const_pointer;
|
||||
typedef allocator_difference_type_t<
|
||||
node_allocator> difference_type;
|
||||
|
||||
pointer& prior(){return prior_;}
|
||||
pointer prior()const{return prior_;}
|
||||
@@ -132,17 +133,17 @@ private:
|
||||
template<typename Super>
|
||||
struct sequenced_index_node_trampoline:
|
||||
sequenced_index_node_impl<
|
||||
typename rebind_alloc_for<
|
||||
allocator_rebind_t<
|
||||
typename Super::allocator_type,
|
||||
char
|
||||
>::type
|
||||
>
|
||||
>
|
||||
{
|
||||
typedef sequenced_index_node_impl<
|
||||
typename rebind_alloc_for<
|
||||
allocator_rebind_t<
|
||||
typename Super::allocator_type,
|
||||
char
|
||||
>::type
|
||||
>
|
||||
> impl_type;
|
||||
};
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright 2003-2020 Joaquin M Lopez Munoz.
|
||||
/* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -77,8 +77,8 @@ void sequenced_index_merge(SequencedIndex& x,SequencedIndex& y,Compare comp)
|
||||
|
||||
template<typename Node,typename Compare>
|
||||
void sequenced_index_collate(
|
||||
BOOST_DEDUCED_TYPENAME Node::impl_type* x,
|
||||
BOOST_DEDUCED_TYPENAME Node::impl_type* y,
|
||||
typename Node::impl_type* x,
|
||||
typename Node::impl_type* y,
|
||||
Compare comp)
|
||||
{
|
||||
typedef typename Node::impl_type impl_type;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright 2003-2013 Joaquin M Lopez Munoz.
|
||||
/* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -14,7 +14,6 @@
|
||||
#endif
|
||||
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <boost/detail/workaround.hpp>
|
||||
|
||||
namespace boost{
|
||||
|
||||
|
||||
@@ -1,247 +0,0 @@
|
||||
/* Copyright 2003-2013 Joaquin M Lopez Munoz.
|
||||
* 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/multi_index for library home page.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_MULTI_INDEX_DETAIL_VARTEMPL_SUPPORT_HPP
|
||||
#define BOOST_MULTI_INDEX_DETAIL_VARTEMPL_SUPPORT_HPP
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
/* Utilities for emulation of variadic template functions. Variadic packs are
|
||||
* replaced by lists of BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS parameters:
|
||||
*
|
||||
* - typename... Args --> BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK
|
||||
* - Args&&... args --> BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK
|
||||
* - std::forward<Args>(args)... --> BOOST_MULTI_INDEX_FORWARD_PARAM_PACK
|
||||
*
|
||||
* Forwarding emulated with Boost.Move. A template functions foo_imp
|
||||
* defined in such way accepts *exactly* BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS
|
||||
* arguments: variable number of arguments is emulated by providing a set of
|
||||
* overloads foo forwarding to foo_impl with
|
||||
*
|
||||
* BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL
|
||||
* BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL_EXTRA_ARG (initial extra arg)
|
||||
*
|
||||
* which fill the extra args with boost::multi_index::detail::noarg's.
|
||||
* boost::multi_index::detail::vartempl_placement_new works the opposite
|
||||
* way: it acceps a full a pointer x to Value and a
|
||||
* BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK and forwards to
|
||||
* new(x) Value(args) where args is the argument pack after discarding
|
||||
* noarg's.
|
||||
*
|
||||
* Emulation decays to the real thing when the compiler supports variadic
|
||||
* templates and move semantics natively.
|
||||
*/
|
||||
|
||||
#include <boost/config.hpp>
|
||||
|
||||
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)||\
|
||||
defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||
|
||||
#include <boost/move/core.hpp>
|
||||
#include <boost/move/utility.hpp>
|
||||
#include <boost/preprocessor/arithmetic/add.hpp>
|
||||
#include <boost/preprocessor/arithmetic/sub.hpp>
|
||||
#include <boost/preprocessor/cat.hpp>
|
||||
#include <boost/preprocessor/control/if.hpp>
|
||||
#include <boost/preprocessor/facilities/empty.hpp>
|
||||
#include <boost/preprocessor/facilities/intercept.hpp>
|
||||
#include <boost/preprocessor/logical/and.hpp>
|
||||
#include <boost/preprocessor/punctuation/comma.hpp>
|
||||
#include <boost/preprocessor/punctuation/comma_if.hpp>
|
||||
#include <boost/preprocessor/repetition/enum.hpp>
|
||||
#include <boost/preprocessor/repetition/enum_params.hpp>
|
||||
#include <boost/preprocessor/repetition/repeat_from_to.hpp>
|
||||
#include <boost/preprocessor/seq/elem.hpp>
|
||||
|
||||
#if !defined(BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS)
|
||||
#define BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS 5
|
||||
#endif
|
||||
|
||||
#define BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK \
|
||||
BOOST_PP_ENUM_PARAMS( \
|
||||
BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS,typename T)
|
||||
|
||||
#define BOOST_MULTI_INDEX_VARTEMPL_ARG(z,n,_) \
|
||||
BOOST_FWD_REF(BOOST_PP_CAT(T,n)) BOOST_PP_CAT(t,n)
|
||||
|
||||
#define BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK \
|
||||
BOOST_PP_ENUM( \
|
||||
BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS, \
|
||||
BOOST_MULTI_INDEX_VARTEMPL_ARG,~)
|
||||
|
||||
#define BOOST_MULTI_INDEX_VARTEMPL_FORWARD_ARG(z,n,_) \
|
||||
boost::forward<BOOST_PP_CAT(T,n)>(BOOST_PP_CAT(t,n))
|
||||
|
||||
#define BOOST_MULTI_INDEX_FORWARD_PARAM_PACK \
|
||||
BOOST_PP_ENUM( \
|
||||
BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS, \
|
||||
BOOST_MULTI_INDEX_VARTEMPL_FORWARD_ARG,~)
|
||||
|
||||
namespace boost{namespace multi_index{namespace detail{
|
||||
struct noarg{};
|
||||
}}}
|
||||
|
||||
/* call vartempl function without args */
|
||||
|
||||
#define BOOST_MULTI_INDEX_NULL_PARAM_PACK \
|
||||
BOOST_PP_ENUM_PARAMS( \
|
||||
BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS, \
|
||||
boost::multi_index::detail::noarg() BOOST_PP_INTERCEPT)
|
||||
|
||||
#define BOOST_MULTI_INDEX_TEMPLATE_N(n) \
|
||||
template<BOOST_PP_ENUM_PARAMS(n,typename T)>
|
||||
|
||||
#define BOOST_MULTI_INDEX_TEMPLATE_0(n)
|
||||
|
||||
#define BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL_AUX(z,n,data) \
|
||||
BOOST_PP_IF(n, \
|
||||
BOOST_MULTI_INDEX_TEMPLATE_N, \
|
||||
BOOST_MULTI_INDEX_TEMPLATE_0)(n) \
|
||||
BOOST_PP_SEQ_ELEM(0,data) /* ret */ \
|
||||
BOOST_PP_SEQ_ELEM(1,data) /* name_from */ ( \
|
||||
BOOST_PP_ENUM(n,BOOST_MULTI_INDEX_VARTEMPL_ARG,~)) \
|
||||
{ \
|
||||
return BOOST_PP_SEQ_ELEM(2,data) /* name_to */ ( \
|
||||
BOOST_PP_ENUM(n,BOOST_MULTI_INDEX_VARTEMPL_FORWARD_ARG,~) \
|
||||
BOOST_PP_COMMA_IF( \
|
||||
BOOST_PP_AND( \
|
||||
n,BOOST_PP_SUB(BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS,n))) \
|
||||
BOOST_PP_ENUM_PARAMS( \
|
||||
BOOST_PP_SUB(BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS,n), \
|
||||
boost::multi_index::detail::noarg() BOOST_PP_INTERCEPT) \
|
||||
); \
|
||||
}
|
||||
|
||||
#define BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL( \
|
||||
ret,name_from,name_to) \
|
||||
BOOST_PP_REPEAT_FROM_TO( \
|
||||
0,BOOST_PP_ADD(BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS,1), \
|
||||
BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL_AUX, \
|
||||
(ret)(name_from)(name_to))
|
||||
|
||||
#define BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL_EXTRA_ARG_AUX( \
|
||||
z,n,data) \
|
||||
BOOST_PP_IF(n, \
|
||||
BOOST_MULTI_INDEX_TEMPLATE_N, \
|
||||
BOOST_MULTI_INDEX_TEMPLATE_0)(n) \
|
||||
BOOST_PP_SEQ_ELEM(0,data) /* ret */ \
|
||||
BOOST_PP_SEQ_ELEM(1,data) /* name_from */ ( \
|
||||
BOOST_PP_SEQ_ELEM(3,data) BOOST_PP_SEQ_ELEM(4,data) /* extra arg */\
|
||||
BOOST_PP_COMMA_IF(n) \
|
||||
BOOST_PP_ENUM(n,BOOST_MULTI_INDEX_VARTEMPL_ARG,~)) \
|
||||
{ \
|
||||
return BOOST_PP_SEQ_ELEM(2,data) /* name_to */ ( \
|
||||
BOOST_PP_SEQ_ELEM(4,data) /* extra_arg_name */ \
|
||||
BOOST_PP_COMMA_IF(n) \
|
||||
BOOST_PP_ENUM(n,BOOST_MULTI_INDEX_VARTEMPL_FORWARD_ARG,~) \
|
||||
BOOST_PP_COMMA_IF( \
|
||||
BOOST_PP_SUB(BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS,n)) \
|
||||
BOOST_PP_ENUM_PARAMS( \
|
||||
BOOST_PP_SUB(BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS,n), \
|
||||
boost::multi_index::detail::noarg() BOOST_PP_INTERCEPT) \
|
||||
); \
|
||||
}
|
||||
|
||||
#define BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL_EXTRA_ARG( \
|
||||
ret,name_from,name_to,extra_arg_type,extra_arg_name) \
|
||||
BOOST_PP_REPEAT_FROM_TO( \
|
||||
0,BOOST_PP_ADD(BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS,1), \
|
||||
BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL_EXTRA_ARG_AUX, \
|
||||
(ret)(name_from)(name_to)(extra_arg_type)(extra_arg_name))
|
||||
|
||||
namespace boost{
|
||||
|
||||
namespace multi_index{
|
||||
|
||||
namespace detail{
|
||||
|
||||
#define BOOST_MULTI_INDEX_VARTEMPL_TO_PLACEMENT_NEW_AUX(z,n,name) \
|
||||
template< \
|
||||
typename Value \
|
||||
BOOST_PP_COMMA_IF(n) \
|
||||
BOOST_PP_ENUM_PARAMS(n,typename T) \
|
||||
> \
|
||||
Value* name( \
|
||||
Value* x \
|
||||
BOOST_PP_COMMA_IF(n) \
|
||||
BOOST_PP_ENUM(n,BOOST_MULTI_INDEX_VARTEMPL_ARG,~) \
|
||||
BOOST_PP_COMMA_IF( \
|
||||
BOOST_PP_SUB(BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS,n)) \
|
||||
BOOST_PP_ENUM_PARAMS( \
|
||||
BOOST_PP_SUB(BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS,n), \
|
||||
BOOST_FWD_REF(noarg) BOOST_PP_INTERCEPT)) \
|
||||
{ \
|
||||
return new(x) Value( \
|
||||
BOOST_PP_ENUM(n,BOOST_MULTI_INDEX_VARTEMPL_FORWARD_ARG,~)); \
|
||||
}
|
||||
|
||||
#define BOOST_MULTI_INDEX_VARTEMPL_TO_PLACEMENT_NEW(name) \
|
||||
BOOST_PP_REPEAT_FROM_TO( \
|
||||
0,BOOST_PP_ADD(BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS,1), \
|
||||
BOOST_MULTI_INDEX_VARTEMPL_TO_PLACEMENT_NEW_AUX, \
|
||||
name)
|
||||
|
||||
BOOST_MULTI_INDEX_VARTEMPL_TO_PLACEMENT_NEW(vartempl_placement_new)
|
||||
|
||||
#undef BOOST_MULTI_INDEX_VARTEMPL_TO_PLACEMENT_NEW_AUX
|
||||
#undef BOOST_MULTI_INDEX_VARTEMPL_TO_PLACEMENT_NEW
|
||||
|
||||
} /* namespace multi_index::detail */
|
||||
|
||||
} /* namespace multi_index */
|
||||
|
||||
} /* namespace boost */
|
||||
|
||||
#else
|
||||
|
||||
/* native variadic templates support */
|
||||
|
||||
#include <utility>
|
||||
|
||||
#define BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK typename... Args
|
||||
#define BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK Args&&... args
|
||||
#define BOOST_MULTI_INDEX_FORWARD_PARAM_PACK std::forward<Args>(args)...
|
||||
#define BOOST_MULTI_INDEX_NULL_PARAM_PACK
|
||||
|
||||
#define BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL( \
|
||||
ret,name_from,name_to) \
|
||||
template<typename... Args> ret name_from(Args&&... args) \
|
||||
{ \
|
||||
return name_to(std::forward<Args>(args)...); \
|
||||
}
|
||||
|
||||
#define BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL_EXTRA_ARG( \
|
||||
ret,name_from,name_to,extra_arg_type,extra_arg_name) \
|
||||
template<typename... Args> ret name_from( \
|
||||
extra_arg_type extra_arg_name,Args&&... args) \
|
||||
{ \
|
||||
return name_to(extra_arg_name,std::forward<Args>(args)...); \
|
||||
}
|
||||
|
||||
namespace boost{
|
||||
|
||||
namespace multi_index{
|
||||
|
||||
namespace detail{
|
||||
|
||||
template<typename Value,typename... Args>
|
||||
Value* vartempl_placement_new(Value*x,Args&&... args)
|
||||
{
|
||||
return new(x) Value(std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
} /* namespace multi_index::detail */
|
||||
|
||||
} /* namespace multi_index */
|
||||
|
||||
} /* namespace boost */
|
||||
|
||||
#endif
|
||||
#endif
|
||||
@@ -18,14 +18,11 @@
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/mp11/utility.hpp>
|
||||
#include <boost/type_traits/is_const.hpp>
|
||||
#include <boost/type_traits/is_convertible.hpp>
|
||||
#include <boost/type_traits/is_reference.hpp>
|
||||
#include <boost/type_traits/remove_const.hpp>
|
||||
#include <boost/type_traits/remove_reference.hpp>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
#include <boost/type_traits/is_convertible.hpp>
|
||||
#endif
|
||||
|
||||
namespace boost{
|
||||
|
||||
template<class T> class reference_wrapper; /* fwd decl. */
|
||||
@@ -54,13 +51,8 @@ struct const_ref_global_fun_base
|
||||
|
||||
template<typename ChainedPtr>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
typename disable_if<
|
||||
is_convertible<const ChainedPtr&,Value>,Type>::type
|
||||
#else
|
||||
Type
|
||||
#endif
|
||||
|
||||
operator()(const ChainedPtr& x)const
|
||||
{
|
||||
return operator()(*x);
|
||||
@@ -101,13 +93,8 @@ struct non_const_ref_global_fun_base
|
||||
|
||||
template<typename ChainedPtr>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
typename disable_if<
|
||||
is_convertible<ChainedPtr&,Value>,Type>::type
|
||||
#else
|
||||
Type
|
||||
#endif
|
||||
|
||||
operator()(const ChainedPtr& x)const
|
||||
{
|
||||
return operator()(*x);
|
||||
@@ -133,13 +120,8 @@ struct non_ref_global_fun_base
|
||||
|
||||
template<typename ChainedPtr>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
typename disable_if<
|
||||
is_convertible<const ChainedPtr&,const Value&>,Type>::type
|
||||
#else
|
||||
Type
|
||||
#endif
|
||||
|
||||
operator()(const ChainedPtr& x)const
|
||||
{
|
||||
return operator()(*x);
|
||||
|
||||
@@ -17,15 +17,11 @@
|
||||
#include <algorithm>
|
||||
#include <boost/call_traits.hpp>
|
||||
#include <boost/core/addressof.hpp>
|
||||
#include <boost/core/allocator_access.hpp>
|
||||
#include <boost/core/no_exceptions_support.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/limits.hpp>
|
||||
#include <boost/move/core.hpp>
|
||||
#include <boost/move/utility_core.hpp>
|
||||
#include <boost/mp11/utility.hpp>
|
||||
#include <boost/multi_index/detail/access_specifier.hpp>
|
||||
#include <boost/multi_index/detail/adl_swap.hpp>
|
||||
#include <boost/multi_index/detail/allocator_traits.hpp>
|
||||
#include <boost/multi_index/detail/auto_space.hpp>
|
||||
#include <boost/multi_index/detail/bucket_array.hpp>
|
||||
#include <boost/multi_index/detail/do_not_copy_elements_tag.hpp>
|
||||
@@ -38,21 +34,17 @@
|
||||
#include <boost/multi_index/detail/safe_mode.hpp>
|
||||
#include <boost/multi_index/detail/scope_guard.hpp>
|
||||
#include <boost/multi_index/detail/type_list.hpp>
|
||||
#include <boost/multi_index/detail/vartempl_support.hpp>
|
||||
#include <boost/multi_index/hashed_index_fwd.hpp>
|
||||
#include <boost/tuple/tuple.hpp>
|
||||
#include <boost/type_traits/is_same.hpp>
|
||||
#include <cmath>
|
||||
#include <cstddef>
|
||||
#include <functional>
|
||||
#include <initializer_list>
|
||||
#include <iterator>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
#include <initializer_list>
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION)
|
||||
#include <boost/core/serialization.hpp>
|
||||
#endif
|
||||
@@ -91,24 +83,10 @@ template<
|
||||
typename KeyFromValue,typename Hash,typename Pred,
|
||||
typename SuperMeta,typename TagList,typename Category
|
||||
>
|
||||
class hashed_index:
|
||||
BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS SuperMeta::type
|
||||
class hashed_index:protected SuperMeta::type
|
||||
{
|
||||
#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)&&\
|
||||
BOOST_WORKAROUND(__MWERKS__,<=0x3003)
|
||||
/* The "ISO C++ Template Parser" option in CW8.3 has a problem with the
|
||||
* lifetime of const references bound to temporaries --precisely what
|
||||
* scopeguards are.
|
||||
*/
|
||||
|
||||
#pragma parse_mfunc_templ off
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
|
||||
/* cross-index access */
|
||||
|
||||
template <typename,typename,typename> friend class index_base;
|
||||
#endif
|
||||
|
||||
typedef typename SuperMeta::type super;
|
||||
|
||||
@@ -134,17 +112,14 @@ public:
|
||||
typedef Hash hasher;
|
||||
typedef Pred key_equal;
|
||||
typedef typename super::final_allocator_type allocator_type;
|
||||
|
||||
private:
|
||||
typedef allocator_traits<allocator_type> alloc_traits;
|
||||
|
||||
public:
|
||||
typedef typename alloc_traits::pointer pointer;
|
||||
typedef typename alloc_traits::const_pointer const_pointer;
|
||||
typedef allocator_pointer_t<allocator_type> pointer;
|
||||
typedef allocator_const_pointer_t<
|
||||
allocator_type> const_pointer;
|
||||
typedef value_type& reference;
|
||||
typedef const value_type& const_reference;
|
||||
typedef typename alloc_traits::size_type size_type;
|
||||
typedef typename alloc_traits::difference_type difference_type;
|
||||
typedef allocator_size_type_t<allocator_type> size_type;
|
||||
typedef allocator_difference_type_t<
|
||||
allocator_type> difference_type;
|
||||
typedef tuple<size_type,
|
||||
key_from_value,hasher,key_equal> ctor_args;
|
||||
|
||||
@@ -220,14 +195,12 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
hashed_index<KeyFromValue,Hash,Pred,SuperMeta,TagList,Category>& operator=(
|
||||
std::initializer_list<value_type> list)
|
||||
{
|
||||
this->final()=list;
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
||||
allocator_type get_allocator()const BOOST_NOEXCEPT
|
||||
{
|
||||
@@ -273,11 +246,27 @@ public:
|
||||
|
||||
/* modifiers */
|
||||
|
||||
BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL(
|
||||
pair_return_type,emplace,emplace_impl)
|
||||
template<typename...Args>
|
||||
std::pair<iterator,bool> emplace(Args&&... args)
|
||||
{
|
||||
BOOST_MULTI_INDEX_HASHED_INDEX_CHECK_INVARIANT;
|
||||
std::pair<final_node_type*,bool>p=
|
||||
this->final_emplace_(std::forward<Args>(args)...);
|
||||
return std::pair<iterator,bool>(make_iterator(p.first),p.second);
|
||||
}
|
||||
|
||||
BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL_EXTRA_ARG(
|
||||
iterator,emplace_hint,emplace_hint_impl,iterator,position)
|
||||
template<typename...Args>
|
||||
iterator emplace_hint(iterator position,Args&&... args)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
BOOST_MULTI_INDEX_HASHED_INDEX_CHECK_INVARIANT;
|
||||
std::pair<final_node_type*,bool>p=
|
||||
this->final_emplace_hint_(
|
||||
static_cast<final_node_type*>(position.get_node()),
|
||||
std::forward<Args>(args)...);
|
||||
return make_iterator(p.first);
|
||||
}
|
||||
|
||||
std::pair<iterator,bool> insert(const value_type& x)
|
||||
{
|
||||
@@ -286,7 +275,7 @@ public:
|
||||
return std::pair<iterator,bool>(make_iterator(p.first),p.second);
|
||||
}
|
||||
|
||||
std::pair<iterator,bool> insert(BOOST_RV_REF(value_type) x)
|
||||
std::pair<iterator,bool> insert(value_type&& x)
|
||||
{
|
||||
BOOST_MULTI_INDEX_HASHED_INDEX_CHECK_INVARIANT;
|
||||
std::pair<final_node_type*,bool> p=this->final_insert_rv_(x);
|
||||
@@ -303,7 +292,7 @@ public:
|
||||
return make_iterator(p.first);
|
||||
}
|
||||
|
||||
iterator insert(iterator position,BOOST_RV_REF(value_type) x)
|
||||
iterator insert(iterator position,value_type&& x)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
@@ -320,22 +309,20 @@ public:
|
||||
for(;first!=last;++first)this->final_insert_ref_(*first);
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
void insert(std::initializer_list<value_type> list)
|
||||
{
|
||||
insert(list.begin(),list.end());
|
||||
}
|
||||
#endif
|
||||
|
||||
insert_return_type insert(BOOST_RV_REF(node_type) nh)
|
||||
insert_return_type insert(node_type&& nh)
|
||||
{
|
||||
if(nh)BOOST_MULTI_INDEX_CHECK_EQUAL_ALLOCATORS(*this,nh);
|
||||
BOOST_MULTI_INDEX_HASHED_INDEX_CHECK_INVARIANT;
|
||||
std::pair<final_node_type*,bool> p=this->final_insert_nh_(nh);
|
||||
return insert_return_type(make_iterator(p.first),p.second,boost::move(nh));
|
||||
return insert_return_type(make_iterator(p.first),p.second,std::move(nh));
|
||||
}
|
||||
|
||||
iterator insert(const_iterator position,BOOST_RV_REF(node_type) nh)
|
||||
iterator insert(const_iterator position,node_type&& nh)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
@@ -420,7 +407,7 @@ public:
|
||||
x,static_cast<final_node_type*>(position.get_node()));
|
||||
}
|
||||
|
||||
bool replace(iterator position,BOOST_RV_REF(value_type) x)
|
||||
bool replace(iterator position,value_type&& x)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_DEREFERENCEABLE_ITERATOR(position);
|
||||
@@ -518,11 +505,11 @@ public:
|
||||
|
||||
template<typename Index>
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(hashed_index,Index,void)
|
||||
merge(BOOST_RV_REF(Index) x){merge(static_cast<Index&>(x));}
|
||||
merge(Index&& x){merge(static_cast<Index&>(x));}
|
||||
|
||||
template<typename Index>
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(hashed_index,Index,pair_return_type)
|
||||
merge(Index& x,BOOST_DEDUCED_TYPENAME Index::iterator i)
|
||||
merge(Index& x,typename Index::iterator i)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(i);
|
||||
BOOST_MULTI_INDEX_CHECK_DEREFERENCEABLE_ITERATOR(i);
|
||||
@@ -542,7 +529,7 @@ public:
|
||||
|
||||
template<typename Index>
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(hashed_index,Index,pair_return_type)
|
||||
merge(BOOST_RV_REF(Index) x,BOOST_DEDUCED_TYPENAME Index::iterator i)
|
||||
merge(Index&& x,typename Index::iterator i)
|
||||
{
|
||||
return merge(static_cast<Index&>(x),i);
|
||||
}
|
||||
@@ -551,8 +538,8 @@ public:
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(hashed_index,Index,void)
|
||||
merge(
|
||||
Index& x,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator first,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator last)
|
||||
typename Index::iterator first,
|
||||
typename Index::iterator last)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(first);
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(last);
|
||||
@@ -569,9 +556,9 @@ public:
|
||||
template<typename Index>
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(hashed_index,Index,void)
|
||||
merge(
|
||||
BOOST_RV_REF(Index) x,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator first,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator last)
|
||||
Index&& x,
|
||||
typename Index::iterator first,
|
||||
typename Index::iterator last)
|
||||
{
|
||||
merge(static_cast<Index&>(x),first,last);
|
||||
}
|
||||
@@ -747,7 +734,7 @@ public:
|
||||
rehash(static_cast<size_type>(std::ceil(static_cast<float>(n)/mlf)));
|
||||
}
|
||||
|
||||
BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
|
||||
protected:
|
||||
hashed_index(const ctor_args_list& args_list,const allocator_type& al):
|
||||
super(args_list.get_tail(),al),
|
||||
key(tuples::get<1>(args_list.get_head())),
|
||||
@@ -1178,13 +1165,9 @@ BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
|
||||
|
||||
/* comparison */
|
||||
|
||||
#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
|
||||
/* defect macro refers to class, not function, templates, but anyway */
|
||||
|
||||
template<typename K,typename H,typename P,typename S,typename T,typename C>
|
||||
friend bool operator==(
|
||||
const hashed_index<K,H,P,S,T,C>&,const hashed_index<K,H,P,S,T,C>& y);
|
||||
#endif
|
||||
|
||||
bool equals(const hashed_index& x)const{return equals(x,Category());}
|
||||
|
||||
@@ -1659,29 +1642,6 @@ private:
|
||||
}
|
||||
#endif
|
||||
|
||||
template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
|
||||
std::pair<iterator,bool> emplace_impl(BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
|
||||
{
|
||||
BOOST_MULTI_INDEX_HASHED_INDEX_CHECK_INVARIANT;
|
||||
std::pair<final_node_type*,bool>p=
|
||||
this->final_emplace_(BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);
|
||||
return std::pair<iterator,bool>(make_iterator(p.first),p.second);
|
||||
}
|
||||
|
||||
template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
|
||||
iterator emplace_hint_impl(
|
||||
iterator position,BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
BOOST_MULTI_INDEX_HASHED_INDEX_CHECK_INVARIANT;
|
||||
std::pair<final_node_type*,bool>p=
|
||||
this->final_emplace_hint_(
|
||||
static_cast<final_node_type*>(position.get_node()),
|
||||
BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);
|
||||
return make_iterator(p.first);
|
||||
}
|
||||
|
||||
template<
|
||||
typename CompatibleHash,typename CompatiblePred
|
||||
>
|
||||
@@ -1781,11 +1741,6 @@ private:
|
||||
#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
|
||||
safe_container safe;
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)&&\
|
||||
BOOST_WORKAROUND(__MWERKS__,<=0x3003)
|
||||
#pragma parse_mfunc_templ reset
|
||||
#endif
|
||||
};
|
||||
|
||||
#if defined(BOOST_MSVC)
|
||||
|
||||
@@ -19,11 +19,8 @@
|
||||
#include <boost/mp11/utility.hpp>
|
||||
#include <boost/multi_index/identity_fwd.hpp>
|
||||
#include <boost/type_traits/is_const.hpp>
|
||||
#include <boost/type_traits/remove_const.hpp>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
#include <boost/type_traits/is_convertible.hpp>
|
||||
#endif
|
||||
#include <boost/type_traits/remove_const.hpp>
|
||||
|
||||
namespace boost{
|
||||
|
||||
@@ -50,12 +47,7 @@ struct const_identity_base
|
||||
|
||||
template<typename ChainedPtr>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
typename disable_if<is_convertible<const ChainedPtr&,Type&>,Type&>::type
|
||||
#else
|
||||
Type&
|
||||
#endif
|
||||
|
||||
operator()(const ChainedPtr& x)const
|
||||
{
|
||||
return operator()(*x);
|
||||
@@ -94,13 +86,8 @@ struct non_const_identity_base
|
||||
|
||||
template<typename ChainedPtr>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
typename disable_if<
|
||||
is_convertible<const ChainedPtr&,const Type&>,Type&>::type
|
||||
#else
|
||||
Type&
|
||||
#endif
|
||||
|
||||
operator()(const ChainedPtr& x)const
|
||||
{
|
||||
return operator()(*x);
|
||||
|
||||
@@ -15,11 +15,8 @@
|
||||
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <boost/core/enable_if.hpp>
|
||||
#include <boost/type_traits/remove_reference.hpp>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
#include <boost/type_traits/is_convertible.hpp>
|
||||
#endif
|
||||
#include <boost/type_traits/remove_reference.hpp>
|
||||
|
||||
namespace boost{
|
||||
|
||||
@@ -58,13 +55,8 @@ struct const_mem_fun_impl
|
||||
|
||||
template<typename ChainedPtr>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
typename disable_if<
|
||||
is_convertible<const ChainedPtr&,const Class&>,Type>::type
|
||||
#else
|
||||
Type
|
||||
#endif
|
||||
|
||||
operator()(const ChainedPtr& x)const
|
||||
{
|
||||
return operator()(*x);
|
||||
@@ -96,13 +88,8 @@ struct mem_fun_impl
|
||||
|
||||
template<typename ChainedPtr>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
typename disable_if<
|
||||
is_convertible<ChainedPtr&,Class&>,Type>::type
|
||||
#else
|
||||
Type
|
||||
#endif
|
||||
|
||||
operator()(const ChainedPtr& x)const
|
||||
{
|
||||
return operator()(*x);
|
||||
@@ -198,13 +185,8 @@ struct const_mem_fun_explicit
|
||||
|
||||
template<typename ChainedPtr>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
typename disable_if<
|
||||
is_convertible<const ChainedPtr&,const Class&>,Type>::type
|
||||
#else
|
||||
Type
|
||||
#endif
|
||||
|
||||
operator()(const ChainedPtr& x)const
|
||||
{
|
||||
return operator()(*x);
|
||||
@@ -236,13 +218,8 @@ struct mem_fun_explicit
|
||||
|
||||
template<typename ChainedPtr>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
typename disable_if<
|
||||
is_convertible<ChainedPtr&,Class&>,Type>::type
|
||||
#else
|
||||
Type
|
||||
#endif
|
||||
|
||||
operator()(const ChainedPtr& x)const
|
||||
{
|
||||
return operator()(*x);
|
||||
|
||||
@@ -17,11 +17,8 @@
|
||||
#include <boost/core/enable_if.hpp>
|
||||
#include <boost/mp11/utility.hpp>
|
||||
#include <boost/type_traits/is_const.hpp>
|
||||
#include <cstddef>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
#include <boost/type_traits/is_convertible.hpp>
|
||||
#endif
|
||||
#include <cstddef>
|
||||
|
||||
namespace boost{
|
||||
|
||||
@@ -48,13 +45,8 @@ struct const_member_base
|
||||
|
||||
template<typename ChainedPtr>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
typename disable_if<
|
||||
is_convertible<const ChainedPtr&,const Class&>,Type&>::type
|
||||
#else
|
||||
Type&
|
||||
#endif
|
||||
|
||||
operator()(const ChainedPtr& x)const
|
||||
{
|
||||
return operator()(*x);
|
||||
@@ -83,13 +75,8 @@ struct non_const_member_base
|
||||
|
||||
template<typename ChainedPtr>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
typename disable_if<
|
||||
is_convertible<const ChainedPtr&,const Class&>,Type&>::type
|
||||
#else
|
||||
Type&
|
||||
#endif
|
||||
|
||||
operator()(const ChainedPtr& x)const
|
||||
{
|
||||
return operator()(*x);
|
||||
@@ -154,13 +141,8 @@ struct const_member_offset_base
|
||||
|
||||
template<typename ChainedPtr>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
typename disable_if<
|
||||
is_convertible<const ChainedPtr&,const Class&>,Type&>::type
|
||||
#else
|
||||
Type&
|
||||
#endif
|
||||
|
||||
operator()(const ChainedPtr& x)const
|
||||
{
|
||||
return operator()(*x);
|
||||
@@ -192,13 +174,8 @@ struct non_const_member_offset_base
|
||||
|
||||
template<typename ChainedPtr>
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
typename disable_if<
|
||||
is_convertible<const ChainedPtr&,const Class&>,Type&>::type
|
||||
#else
|
||||
Type&
|
||||
#endif
|
||||
|
||||
operator()(const ChainedPtr& x)const
|
||||
{
|
||||
return operator()(*x);
|
||||
@@ -242,18 +219,13 @@ struct member_offset:
|
||||
{
|
||||
};
|
||||
|
||||
/* BOOST_MULTI_INDEX_MEMBER resolves to member in the normal cases,
|
||||
* and to member_offset as a workaround in those defective compilers for
|
||||
* which BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS is defined.
|
||||
/* BOOST_MULTI_INDEX_MEMBER used to resolve to member_offset in those defective
|
||||
* compilers for which BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS is
|
||||
* defined, none of which is supported any longer.
|
||||
*/
|
||||
|
||||
#if defined(BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS)
|
||||
#define BOOST_MULTI_INDEX_MEMBER(Class,Type,MemberName) \
|
||||
::boost::multi_index::member_offset< Class,Type,offsetof(Class,MemberName) >
|
||||
#else
|
||||
#define BOOST_MULTI_INDEX_MEMBER(Class,Type,MemberName) \
|
||||
::boost::multi_index::member< Class,Type,&Class::MemberName >
|
||||
#endif
|
||||
|
||||
} /* namespace multi_index */
|
||||
|
||||
|
||||
@@ -18,13 +18,9 @@
|
||||
#include <boost/bind/bind.hpp>
|
||||
#include <boost/call_traits.hpp>
|
||||
#include <boost/core/addressof.hpp>
|
||||
#include <boost/core/allocator_access.hpp>
|
||||
#include <boost/core/no_exceptions_support.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/move/core.hpp>
|
||||
#include <boost/move/utility_core.hpp>
|
||||
#include <boost/mp11/function.hpp>
|
||||
#include <boost/multi_index/detail/access_specifier.hpp>
|
||||
#include <boost/multi_index/detail/allocator_traits.hpp>
|
||||
#include <boost/multi_index/detail/do_not_copy_elements_tag.hpp>
|
||||
#include <boost/multi_index/detail/index_node_base.hpp>
|
||||
#include <boost/multi_index/detail/node_handle.hpp>
|
||||
@@ -35,22 +31,18 @@
|
||||
#include <boost/multi_index/detail/safe_mode.hpp>
|
||||
#include <boost/multi_index/detail/scope_guard.hpp>
|
||||
#include <boost/multi_index/detail/type_list.hpp>
|
||||
#include <boost/multi_index/detail/vartempl_support.hpp>
|
||||
#include <boost/multi_index/random_access_index_fwd.hpp>
|
||||
#include <boost/throw_exception.hpp>
|
||||
#include <boost/tuple/tuple.hpp>
|
||||
#include <boost/type_traits/is_copy_constructible.hpp>
|
||||
#include <boost/type_traits/is_integral.hpp>
|
||||
#include <functional>
|
||||
#include <initializer_list>
|
||||
#include <iterator>
|
||||
#include <stdexcept>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
#include<initializer_list>
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION)
|
||||
#include <boost/multi_index/detail/rnd_index_loader.hpp>
|
||||
#endif
|
||||
@@ -83,24 +75,10 @@ namespace detail{
|
||||
#endif
|
||||
|
||||
template<typename SuperMeta,typename TagList>
|
||||
class random_access_index:
|
||||
BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS SuperMeta::type
|
||||
class random_access_index:protected SuperMeta::type
|
||||
{
|
||||
#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)&&\
|
||||
BOOST_WORKAROUND(__MWERKS__,<=0x3003)
|
||||
/* The "ISO C++ Template Parser" option in CW8.3 has a problem with the
|
||||
* lifetime of const references bound to temporaries --precisely what
|
||||
* scopeguards are.
|
||||
*/
|
||||
|
||||
#pragma parse_mfunc_templ off
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
|
||||
/* cross-index access */
|
||||
|
||||
template <typename,typename,typename> friend class index_base;
|
||||
#endif
|
||||
|
||||
typedef typename SuperMeta::type super;
|
||||
|
||||
@@ -131,15 +109,12 @@ public:
|
||||
#endif
|
||||
|
||||
typedef iterator const_iterator;
|
||||
|
||||
private:
|
||||
typedef allocator_traits<allocator_type> alloc_traits;
|
||||
|
||||
public:
|
||||
typedef typename alloc_traits::pointer pointer;
|
||||
typedef typename alloc_traits::const_pointer const_pointer;
|
||||
typedef typename alloc_traits::size_type size_type;
|
||||
typedef typename alloc_traits::difference_type difference_type;
|
||||
typedef allocator_pointer_t<allocator_type> pointer;
|
||||
typedef allocator_const_pointer_t<
|
||||
allocator_type> const_pointer;
|
||||
typedef allocator_size_type_t<allocator_type> size_type;
|
||||
typedef allocator_difference_type_t<
|
||||
allocator_type> difference_type;
|
||||
typedef typename
|
||||
std::reverse_iterator<iterator> reverse_iterator;
|
||||
typedef typename
|
||||
@@ -196,14 +171,12 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
random_access_index<SuperMeta,TagList>& operator=(
|
||||
std::initializer_list<value_type> list)
|
||||
{
|
||||
this->final()=list;
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
||||
template <class InputIterator>
|
||||
void assign(InputIterator first,InputIterator last)
|
||||
@@ -211,12 +184,10 @@ public:
|
||||
assign_iter(first,last,mp11::mp_not<is_integral<InputIterator> >());
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
void assign(std::initializer_list<value_type> list)
|
||||
{
|
||||
assign(list.begin(),list.end());
|
||||
}
|
||||
#endif
|
||||
|
||||
void assign(size_type n,value_param_type value)
|
||||
{
|
||||
@@ -291,10 +262,12 @@ public:
|
||||
void resize(size_type n)
|
||||
{
|
||||
BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT;
|
||||
if(n>size())
|
||||
for(size_type m=n-size();m--;)
|
||||
this->final_emplace_(BOOST_MULTI_INDEX_NULL_PARAM_PACK);
|
||||
else if(n<size())erase(begin()+n,end());
|
||||
if(n>size()){
|
||||
for(size_type m=n-size();m--;)this->final_emplace_();
|
||||
}
|
||||
else if(n<size()){
|
||||
erase(begin()+n,end());
|
||||
}
|
||||
}
|
||||
|
||||
void resize(size_type n,value_param_type x)
|
||||
@@ -325,26 +298,43 @@ public:
|
||||
|
||||
/* modifiers */
|
||||
|
||||
BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL(
|
||||
pair_return_type,emplace_front,emplace_front_impl)
|
||||
template<typename... Args>
|
||||
std::pair<iterator,bool> emplace_front(Args&&... args)
|
||||
{
|
||||
return emplace(begin(),std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
std::pair<iterator,bool> push_front(const value_type& x)
|
||||
{return insert(begin(),x);}
|
||||
std::pair<iterator,bool> push_front(BOOST_RV_REF(value_type) x)
|
||||
{return insert(begin(),boost::move(x));}
|
||||
std::pair<iterator,bool> push_front(value_type&& x)
|
||||
{return insert(begin(),std::move(x));}
|
||||
void pop_front(){erase(begin());}
|
||||
|
||||
BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL(
|
||||
pair_return_type,emplace_back,emplace_back_impl)
|
||||
template<typename... Args>
|
||||
std::pair<iterator,bool> emplace_back(Args&&... args)
|
||||
{
|
||||
return emplace(end(),std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
std::pair<iterator,bool> push_back(const value_type& x)
|
||||
{return insert(end(),x);}
|
||||
std::pair<iterator,bool> push_back(BOOST_RV_REF(value_type) x)
|
||||
{return insert(end(),boost::move(x));}
|
||||
std::pair<iterator,bool> push_back(value_type&& x)
|
||||
{return insert(end(),std::move(x));}
|
||||
void pop_back(){erase(--end());}
|
||||
|
||||
BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL_EXTRA_ARG(
|
||||
pair_return_type,emplace,emplace_impl,iterator,position)
|
||||
template<typename... Args>
|
||||
std::pair<iterator,bool> emplace(iterator position,Args&&... args)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT;
|
||||
std::pair<final_node_type*,bool> p=
|
||||
this->final_emplace_(std::forward<Args>(args)...);
|
||||
if(p.second&&position.get_node()!=header()){
|
||||
relocate(position.get_node(),p.first);
|
||||
}
|
||||
return std::pair<iterator,bool>(make_iterator(p.first),p.second);
|
||||
}
|
||||
|
||||
std::pair<iterator,bool> insert(iterator position,const value_type& x)
|
||||
{
|
||||
@@ -358,7 +348,7 @@ public:
|
||||
return std::pair<iterator,bool>(make_iterator(p.first),p.second);
|
||||
}
|
||||
|
||||
std::pair<iterator,bool> insert(iterator position,BOOST_RV_REF(value_type) x)
|
||||
std::pair<iterator,bool> insert(iterator position,value_type&& x)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
@@ -395,14 +385,12 @@ public:
|
||||
insert_iter(position,first,last,mp11::mp_not<is_integral<InputIterator> >());
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
void insert(iterator position,std::initializer_list<value_type> list)
|
||||
{
|
||||
insert(position,list.begin(),list.end());
|
||||
}
|
||||
#endif
|
||||
|
||||
insert_return_type insert(const_iterator position,BOOST_RV_REF(node_type) nh)
|
||||
insert_return_type insert(const_iterator position,node_type&& nh)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
@@ -412,7 +400,7 @@ public:
|
||||
if(p.second&&position.get_node()!=header()){
|
||||
relocate(position.get_node(),p.first);
|
||||
}
|
||||
return insert_return_type(make_iterator(p.first),p.second,boost::move(nh));
|
||||
return insert_return_type(make_iterator(p.first),p.second,std::move(nh));
|
||||
}
|
||||
|
||||
node_type extract(const_iterator position)
|
||||
@@ -459,7 +447,7 @@ public:
|
||||
x,static_cast<final_node_type*>(position.get_node()));
|
||||
}
|
||||
|
||||
bool replace(iterator position,BOOST_RV_REF(value_type) x)
|
||||
bool replace(iterator position,value_type&& x)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_DEREFERENCEABLE_ITERATOR(position);
|
||||
@@ -546,7 +534,7 @@ public:
|
||||
|
||||
template<typename Index>
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(random_access_index,Index,void)
|
||||
splice(iterator position,BOOST_RV_REF(Index) x)
|
||||
splice(iterator position,Index&& x)
|
||||
{
|
||||
splice(position,static_cast<Index&>(x));
|
||||
}
|
||||
@@ -555,7 +543,7 @@ public:
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(
|
||||
random_access_index,Index,pair_return_type)
|
||||
splice(
|
||||
iterator position,Index& x,BOOST_DEDUCED_TYPENAME Index::iterator i)
|
||||
iterator position,Index& x,typename Index::iterator i)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
@@ -581,8 +569,8 @@ public:
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(
|
||||
random_access_index,Index,pair_return_type)
|
||||
splice(
|
||||
iterator position,BOOST_RV_REF(Index) x,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator i)
|
||||
iterator position,Index&& x,
|
||||
typename Index::iterator i)
|
||||
{
|
||||
return splice(position,static_cast<Index&>(x),i);
|
||||
}
|
||||
@@ -591,8 +579,8 @@ public:
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(random_access_index,Index,void)
|
||||
splice(
|
||||
iterator position,Index& x,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator first,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator last)
|
||||
typename Index::iterator first,
|
||||
typename Index::iterator last)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
@@ -615,9 +603,9 @@ public:
|
||||
template<typename Index>
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(random_access_index,Index,void)
|
||||
splice(
|
||||
iterator position,BOOST_RV_REF(Index) x,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator first,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator last)
|
||||
iterator position,Index&& x,
|
||||
typename Index::iterator first,
|
||||
typename Index::iterator last)
|
||||
{
|
||||
splice(position,static_cast<Index&>(x),first,last);
|
||||
}
|
||||
@@ -751,7 +739,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
|
||||
protected:
|
||||
random_access_index(
|
||||
const ctor_args_list& args_list,const allocator_type& al):
|
||||
super(args_list.get_tail(),al),
|
||||
@@ -1080,38 +1068,9 @@ private:
|
||||
relocate(position,end()-s,end());
|
||||
}
|
||||
|
||||
template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
|
||||
std::pair<iterator,bool> emplace_front_impl(
|
||||
BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
|
||||
{
|
||||
return emplace_impl(begin(),BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);
|
||||
}
|
||||
|
||||
template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
|
||||
std::pair<iterator,bool> emplace_back_impl(
|
||||
BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
|
||||
{
|
||||
return emplace_impl(end(),BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);
|
||||
}
|
||||
|
||||
template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
|
||||
std::pair<iterator,bool> emplace_impl(
|
||||
iterator position,BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT;
|
||||
std::pair<final_node_type*,bool> p=
|
||||
this->final_emplace_(BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);
|
||||
if(p.second&&position.get_node()!=header()){
|
||||
relocate(position.get_node(),p.first);
|
||||
}
|
||||
return std::pair<iterator,bool>(make_iterator(p.first),p.second);
|
||||
}
|
||||
|
||||
template<typename Index>
|
||||
std::pair<final_node_type*,bool> external_splice(
|
||||
iterator position,Index& x,BOOST_DEDUCED_TYPENAME Index::iterator i,
|
||||
iterator position,Index& x,typename Index::iterator i,
|
||||
boost::true_type /* copy-constructible value */)
|
||||
{
|
||||
if(get_allocator()==x.get_allocator()){
|
||||
@@ -1129,7 +1088,7 @@ private:
|
||||
|
||||
template<typename Index>
|
||||
std::pair<final_node_type*,bool> external_splice(
|
||||
iterator position,Index& x,BOOST_DEDUCED_TYPENAME Index::iterator i,
|
||||
iterator position,Index& x,typename Index::iterator i,
|
||||
boost::false_type /* copy-constructible value */)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_EQUAL_ALLOCATORS(*this,x);
|
||||
@@ -1173,8 +1132,8 @@ private:
|
||||
template<typename Index>
|
||||
void external_splice(
|
||||
iterator position,Index& x,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator first,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator last,
|
||||
typename Index::iterator first,
|
||||
typename Index::iterator last,
|
||||
boost::true_type /* copy-constructible value */)
|
||||
{
|
||||
if(get_allocator()==x.get_allocator()){
|
||||
@@ -1202,8 +1161,8 @@ private:
|
||||
template<typename Index>
|
||||
void external_splice(
|
||||
iterator position,Index& x,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator first,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator last,
|
||||
typename Index::iterator first,
|
||||
typename Index::iterator last,
|
||||
boost::false_type /* copy-constructible value */)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_EQUAL_ALLOCATORS(*this,x);
|
||||
@@ -1224,11 +1183,6 @@ private:
|
||||
#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
|
||||
safe_container safe;
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)&&\
|
||||
BOOST_WORKAROUND(__MWERKS__,<=0x3003)
|
||||
#pragma parse_mfunc_templ reset
|
||||
#endif
|
||||
};
|
||||
|
||||
#if defined(BOOST_MSVC)
|
||||
|
||||
@@ -17,13 +17,9 @@
|
||||
#include <boost/bind/bind.hpp>
|
||||
#include <boost/call_traits.hpp>
|
||||
#include <boost/core/addressof.hpp>
|
||||
#include <boost/core/allocator_access.hpp>
|
||||
#include <boost/core/no_exceptions_support.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/move/core.hpp>
|
||||
#include <boost/move/utility_core.hpp>
|
||||
#include <boost/mp11/function.hpp>
|
||||
#include <boost/multi_index/detail/access_specifier.hpp>
|
||||
#include <boost/multi_index/detail/allocator_traits.hpp>
|
||||
#include <boost/multi_index/detail/bidir_node_iterator.hpp>
|
||||
#include <boost/multi_index/detail/do_not_copy_elements_tag.hpp>
|
||||
#include <boost/multi_index/detail/index_node_base.hpp>
|
||||
@@ -33,20 +29,16 @@
|
||||
#include <boost/multi_index/detail/seq_index_node.hpp>
|
||||
#include <boost/multi_index/detail/seq_index_ops.hpp>
|
||||
#include <boost/multi_index/detail/type_list.hpp>
|
||||
#include <boost/multi_index/detail/vartempl_support.hpp>
|
||||
#include <boost/multi_index/sequenced_index_fwd.hpp>
|
||||
#include <boost/tuple/tuple.hpp>
|
||||
#include <boost/type_traits/is_copy_constructible.hpp>
|
||||
#include <boost/type_traits/is_integral.hpp>
|
||||
#include <functional>
|
||||
#include <initializer_list>
|
||||
#include <iterator>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
#include<initializer_list>
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)
|
||||
#define BOOST_MULTI_INDEX_SEQ_INDEX_CHECK_INVARIANT_OF(x) \
|
||||
detail::scope_guard BOOST_JOIN(check_invariant_,__LINE__)= \
|
||||
@@ -73,24 +65,10 @@ namespace detail{
|
||||
#endif
|
||||
|
||||
template<typename SuperMeta,typename TagList>
|
||||
class sequenced_index:
|
||||
BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS SuperMeta::type
|
||||
class sequenced_index:protected SuperMeta::type
|
||||
{
|
||||
#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)&&\
|
||||
BOOST_WORKAROUND(__MWERKS__,<=0x3003)
|
||||
/* The "ISO C++ Template Parser" option in CW8.3 has a problem with the
|
||||
* lifetime of const references bound to temporaries --precisely what
|
||||
* scopeguards are.
|
||||
*/
|
||||
|
||||
#pragma parse_mfunc_templ off
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
|
||||
/* cross-index access */
|
||||
|
||||
template <typename,typename,typename> friend class index_base;
|
||||
#endif
|
||||
|
||||
typedef typename SuperMeta::type super;
|
||||
|
||||
@@ -118,15 +96,12 @@ public:
|
||||
#endif
|
||||
|
||||
typedef iterator const_iterator;
|
||||
|
||||
private:
|
||||
typedef allocator_traits<allocator_type> alloc_traits;
|
||||
|
||||
public:
|
||||
typedef typename alloc_traits::pointer pointer;
|
||||
typedef typename alloc_traits::const_pointer const_pointer;
|
||||
typedef typename alloc_traits::size_type size_type;
|
||||
typedef typename alloc_traits::difference_type difference_type;
|
||||
typedef allocator_pointer_t<allocator_type> pointer;
|
||||
typedef allocator_const_pointer<
|
||||
allocator_type> const_pointer;
|
||||
typedef allocator_size_type_t<allocator_type> size_type;
|
||||
typedef allocator_difference_type_t<
|
||||
allocator_type> difference_type;
|
||||
typedef typename
|
||||
std::reverse_iterator<iterator> reverse_iterator;
|
||||
typedef typename
|
||||
@@ -182,14 +157,12 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
sequenced_index<SuperMeta,TagList>& operator=(
|
||||
std::initializer_list<value_type> list)
|
||||
{
|
||||
this->final()=list;
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
||||
template <class InputIterator>
|
||||
void assign(InputIterator first,InputIterator last)
|
||||
@@ -197,12 +170,10 @@ public:
|
||||
assign_iter(first,last,mp11::mp_not<is_integral<InputIterator> >());
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
void assign(std::initializer_list<value_type> list)
|
||||
{
|
||||
assign(list.begin(),list.end());
|
||||
}
|
||||
#endif
|
||||
|
||||
void assign(size_type n,value_param_type value)
|
||||
{
|
||||
@@ -265,10 +236,11 @@ public:
|
||||
{
|
||||
BOOST_MULTI_INDEX_SEQ_INDEX_CHECK_INVARIANT;
|
||||
if(n>size()){
|
||||
for(size_type m=n-size();m--;)
|
||||
this->final_emplace_(BOOST_MULTI_INDEX_NULL_PARAM_PACK);
|
||||
for(size_type m=n-size();m--;)this->final_emplace_();
|
||||
}
|
||||
else if(n<size()){
|
||||
for(size_type m=size()-n;m--;)pop_back();
|
||||
}
|
||||
else if(n<size()){for(size_type m=size()-n;m--;)pop_back();}
|
||||
}
|
||||
|
||||
void resize(size_type n,value_param_type x)
|
||||
@@ -287,26 +259,43 @@ public:
|
||||
|
||||
/* modifiers */
|
||||
|
||||
BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL(
|
||||
pair_return_type,emplace_front,emplace_front_impl)
|
||||
template<typename... Args>
|
||||
std::pair<iterator,bool> emplace_front(Args&&... args)
|
||||
{
|
||||
return emplace(begin(),std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
std::pair<iterator,bool> push_front(const value_type& x)
|
||||
{return insert(begin(),x);}
|
||||
std::pair<iterator,bool> push_front(BOOST_RV_REF(value_type) x)
|
||||
{return insert(begin(),boost::move(x));}
|
||||
std::pair<iterator,bool> push_front(value_type&& x)
|
||||
{return insert(begin(),std::move(x));}
|
||||
void pop_front(){erase(begin());}
|
||||
|
||||
BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL(
|
||||
pair_return_type,emplace_back,emplace_back_impl)
|
||||
template<typename... Args>
|
||||
std::pair<iterator,bool> emplace_back(Args&&... args)
|
||||
{
|
||||
return emplace(end(),std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
std::pair<iterator,bool> push_back(const value_type& x)
|
||||
{return insert(end(),x);}
|
||||
std::pair<iterator,bool> push_back(BOOST_RV_REF(value_type) x)
|
||||
{return insert(end(),boost::move(x));}
|
||||
std::pair<iterator,bool> push_back(value_type&& x)
|
||||
{return insert(end(),std::move(x));}
|
||||
void pop_back(){erase(--end());}
|
||||
|
||||
BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL_EXTRA_ARG(
|
||||
pair_return_type,emplace,emplace_impl,iterator,position)
|
||||
template<typename... Args>
|
||||
std::pair<iterator,bool> emplace(iterator position,Args&&... args)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
BOOST_MULTI_INDEX_SEQ_INDEX_CHECK_INVARIANT;
|
||||
std::pair<final_node_type*,bool> p=
|
||||
this->final_emplace_(std::forward<Args>(args)...);
|
||||
if(p.second&&position.get_node()!=header()){
|
||||
relink(position.get_node(),p.first);
|
||||
}
|
||||
return std::pair<iterator,bool>(make_iterator(p.first),p.second);
|
||||
}
|
||||
|
||||
std::pair<iterator,bool> insert(iterator position,const value_type& x)
|
||||
{
|
||||
@@ -320,7 +309,7 @@ public:
|
||||
return std::pair<iterator,bool>(make_iterator(p.first),p.second);
|
||||
}
|
||||
|
||||
std::pair<iterator,bool> insert(iterator position,BOOST_RV_REF(value_type) x)
|
||||
std::pair<iterator,bool> insert(iterator position,value_type&& x)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
@@ -346,14 +335,12 @@ public:
|
||||
insert_iter(position,first,last,mp11::mp_not<is_integral<InputIterator> >());
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
void insert(iterator position,std::initializer_list<value_type> list)
|
||||
{
|
||||
insert(position,list.begin(),list.end());
|
||||
}
|
||||
#endif
|
||||
|
||||
insert_return_type insert(const_iterator position,BOOST_RV_REF(node_type) nh)
|
||||
insert_return_type insert(const_iterator position,node_type&& nh)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
@@ -363,7 +350,7 @@ public:
|
||||
if(p.second&&position.get_node()!=header()){
|
||||
relink(position.get_node(),p.first);
|
||||
}
|
||||
return insert_return_type(make_iterator(p.first),p.second,boost::move(nh));
|
||||
return insert_return_type(make_iterator(p.first),p.second,std::move(nh));
|
||||
}
|
||||
|
||||
node_type extract(const_iterator position)
|
||||
@@ -410,7 +397,7 @@ public:
|
||||
x,static_cast<final_node_type*>(position.get_node()));
|
||||
}
|
||||
|
||||
bool replace(iterator position,BOOST_RV_REF(value_type) x)
|
||||
bool replace(iterator position,value_type&& x)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_DEREFERENCEABLE_ITERATOR(position);
|
||||
@@ -497,7 +484,7 @@ public:
|
||||
|
||||
template<typename Index>
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(sequenced_index,Index,void)
|
||||
splice(iterator position,BOOST_RV_REF(Index) x)
|
||||
splice(iterator position,Index&& x)
|
||||
{
|
||||
splice(position,static_cast<Index&>(x));
|
||||
}
|
||||
@@ -506,7 +493,7 @@ public:
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(
|
||||
sequenced_index,Index,pair_return_type)
|
||||
splice(
|
||||
iterator position,Index& x,BOOST_DEDUCED_TYPENAME Index::iterator i)
|
||||
iterator position,Index& x,typename Index::iterator i)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
@@ -532,8 +519,8 @@ public:
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(
|
||||
sequenced_index,Index,pair_return_type)
|
||||
splice(
|
||||
iterator position,BOOST_RV_REF(Index) x,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator i)
|
||||
iterator position,Index&& x,
|
||||
typename Index::iterator i)
|
||||
{
|
||||
return splice(position,static_cast<Index&>(x),i);
|
||||
}
|
||||
@@ -542,8 +529,8 @@ public:
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(sequenced_index,Index,void)
|
||||
splice(
|
||||
iterator position,Index& x,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator first,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator last)
|
||||
typename Index::iterator first,
|
||||
typename Index::iterator last)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
@@ -566,9 +553,9 @@ public:
|
||||
template<typename Index>
|
||||
BOOST_MULTI_INDEX_ENABLE_IF_MERGEABLE(sequenced_index,Index,void)
|
||||
splice(
|
||||
iterator position,BOOST_RV_REF(Index) x,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator first,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator last)
|
||||
iterator position,Index&& x,
|
||||
typename Index::iterator first,
|
||||
typename Index::iterator last)
|
||||
{
|
||||
splice(position,static_cast<Index&>(x),first,last);
|
||||
}
|
||||
@@ -667,7 +654,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
|
||||
protected:
|
||||
sequenced_index(const ctor_args_list& args_list,const allocator_type& al):
|
||||
super(args_list.get_tail(),al)
|
||||
|
||||
@@ -992,38 +979,9 @@ private:
|
||||
for(size_type i=0;i<n;++i)insert(position,x);
|
||||
}
|
||||
|
||||
template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
|
||||
std::pair<iterator,bool> emplace_front_impl(
|
||||
BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
|
||||
{
|
||||
return emplace_impl(begin(),BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);
|
||||
}
|
||||
|
||||
template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
|
||||
std::pair<iterator,bool> emplace_back_impl(
|
||||
BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
|
||||
{
|
||||
return emplace_impl(end(),BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);
|
||||
}
|
||||
|
||||
template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
|
||||
std::pair<iterator,bool> emplace_impl(
|
||||
iterator position,BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position);
|
||||
BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
|
||||
BOOST_MULTI_INDEX_SEQ_INDEX_CHECK_INVARIANT;
|
||||
std::pair<final_node_type*,bool> p=
|
||||
this->final_emplace_(BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);
|
||||
if(p.second&&position.get_node()!=header()){
|
||||
relink(position.get_node(),p.first);
|
||||
}
|
||||
return std::pair<iterator,bool>(make_iterator(p.first),p.second);
|
||||
}
|
||||
|
||||
template<typename Index>
|
||||
std::pair<final_node_type*,bool> external_splice(
|
||||
iterator position,Index& x,BOOST_DEDUCED_TYPENAME Index::iterator i,
|
||||
iterator position,Index& x,typename Index::iterator i,
|
||||
boost::true_type /* copy-constructible value */)
|
||||
{
|
||||
if(get_allocator()==x.get_allocator()){
|
||||
@@ -1041,7 +999,7 @@ private:
|
||||
|
||||
template<typename Index>
|
||||
std::pair<final_node_type*,bool> external_splice(
|
||||
iterator position,Index& x,BOOST_DEDUCED_TYPENAME Index::iterator i,
|
||||
iterator position,Index& x,typename Index::iterator i,
|
||||
boost::false_type /* copy-constructible value */)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_EQUAL_ALLOCATORS(*this,x);
|
||||
@@ -1073,8 +1031,8 @@ private:
|
||||
template<typename Index>
|
||||
void external_splice(
|
||||
iterator position,Index& x,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator first,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator last,
|
||||
typename Index::iterator first,
|
||||
typename Index::iterator last,
|
||||
boost::true_type /* copy-constructible value */)
|
||||
{
|
||||
if(get_allocator()==x.get_allocator()){
|
||||
@@ -1093,8 +1051,8 @@ private:
|
||||
template<typename Index>
|
||||
void external_splice(
|
||||
iterator position,Index& x,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator first,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator last,
|
||||
typename Index::iterator first,
|
||||
typename Index::iterator last,
|
||||
boost::false_type /* copy-constructible value */)
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_EQUAL_ALLOCATORS(*this,x);
|
||||
@@ -1120,11 +1078,6 @@ private:
|
||||
#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
|
||||
safe_container safe;
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)&&\
|
||||
BOOST_WORKAROUND(__MWERKS__,<=0x3003)
|
||||
#pragma parse_mfunc_templ reset
|
||||
#endif
|
||||
};
|
||||
|
||||
#if defined(BOOST_MSVC)
|
||||
|
||||
@@ -18,17 +18,14 @@
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <algorithm>
|
||||
#include <boost/core/addressof.hpp>
|
||||
#include <boost/core/allocator_access.hpp>
|
||||
#include <boost/core/no_exceptions_support.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/move/core.hpp>
|
||||
#include <boost/move/utility_core.hpp>
|
||||
#include <boost/mp11/algorithm.hpp>
|
||||
#include <boost/mp11/integral.hpp>
|
||||
#include <boost/mp11/utility.hpp>
|
||||
#include <boost/multi_index_container_fwd.hpp>
|
||||
#include <boost/multi_index/detail/access_specifier.hpp>
|
||||
#include <boost/multi_index/detail/adl_swap.hpp>
|
||||
#include <boost/multi_index/detail/allocator_traits.hpp>
|
||||
#include <boost/multi_index/detail/base_type.hpp>
|
||||
#include <boost/multi_index/detail/do_not_copy_elements_tag.hpp>
|
||||
#include <boost/multi_index/detail/converter.hpp>
|
||||
@@ -40,15 +37,12 @@
|
||||
#include <boost/multi_index/detail/no_duplicate_tags_in_index_list.hpp>
|
||||
#include <boost/multi_index/detail/safe_mode.hpp>
|
||||
#include <boost/multi_index/detail/scope_guard.hpp>
|
||||
#include <boost/multi_index/detail/vartempl_support.hpp>
|
||||
#include <boost/static_assert.hpp>
|
||||
#include <boost/type_traits/integral_constant.hpp>
|
||||
#include <boost/type_traits/is_same.hpp>
|
||||
#include <boost/utility/base_from_member.hpp>
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
#include <initializer_list>
|
||||
#endif
|
||||
#include <utility>
|
||||
|
||||
#if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION)
|
||||
#include <boost/core/serialization.hpp>
|
||||
@@ -96,51 +90,36 @@ struct unequal_alloc_move_ctor_tag{};
|
||||
template<typename Value,typename IndexSpecifierList,typename Allocator>
|
||||
class multi_index_container:
|
||||
private ::boost::base_from_member<
|
||||
typename detail::rebind_alloc_for<
|
||||
allocator_rebind_t<
|
||||
Allocator,
|
||||
typename detail::multi_index_node_type<
|
||||
Value,IndexSpecifierList,Allocator>::type
|
||||
>::type
|
||||
>
|
||||
>,
|
||||
BOOST_MULTI_INDEX_PRIVATE_IF_MEMBER_TEMPLATE_FRIENDS detail::header_holder<
|
||||
typename detail::allocator_traits<
|
||||
typename detail::rebind_alloc_for<
|
||||
private detail::header_holder<
|
||||
allocator_pointer_t<
|
||||
allocator_rebind_t<
|
||||
Allocator,
|
||||
typename detail::multi_index_node_type<
|
||||
Value,IndexSpecifierList,Allocator>::type
|
||||
>::type
|
||||
>::pointer,
|
||||
>
|
||||
>,
|
||||
multi_index_container<Value,IndexSpecifierList,Allocator> >,
|
||||
public detail::multi_index_base_type<
|
||||
Value,IndexSpecifierList,Allocator>::type
|
||||
{
|
||||
#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)&&\
|
||||
BOOST_WORKAROUND(__MWERKS__,<=0x3003)
|
||||
/* The "ISO C++ Template Parser" option in CW8.3 has a problem with the
|
||||
* lifetime of const references bound to temporaries --precisely what
|
||||
* scopeguards are.
|
||||
*/
|
||||
|
||||
#pragma parse_mfunc_templ off
|
||||
#endif
|
||||
|
||||
private:
|
||||
BOOST_COPYABLE_AND_MOVABLE(multi_index_container)
|
||||
|
||||
#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
|
||||
template <typename,typename,typename> friend class detail::index_base;
|
||||
template <typename,typename> friend struct detail::header_holder;
|
||||
template <typename,typename> friend struct detail::converter;
|
||||
#endif
|
||||
|
||||
typedef typename detail::multi_index_base_type<
|
||||
Value,IndexSpecifierList,Allocator>::type super;
|
||||
typedef typename detail::rebind_alloc_for<
|
||||
typedef allocator_rebind_t<
|
||||
Allocator,
|
||||
typename super::index_node_type
|
||||
>::type node_allocator;
|
||||
typedef detail::allocator_traits<node_allocator> node_alloc_traits;
|
||||
typedef typename node_alloc_traits::pointer node_pointer;
|
||||
> node_allocator;
|
||||
typedef allocator_pointer_t<node_allocator> node_pointer;
|
||||
typedef ::boost::base_from_member<
|
||||
node_allocator> bfm_allocator;
|
||||
typedef detail::header_holder<
|
||||
@@ -185,19 +164,7 @@ public:
|
||||
|
||||
explicit multi_index_container(
|
||||
const ctor_args_list& args_list,
|
||||
|
||||
#if BOOST_WORKAROUND(__IBMCPP__,<=600)
|
||||
/* VisualAge seems to have an ETI issue with the default value for
|
||||
* argument al.
|
||||
*/
|
||||
|
||||
const allocator_type& al=
|
||||
typename mp11::mp_identity<multi_index_container>::type::
|
||||
allocator_type()):
|
||||
#else
|
||||
const allocator_type& al=allocator_type()):
|
||||
#endif
|
||||
|
||||
bfm_allocator(al),
|
||||
super(args_list,bfm_allocator::member),
|
||||
node_count(0)
|
||||
@@ -216,23 +183,8 @@ public:
|
||||
template<typename InputIterator>
|
||||
multi_index_container(
|
||||
InputIterator first,InputIterator last,
|
||||
|
||||
#if BOOST_WORKAROUND(__IBMCPP__,<=600)
|
||||
/* VisualAge seems to have an ETI issue with the default values
|
||||
* for arguments args_list and al.
|
||||
*/
|
||||
|
||||
const ctor_args_list& args_list=
|
||||
typename mp11::mp_identity<multi_index_container>::type::
|
||||
ctor_args_list(),
|
||||
const allocator_type& al=
|
||||
typename mp11::mp_identity<multi_index_container>::type::
|
||||
allocator_type()):
|
||||
#else
|
||||
const ctor_args_list& args_list=ctor_args_list(),
|
||||
const allocator_type& al=allocator_type()):
|
||||
#endif
|
||||
|
||||
bfm_allocator(al),
|
||||
super(args_list,bfm_allocator::member),
|
||||
node_count(0)
|
||||
@@ -253,7 +205,6 @@ public:
|
||||
BOOST_CATCH_END
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
multi_index_container(
|
||||
std::initializer_list<Value> list,
|
||||
const ctor_args_list& args_list=ctor_args_list(),
|
||||
@@ -279,12 +230,11 @@ public:
|
||||
}
|
||||
BOOST_CATCH_END
|
||||
}
|
||||
#endif
|
||||
|
||||
multi_index_container(
|
||||
const multi_index_container<Value,IndexSpecifierList,Allocator>& x):
|
||||
bfm_allocator(
|
||||
node_alloc_traits::select_on_container_copy_construction(
|
||||
allocator_select_on_container_copy_construction(
|
||||
x.bfm_allocator::member)),
|
||||
bfm_header(),
|
||||
super(x),
|
||||
@@ -293,8 +243,8 @@ public:
|
||||
copy_construct_from(x);
|
||||
}
|
||||
|
||||
multi_index_container(BOOST_RV_REF(multi_index_container) x):
|
||||
bfm_allocator(boost::move(x.bfm_allocator::member)),
|
||||
multi_index_container(multi_index_container&& x):
|
||||
bfm_allocator(std::move(x.bfm_allocator::member)),
|
||||
bfm_header(),
|
||||
super(x,detail::do_not_copy_elements_tag()),
|
||||
node_count(0)
|
||||
@@ -316,7 +266,7 @@ public:
|
||||
}
|
||||
|
||||
multi_index_container(
|
||||
BOOST_RV_REF(multi_index_container) x,const allocator_type& al):
|
||||
multi_index_container&& x,const allocator_type& al):
|
||||
bfm_allocator(al),
|
||||
bfm_header(),
|
||||
super(x,detail::do_not_copy_elements_tag()),
|
||||
@@ -339,48 +289,33 @@ public:
|
||||
delete_all_nodes_();
|
||||
}
|
||||
|
||||
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
||||
/* As per http://www.boost.org/doc/html/move/emulation_limitations.html
|
||||
* #move.emulation_limitations.assignment_operator
|
||||
*/
|
||||
|
||||
multi_index_container<Value,IndexSpecifierList,Allocator>& operator=(
|
||||
const multi_index_container<Value,IndexSpecifierList,Allocator>& x)
|
||||
const multi_index_container& x)
|
||||
{
|
||||
multi_index_container y(
|
||||
x,
|
||||
node_alloc_traits::propagate_on_container_copy_assignment::value?
|
||||
x.get_allocator():this->get_allocator());
|
||||
swap_(y,boost::true_type() /* swap_allocators */);
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
||||
multi_index_container<Value,IndexSpecifierList,Allocator>& operator=(
|
||||
BOOST_COPY_ASSIGN_REF(multi_index_container) x)
|
||||
{
|
||||
multi_index_container y(
|
||||
x,
|
||||
node_alloc_traits::propagate_on_container_copy_assignment::value?
|
||||
allocator_propagate_on_container_copy_assignment_t<
|
||||
node_allocator>::value?
|
||||
x.get_allocator():this->get_allocator());
|
||||
swap_(y,boost::true_type() /* swap_allocators */);
|
||||
return *this;
|
||||
}
|
||||
|
||||
multi_index_container<Value,IndexSpecifierList,Allocator>& operator=(
|
||||
BOOST_RV_REF(multi_index_container) x)
|
||||
multi_index_container&& x)
|
||||
{
|
||||
#include <boost/multi_index/detail/define_if_constexpr_macro.hpp>
|
||||
|
||||
BOOST_MULTI_INDEX_IF_CONSTEXPR(
|
||||
node_alloc_traits::propagate_on_container_move_assignment::value){
|
||||
allocator_propagate_on_container_move_assignment_t<
|
||||
node_allocator>::value){
|
||||
swap_(x,boost::true_type() /* swap_allocators */);
|
||||
}
|
||||
else if(this->get_allocator()==x.get_allocator()){
|
||||
swap_(x,boost::false_type() /* swap_allocators */);
|
||||
}
|
||||
else{
|
||||
multi_index_container y(boost::move(x),this->get_allocator());
|
||||
multi_index_container y(std::move(x),this->get_allocator());
|
||||
swap_(y,boost::false_type() /* swap_allocators */);
|
||||
}
|
||||
return *this;
|
||||
@@ -388,7 +323,6 @@ public:
|
||||
#include <boost/multi_index/detail/undef_if_constexpr_macro.hpp>
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
multi_index_container<Value,IndexSpecifierList,Allocator>& operator=(
|
||||
std::initializer_list<Value> list)
|
||||
{
|
||||
@@ -405,7 +339,6 @@ public:
|
||||
x.swap_elements_(*this);
|
||||
return*this;
|
||||
}
|
||||
#endif
|
||||
|
||||
allocator_type get_allocator()const BOOST_NOEXCEPT
|
||||
{
|
||||
@@ -414,7 +347,6 @@ public:
|
||||
|
||||
/* retrieval of indices by number */
|
||||
|
||||
#if !defined(BOOST_NO_MEMBER_TEMPLATES)
|
||||
template<int N>
|
||||
struct nth_index
|
||||
{
|
||||
@@ -435,11 +367,9 @@ public:
|
||||
BOOST_STATIC_ASSERT(N>=0&&N<mp11::mp_size<index_type_list>::value);
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* retrieval of indices by tag */
|
||||
|
||||
#if !defined(BOOST_NO_MEMBER_TEMPLATES)
|
||||
template<typename Tag>
|
||||
struct index
|
||||
{
|
||||
@@ -466,11 +396,9 @@ public:
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* projection of iterators by number */
|
||||
|
||||
#if !defined(BOOST_NO_MEMBER_TEMPLATES)
|
||||
template<int N>
|
||||
struct nth_index_iterator
|
||||
{
|
||||
@@ -488,10 +416,8 @@ public:
|
||||
{
|
||||
typedef typename nth_index<N>::type index_type;
|
||||
|
||||
#if !defined(__SUNPRO_CC)||!(__SUNPRO_CC<0x580) /* fails in Sun C++ 5.7 */
|
||||
BOOST_STATIC_ASSERT(
|
||||
(mp11::mp_contains<iterator_type_list,IteratorType>::value));
|
||||
#endif
|
||||
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(it);
|
||||
BOOST_MULTI_INDEX_CHECK_BELONGS_IN_SOME_INDEX(it,*this);
|
||||
@@ -504,22 +430,18 @@ public:
|
||||
{
|
||||
typedef typename nth_index<N>::type index_type;
|
||||
|
||||
#if !defined(__SUNPRO_CC)||!(__SUNPRO_CC<0x580) /* fails in Sun C++ 5.7 */
|
||||
BOOST_STATIC_ASSERT((
|
||||
mp11::mp_contains<iterator_type_list,IteratorType>::value||
|
||||
mp11::mp_contains<const_iterator_type_list,IteratorType>::value));
|
||||
#endif
|
||||
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(it);
|
||||
BOOST_MULTI_INDEX_CHECK_BELONGS_IN_SOME_INDEX(it,*this);
|
||||
return index_type::make_iterator(
|
||||
static_cast<final_node_type*>(it.get_node()));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* projection of iterators by tag */
|
||||
|
||||
#if !defined(BOOST_NO_MEMBER_TEMPLATES)
|
||||
template<typename Tag>
|
||||
struct index_iterator
|
||||
{
|
||||
@@ -537,10 +459,8 @@ public:
|
||||
{
|
||||
typedef typename index<Tag>::type index_type;
|
||||
|
||||
#if !defined(__SUNPRO_CC)||!(__SUNPRO_CC<0x580) /* fails in Sun C++ 5.7 */
|
||||
BOOST_STATIC_ASSERT(
|
||||
(mp11::mp_contains<iterator_type_list,IteratorType>::value));
|
||||
#endif
|
||||
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(it);
|
||||
BOOST_MULTI_INDEX_CHECK_BELONGS_IN_SOME_INDEX(it,*this);
|
||||
@@ -553,20 +473,17 @@ public:
|
||||
{
|
||||
typedef typename index<Tag>::type index_type;
|
||||
|
||||
#if !defined(__SUNPRO_CC)||!(__SUNPRO_CC<0x580) /* fails in Sun C++ 5.7 */
|
||||
BOOST_STATIC_ASSERT((
|
||||
mp11::mp_contains<iterator_type_list,IteratorType>::value||
|
||||
mp11::mp_contains<const_iterator_type_list,IteratorType>::value));
|
||||
#endif
|
||||
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(it);
|
||||
BOOST_MULTI_INDEX_CHECK_BELONGS_IN_SOME_INDEX(it,*this);
|
||||
return index_type::make_iterator(
|
||||
static_cast<final_node_type*>(it.get_node()));
|
||||
}
|
||||
#endif
|
||||
|
||||
BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
|
||||
protected:
|
||||
typedef typename super::final_node_handle_type final_node_handle_type;
|
||||
typedef typename super::copy_map_type copy_map_type;
|
||||
|
||||
@@ -603,7 +520,6 @@ BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
|
||||
BOOST_MULTI_INDEX_CHECK_INVARIANT;
|
||||
}
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
multi_index_container(
|
||||
const multi_index_container<Value,IndexSpecifierList,Allocator>& x,
|
||||
detail::do_not_copy_elements_tag):
|
||||
@@ -614,7 +530,6 @@ BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
|
||||
{
|
||||
BOOST_MULTI_INDEX_CHECK_INVARIANT;
|
||||
}
|
||||
#endif
|
||||
|
||||
void copy_construct_from(
|
||||
const multi_index_container<Value,IndexSpecifierList,Allocator>& x)
|
||||
@@ -641,33 +556,26 @@ BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
|
||||
|
||||
final_node_type* allocate_node()
|
||||
{
|
||||
return &*node_alloc_traits::allocate(bfm_allocator::member,1);
|
||||
return &*allocator_allocate(bfm_allocator::member,1);
|
||||
}
|
||||
|
||||
void deallocate_node(final_node_type* x)
|
||||
{
|
||||
node_alloc_traits::deallocate(
|
||||
allocator_deallocate(
|
||||
bfm_allocator::member,static_cast<node_pointer>(x),1);
|
||||
}
|
||||
|
||||
void construct_value(final_node_type* x,const Value& v)
|
||||
template<typename... Args>
|
||||
void construct_value(final_node_type* x,Args&&... args)
|
||||
{
|
||||
node_alloc_traits::construct(
|
||||
bfm_allocator::member,boost::addressof(x->value()),v);
|
||||
allocator_construct(
|
||||
bfm_allocator::member,boost::addressof(x->value()),
|
||||
std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
void construct_value(final_node_type* x,BOOST_RV_REF(Value) v)
|
||||
{
|
||||
node_alloc_traits::construct(
|
||||
bfm_allocator::member,boost::addressof(x->value()),boost::move(v));
|
||||
}
|
||||
|
||||
BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL_EXTRA_ARG(
|
||||
void,construct_value,vartempl_construct_value_impl,final_node_type*,x)
|
||||
|
||||
void destroy_value(final_node_type* x)
|
||||
{
|
||||
node_alloc_traits::destroy(
|
||||
allocator_destroy(
|
||||
bfm_allocator::member,boost::addressof(x->value()));
|
||||
}
|
||||
|
||||
@@ -780,13 +688,12 @@ BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
|
||||
}
|
||||
}
|
||||
|
||||
template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
|
||||
std::pair<final_node_type*,bool> emplace_(
|
||||
BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
|
||||
template<typename... Args>
|
||||
std::pair<final_node_type*,bool> emplace_(Args&&... args)
|
||||
{
|
||||
final_node_type* x=allocate_node();
|
||||
BOOST_TRY{
|
||||
construct_value(x,BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);
|
||||
construct_value(x,std::forward<Args>(args)...);
|
||||
BOOST_TRY{
|
||||
final_node_type* res=super::insert_(
|
||||
x->value(),x,detail::emplaced_tag());
|
||||
@@ -900,14 +807,13 @@ BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
|
||||
}
|
||||
}
|
||||
|
||||
template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
|
||||
template<typename... Args>
|
||||
std::pair<final_node_type*,bool> emplace_hint_(
|
||||
final_node_type* position,
|
||||
BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
|
||||
final_node_type* position,Args&&... args)
|
||||
{
|
||||
final_node_type* x=allocate_node();
|
||||
BOOST_TRY{
|
||||
construct_value(x,BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);
|
||||
construct_value(x,std::forward<Args>(args)...);
|
||||
BOOST_TRY{
|
||||
final_node_type* res=super::insert_(
|
||||
x->value(),position,x,detail::emplaced_tag());
|
||||
@@ -975,8 +881,8 @@ BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
|
||||
template<typename Index>
|
||||
void transfer_range_(
|
||||
Index& x,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator first,
|
||||
BOOST_DEDUCED_TYPENAME Index::iterator last)
|
||||
typename Index::iterator first,
|
||||
typename Index::iterator last)
|
||||
{
|
||||
while(first!=last){
|
||||
transfer_(x,static_cast<final_node_type*>((first++).get_node()));
|
||||
@@ -988,7 +894,8 @@ BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
|
||||
swap_(
|
||||
x,
|
||||
boost::integral_constant<
|
||||
bool,node_alloc_traits::propagate_on_container_swap::value>());
|
||||
bool,allocator_propagate_on_container_swap_t<
|
||||
node_allocator>::value>());
|
||||
}
|
||||
|
||||
void swap_(
|
||||
@@ -1206,21 +1113,7 @@ BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
|
||||
#endif
|
||||
|
||||
private:
|
||||
template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
|
||||
void vartempl_construct_value_impl(
|
||||
final_node_type* x,BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
|
||||
{
|
||||
node_alloc_traits::construct(
|
||||
bfm_allocator::member,boost::addressof(x->value()),
|
||||
BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);
|
||||
}
|
||||
|
||||
size_type node_count;
|
||||
|
||||
#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)&&\
|
||||
BOOST_WORKAROUND(__MWERKS__,<=0x3003)
|
||||
#pragma parse_mfunc_templ reset
|
||||
#endif
|
||||
};
|
||||
|
||||
#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1500))
|
||||
@@ -1257,7 +1150,7 @@ get(
|
||||
BOOST_STATIC_ASSERT(N>=0&&
|
||||
N<
|
||||
mp11::mp_size<
|
||||
BOOST_DEDUCED_TYPENAME multi_index_type::index_type_list
|
||||
typename multi_index_type::index_type_list
|
||||
>::value);
|
||||
|
||||
return detail::converter<multi_index_type,index_type>::index(m);
|
||||
@@ -1281,7 +1174,7 @@ get(
|
||||
BOOST_STATIC_ASSERT(N>=0&&
|
||||
N<
|
||||
mp11::mp_size<
|
||||
BOOST_DEDUCED_TYPENAME multi_index_type::index_type_list
|
||||
typename multi_index_type::index_type_list
|
||||
>::value);
|
||||
|
||||
return detail::converter<multi_index_type,index_type>::index(m);
|
||||
@@ -1372,12 +1265,10 @@ project(
|
||||
Value,IndexSpecifierList,Allocator> multi_index_type;
|
||||
typedef typename nth_index<multi_index_type,N>::type index_type;
|
||||
|
||||
#if !defined(__SUNPRO_CC)||!(__SUNPRO_CC<0x580) /* Sun C++ 5.7 fails */
|
||||
BOOST_STATIC_ASSERT((
|
||||
mp11::mp_contains<
|
||||
BOOST_DEDUCED_TYPENAME multi_index_type::iterator_type_list,
|
||||
typename multi_index_type::iterator_type_list,
|
||||
IteratorType>::value));
|
||||
#endif
|
||||
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(it);
|
||||
BOOST_MULTI_INDEX_CHECK_BELONGS_IN_SOME_INDEX(it,m);
|
||||
@@ -1398,15 +1289,13 @@ project(
|
||||
Value,IndexSpecifierList,Allocator> multi_index_type;
|
||||
typedef typename nth_index<multi_index_type,N>::type index_type;
|
||||
|
||||
#if !defined(__SUNPRO_CC)||!(__SUNPRO_CC<0x580) /* Sun C++ 5.7 fails */
|
||||
BOOST_STATIC_ASSERT((
|
||||
mp11::mp_contains<
|
||||
BOOST_DEDUCED_TYPENAME multi_index_type::iterator_type_list,
|
||||
typename multi_index_type::iterator_type_list,
|
||||
IteratorType>::value||
|
||||
mp11::mp_contains<
|
||||
BOOST_DEDUCED_TYPENAME multi_index_type::const_iterator_type_list,
|
||||
typename multi_index_type::const_iterator_type_list,
|
||||
IteratorType>::value));
|
||||
#endif
|
||||
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(it);
|
||||
BOOST_MULTI_INDEX_CHECK_BELONGS_IN_SOME_INDEX(it,m);
|
||||
@@ -1444,12 +1333,10 @@ project(
|
||||
typedef typename ::boost::multi_index::index<
|
||||
multi_index_type,Tag>::type index_type;
|
||||
|
||||
#if !defined(__SUNPRO_CC)||!(__SUNPRO_CC<0x580) /* Sun C++ 5.7 fails */
|
||||
BOOST_STATIC_ASSERT((
|
||||
mp11::mp_contains<
|
||||
BOOST_DEDUCED_TYPENAME multi_index_type::iterator_type_list,
|
||||
typename multi_index_type::iterator_type_list,
|
||||
IteratorType>::value));
|
||||
#endif
|
||||
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(it);
|
||||
BOOST_MULTI_INDEX_CHECK_BELONGS_IN_SOME_INDEX(it,m);
|
||||
@@ -1471,15 +1358,13 @@ project(
|
||||
typedef typename ::boost::multi_index::index<
|
||||
multi_index_type,Tag>::type index_type;
|
||||
|
||||
#if !defined(__SUNPRO_CC)||!(__SUNPRO_CC<0x580) /* Sun C++ 5.7 fails */
|
||||
BOOST_STATIC_ASSERT((
|
||||
mp11::mp_contains<
|
||||
BOOST_DEDUCED_TYPENAME multi_index_type::iterator_type_list,
|
||||
typename multi_index_type::iterator_type_list,
|
||||
IteratorType>::value||
|
||||
mp11::mp_contains<
|
||||
BOOST_DEDUCED_TYPENAME multi_index_type::const_iterator_type_list,
|
||||
typename multi_index_type::const_iterator_type_list,
|
||||
IteratorType>::value));
|
||||
#endif
|
||||
|
||||
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(it);
|
||||
BOOST_MULTI_INDEX_CHECK_BELONGS_IN_SOME_INDEX(it,m);
|
||||
|
||||
+6
-20
@@ -12,8 +12,6 @@
|
||||
#define BOOST_MULTI_INDEX_TEST_EMPLOYEE_HPP
|
||||
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <boost/move/core.hpp>
|
||||
#include <boost/move/utility_core.hpp>
|
||||
#include <boost/multi_index_container.hpp>
|
||||
#include <boost/multi_index/hashed_index.hpp>
|
||||
#include <boost/multi_index/identity.hpp>
|
||||
@@ -24,6 +22,7 @@
|
||||
#include <boost/multi_index/sequenced_index.hpp>
|
||||
#include <ostream>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include "non_std_allocator.hpp"
|
||||
|
||||
struct employee
|
||||
@@ -41,11 +40,11 @@ struct employee
|
||||
id(x.id),name(x.name),age(x.age),ssn(x.ssn)
|
||||
{}
|
||||
|
||||
employee(BOOST_RV_REF(employee) x):
|
||||
id(x.id),name(boost::move(x.name)),age(x.age),ssn(x.ssn)
|
||||
employee(employee&& x):
|
||||
id(x.id),name(std::move(x.name)),age(x.age),ssn(x.ssn)
|
||||
{}
|
||||
|
||||
employee& operator=(BOOST_COPY_ASSIGN_REF(employee) x)
|
||||
employee& operator=(const employee& x)
|
||||
{
|
||||
id=x.id;
|
||||
name=x.name;
|
||||
@@ -54,10 +53,10 @@ struct employee
|
||||
return *this;
|
||||
};
|
||||
|
||||
employee& operator=(BOOST_RV_REF(employee) x)
|
||||
employee& operator=(employee&& x)
|
||||
{
|
||||
id=x.id;
|
||||
name=boost::move(x.name);
|
||||
name=std::move(x.name);
|
||||
age=x.age;
|
||||
ssn=x.ssn;
|
||||
return *this;
|
||||
@@ -89,9 +88,6 @@ struct employee
|
||||
os<<e.id<<" "<<e.name<<" "<<e.age<<std::endl;
|
||||
return os;
|
||||
}
|
||||
|
||||
private:
|
||||
BOOST_COPYABLE_AND_MOVABLE(employee)
|
||||
};
|
||||
|
||||
struct name{};
|
||||
@@ -125,12 +121,7 @@ typedef
|
||||
employee_set_indices,
|
||||
non_std_allocator<employee> > employee_set;
|
||||
|
||||
#if defined(BOOST_NO_MEMBER_TEMPLATES)
|
||||
typedef boost::multi_index::nth_index<
|
||||
employee_set,1>::type employee_set_by_name;
|
||||
#else
|
||||
typedef employee_set::nth_index<1>::type employee_set_by_name;
|
||||
#endif
|
||||
|
||||
typedef boost::multi_index::index<
|
||||
employee_set,age>::type employee_set_by_age;
|
||||
@@ -139,12 +130,7 @@ typedef boost::multi_index::index<
|
||||
typedef boost::multi_index::index<
|
||||
employee_set,ssn>::type employee_set_by_ssn;
|
||||
|
||||
#if defined(BOOST_NO_MEMBER_TEMPLATES)
|
||||
typedef boost::multi_index::index<
|
||||
employee_set,randomly>::type employee_set_randomly;
|
||||
#else
|
||||
typedef employee_set::index<
|
||||
randomly>::type employee_set_randomly;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
+1
-11
@@ -1,6 +1,6 @@
|
||||
/* Used in Boost.MultiIndex tests.
|
||||
*
|
||||
* Copyright 2003-2023 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -58,11 +58,6 @@ inline int decrement_int(int& x)
|
||||
return --x;
|
||||
}
|
||||
|
||||
#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
namespace boost{
|
||||
namespace serialization{
|
||||
#endif
|
||||
|
||||
template<class Archive>
|
||||
void serialize(Archive& ar,pair_of_ints& p,const unsigned int)
|
||||
{
|
||||
@@ -70,9 +65,4 @@ void serialize(Archive& ar,pair_of_ints& p,const unsigned int)
|
||||
ar&boost::core::make_nvp("second",p.second);
|
||||
}
|
||||
|
||||
#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
} /* namespace serialization */
|
||||
} /* namespace boost*/
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Used in Boost.MultiIndex tests.
|
||||
*
|
||||
* Copyright 2003-2008 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -12,7 +12,6 @@
|
||||
#define BOOST_MULTI_INDEX_TEST_PRE_MULTI_INDEX_HPP
|
||||
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/multi_index/safe_mode_errors.hpp>
|
||||
|
||||
#if defined(__GNUC__)&&defined(__APPLE__)&&\
|
||||
@@ -30,10 +29,6 @@
|
||||
|
||||
#define BOOST_MULTI_INDEX_ENABLE_SAFE_MODE
|
||||
|
||||
#if BOOST_WORKAROUND(__IBMCPP__,<=600)
|
||||
#pragma info(nolan) /* suppress warnings about offsetof with non-POD types */
|
||||
#endif
|
||||
|
||||
struct safe_mode_exception
|
||||
{
|
||||
safe_mode_exception(boost::multi_index::safe_mode::error_code error_code_):
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex test for allocator awareness.
|
||||
*
|
||||
* Copyright 2003-2020 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -12,8 +12,6 @@
|
||||
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
#include <boost/move/core.hpp>
|
||||
#include <boost/move/utility_core.hpp>
|
||||
#include "pre_multi_index.hpp"
|
||||
#include <boost/multi_index_container.hpp>
|
||||
#include <boost/multi_index/hashed_index.hpp>
|
||||
@@ -22,22 +20,20 @@
|
||||
#include <boost/multi_index/random_access_index.hpp>
|
||||
#include <boost/multi_index/ranked_index.hpp>
|
||||
#include <boost/multi_index/sequenced_index.hpp>
|
||||
#include <utility>
|
||||
#include "rooted_allocator.hpp"
|
||||
|
||||
struct move_tracker
|
||||
{
|
||||
move_tracker(int n):n(n),move_cted(false){}
|
||||
move_tracker(const move_tracker& x):n(x.n),move_cted(false){}
|
||||
move_tracker(BOOST_RV_REF(move_tracker) x):n(x.n),move_cted(true){}
|
||||
move_tracker& operator=(BOOST_COPY_ASSIGN_REF(move_tracker) x)
|
||||
move_tracker(move_tracker&& x):n(x.n),move_cted(true){}
|
||||
move_tracker& operator=(const move_tracker& x)
|
||||
{n=x.n;return *this;}
|
||||
move_tracker& operator=(BOOST_RV_REF(move_tracker) x){n=x.n;return *this;}
|
||||
move_tracker& operator=(move_tracker&& x){n=x.n;return *this;}
|
||||
|
||||
int n;
|
||||
bool move_cted;
|
||||
|
||||
private:
|
||||
BOOST_COPYABLE_AND_MOVABLE(move_tracker)
|
||||
};
|
||||
|
||||
inline bool operator==(const move_tracker& x,const move_tracker& y)
|
||||
@@ -50,20 +46,12 @@ inline bool operator<(const move_tracker& x,const move_tracker& y)
|
||||
return x.n<y.n;
|
||||
}
|
||||
|
||||
#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
namespace boost{
|
||||
#endif
|
||||
|
||||
inline std::size_t hash_value(const move_tracker& x)
|
||||
{
|
||||
boost::hash<int> h;
|
||||
return h(x.n);
|
||||
}
|
||||
|
||||
#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
} /* namespace boost */
|
||||
#endif
|
||||
|
||||
#if defined(BOOST_NO_CXX17_IF_CONSTEXPR)&&defined(BOOST_MSVC)
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4127) /* conditional expression is constant */
|
||||
@@ -101,7 +89,7 @@ void test_allocator_awareness_for()
|
||||
{
|
||||
container c2(c);
|
||||
const move_tracker* pfirst=&*c2.begin();
|
||||
container c3(boost::move(c2),root2);
|
||||
container c3(std::move(c2),root2);
|
||||
BOOST_TEST(c3.get_allocator().comes_from(root2));
|
||||
BOOST_TEST(c3==c);
|
||||
BOOST_TEST(c2.empty());
|
||||
@@ -120,7 +108,7 @@ void test_allocator_awareness_for()
|
||||
container c2(c);
|
||||
const move_tracker* pfirst=&*c2.begin();
|
||||
container c3(root2);
|
||||
c3=boost::move(c2);
|
||||
c3=std::move(c2);
|
||||
BOOST_TEST(c3.get_allocator().comes_from(Propagate?root1:root2));
|
||||
BOOST_TEST(c3==c);
|
||||
BOOST_TEST(c2.empty());
|
||||
|
||||
+1
-13
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex basic test.
|
||||
*
|
||||
* Copyright 2003-2017 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -46,30 +46,18 @@ bool operator<(const no_addressof_type& x,const no_addressof_type& y)
|
||||
return x.n<y.n;
|
||||
}
|
||||
|
||||
#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
namespace boost{
|
||||
#endif
|
||||
|
||||
inline std::size_t hash_value(const no_addressof_type& x)
|
||||
{
|
||||
boost::hash<int> h;
|
||||
return h(x.n);
|
||||
}
|
||||
|
||||
#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
} /* namespace boost */
|
||||
#endif
|
||||
|
||||
void test_basic()
|
||||
{
|
||||
employee_set es;
|
||||
std::vector<employee> v;
|
||||
|
||||
#if defined(BOOST_NO_MEMBER_TEMPLATES)
|
||||
employee_set_by_name& i1=get<by_name>(es);
|
||||
#else
|
||||
employee_set_by_name& i1=es.get<by_name>();
|
||||
#endif
|
||||
|
||||
const employee_set_by_age& i2=get<2>(es);
|
||||
employee_set_as_inserted& i3=get<3>(es);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex test for copying and assignment.
|
||||
*
|
||||
* Copyright 2003-2018 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -12,9 +12,9 @@
|
||||
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <algorithm>
|
||||
#include <boost/move/utility_core.hpp>
|
||||
#include <list>
|
||||
#include <numeric>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include "pre_multi_index.hpp"
|
||||
#include "employee.hpp"
|
||||
@@ -23,15 +23,6 @@
|
||||
|
||||
using namespace boost::multi_index;
|
||||
|
||||
#if BOOST_WORKAROUND(__MWERKS__,<=0x3003)
|
||||
/* The "ISO C++ Template Parser" option makes CW8.3 incorrectly fail at
|
||||
* expressions of the form sizeof(x) where x is an array local to a
|
||||
* template function.
|
||||
*/
|
||||
|
||||
#pragma parse_func_templ off
|
||||
#endif
|
||||
|
||||
typedef multi_index_container<int> copyable_and_movable;
|
||||
|
||||
struct holder
|
||||
@@ -53,11 +44,7 @@ static void test_assign()
|
||||
s.assign((const int*)(&a[0]),(const int*)(&a[sa]));
|
||||
BOOST_TEST(s.size()==sa&&std::equal(s.begin(),s.end(),&a[0]));
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
s.assign({0,1,2,3,4,5});
|
||||
#else
|
||||
s.assign(&a[0],&a[sa]);
|
||||
#endif
|
||||
|
||||
BOOST_TEST(s.size()==sa&&std::equal(s.begin(),s.end(),&a[0]));
|
||||
|
||||
@@ -68,10 +55,6 @@ static void test_assign()
|
||||
BOOST_TEST(s.size()==12&&std::accumulate(s.begin(),s.end(),0)==2004);
|
||||
}
|
||||
|
||||
#if BOOST_WORKAROUND(__MWERKS__,<=0x3003)
|
||||
#pragma parse_func_templ reset
|
||||
#endif
|
||||
|
||||
template<typename Sequence>
|
||||
static void test_integral_assign()
|
||||
{
|
||||
@@ -156,8 +139,6 @@ void test_copy_assignment()
|
||||
|
||||
BOOST_TEST(i5==get<5>(es2));
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)&&\
|
||||
!BOOST_WORKAROUND(BOOST_MSVC,==1800) /* MSVC 12.0 chokes on what follows */
|
||||
employee_set es8({{0,"Rose",40,4512},{1,"Mary",38,3345},{2,"Jo",25,7102}});
|
||||
employee_set es9;
|
||||
es9={{0,"Rose",40,4512},{1,"Mary",38,3345},{2,"Jo",25,7102},
|
||||
@@ -197,16 +178,15 @@ void test_copy_assignment()
|
||||
get<5>(es9)={{1,"Mary",38,3345},{2,"Jo",25,7102},{0,"Rose",40,4512},
|
||||
{2,"Jo",25,7102}};
|
||||
BOOST_TEST(es9==es8);
|
||||
#endif
|
||||
|
||||
employee_set es10(produce_employee_set()),es11(produce_employee_set());
|
||||
BOOST_TEST(es10==es11);
|
||||
|
||||
employee_set es12(boost::move(es10));
|
||||
employee_set es12(std::move(es10));
|
||||
BOOST_TEST(es10.empty());
|
||||
BOOST_TEST(es11==es12);
|
||||
|
||||
es10=boost::move(es12);
|
||||
es10=std::move(es12);
|
||||
BOOST_TEST(es12.empty());
|
||||
BOOST_TEST(es11==es10);
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex test for key extractors.
|
||||
*
|
||||
* Copyright 2003-2022 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -124,7 +124,6 @@ typedef composite_key<
|
||||
key_mf
|
||||
> ccompw_key;
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
/* testcases for problems with non-copyable classes reported at
|
||||
* http://lists.boost.org/Archives/boost/2006/04/103065.php
|
||||
*/
|
||||
@@ -183,7 +182,6 @@ typedef composite_key<
|
||||
nc_ckey_m,
|
||||
nc_key_cmf
|
||||
> nc_compkey;
|
||||
#endif
|
||||
|
||||
void test_key_extractors()
|
||||
{
|
||||
@@ -244,7 +242,6 @@ void test_key_extractors()
|
||||
BOOST_TEST(cmpk(ctr)==make_tuple(test_class(0,0),0,0,true));
|
||||
BOOST_TEST(ccmpk(ctr)==make_tuple(test_class(0,0),0));
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
BOOST_TEST(id(td).int_member==0);
|
||||
BOOST_TEST(cid(td).int_member==0);
|
||||
BOOST_TEST(k_m(td)==0);
|
||||
@@ -257,7 +254,6 @@ void test_key_extractors()
|
||||
BOOST_TEST(ck_m(ctdr)==0);
|
||||
BOOST_TEST(cmpk(ctdr)==make_tuple(test_class(0,0),0,0,true));
|
||||
BOOST_TEST(ccmpk(ctdr)==make_tuple(test_class(0,0),0));
|
||||
#endif
|
||||
|
||||
k_m(tr)=1;
|
||||
BOOST_TEST(id(tp).int_member==1);
|
||||
@@ -271,7 +267,6 @@ void test_key_extractors()
|
||||
BOOST_TEST(cmpk(ctp)==make_tuple(test_class(1,0),1,0,true));
|
||||
BOOST_TEST(ccmpk(ctp)==make_tuple(test_class(1,0),1));
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
BOOST_TEST(id(tdp).int_member==1);
|
||||
BOOST_TEST(cid(tdp).int_member==1);
|
||||
BOOST_TEST(k_m(tdp)==1);
|
||||
@@ -282,7 +277,6 @@ void test_key_extractors()
|
||||
BOOST_TEST(ck_m(ctdp)==1);
|
||||
BOOST_TEST(cmpk(ctdp)==make_tuple(test_class(1,0),1,0,true));
|
||||
BOOST_TEST(ccmpk(ctdp)==make_tuple(test_class(1,0),1));
|
||||
#endif
|
||||
|
||||
k_m(tp)=2;
|
||||
BOOST_TEST(id(tpp).int_member==2);
|
||||
@@ -327,18 +321,14 @@ void test_key_extractors()
|
||||
BOOST_TEST(k_cm(tr)==0);
|
||||
BOOST_TEST(k_cm(ctr)==0);
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
BOOST_TEST(k_cm(td)==0);
|
||||
BOOST_TEST(k_cm(ctdr)==0);
|
||||
#endif
|
||||
|
||||
BOOST_TEST(k_cm(tp)==0);
|
||||
BOOST_TEST(k_cm(ctp)==0);
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
BOOST_TEST(k_cm(tdp)==0);
|
||||
BOOST_TEST(k_cm(ctdp)==0);
|
||||
#endif
|
||||
|
||||
BOOST_TEST(k_cm(tpp)==0);
|
||||
BOOST_TEST(k_cm(ctpp)==0);
|
||||
@@ -360,7 +350,6 @@ void test_key_extractors()
|
||||
BOOST_TEST(k_cvrmf(ctr));
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
BOOST_TEST(k_cmf(td));
|
||||
BOOST_TEST(k_cmf(ctdr));
|
||||
BOOST_TEST(k_cvmf(td));
|
||||
@@ -371,7 +360,6 @@ void test_key_extractors()
|
||||
BOOST_TEST(k_crmf(ctdr));
|
||||
BOOST_TEST(k_cvrmf(td));
|
||||
BOOST_TEST(k_cvrmf(ctdr));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
BOOST_TEST(k_cmf(tp));
|
||||
@@ -386,7 +374,6 @@ void test_key_extractors()
|
||||
BOOST_TEST(k_cvrmf(ctp));
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
BOOST_TEST(k_cmf(tdp));
|
||||
BOOST_TEST(k_cmf(ctdp));
|
||||
BOOST_TEST(k_cvmf(tdp));
|
||||
@@ -397,7 +384,6 @@ void test_key_extractors()
|
||||
BOOST_TEST(k_crmf(ctdp));
|
||||
BOOST_TEST(k_cvrmf(tdp));
|
||||
BOOST_TEST(k_cvrmf(ctdp));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
BOOST_TEST(k_cmf(tpp));
|
||||
@@ -440,14 +426,12 @@ void test_key_extractors()
|
||||
BOOST_TEST(!k_vrmf(tr));
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
BOOST_TEST(!k_mf(td));
|
||||
BOOST_TEST(!k_vmf(td));
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_REF_QUALIFIERS)
|
||||
BOOST_TEST(!k_rmf(td));
|
||||
BOOST_TEST(!k_vrmf(td));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
BOOST_TEST(!k_mf(tp));
|
||||
@@ -458,14 +442,12 @@ void test_key_extractors()
|
||||
BOOST_TEST(!k_vrmf(tp));
|
||||
#endif
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
BOOST_TEST(!k_mf(tdp));
|
||||
BOOST_TEST(!k_vmf(tdp));
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_REF_QUALIFIERS)
|
||||
BOOST_TEST(!k_rmf(tdp));
|
||||
BOOST_TEST(!k_vrmf(tdp));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
BOOST_TEST(!k_mf(tpp));
|
||||
@@ -487,18 +469,14 @@ void test_key_extractors()
|
||||
BOOST_TEST(k_gf(tr));
|
||||
BOOST_TEST(k_gf(ctr));
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
BOOST_TEST(k_gf(td));
|
||||
BOOST_TEST(k_gf(ctdr));
|
||||
#endif
|
||||
|
||||
BOOST_TEST(k_gf(tp));
|
||||
BOOST_TEST(k_gf(ctp));
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
BOOST_TEST(k_gf(tdp));
|
||||
BOOST_TEST(k_gf(ctdp));
|
||||
#endif
|
||||
|
||||
BOOST_TEST(k_gf(tpp));
|
||||
BOOST_TEST(k_gf(ctpp));
|
||||
@@ -511,46 +489,31 @@ void test_key_extractors()
|
||||
BOOST_TEST(!k_gcrf(tr));
|
||||
BOOST_TEST(!k_gcrf(ctr));
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
BOOST_TEST(!k_gcrf(td));
|
||||
BOOST_TEST(!k_gcrf(ctdr));
|
||||
#endif
|
||||
|
||||
BOOST_TEST(!k_gcrf(tp));
|
||||
BOOST_TEST(!k_gcrf(ctp));
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
BOOST_TEST(!k_gcrf(tdp));
|
||||
BOOST_TEST(!k_gcrf(ctdp));
|
||||
#endif
|
||||
|
||||
BOOST_TEST(!k_gcrf(tpp));
|
||||
BOOST_TEST(!k_gcrf(ctpp));
|
||||
BOOST_TEST(!k_gcrf(tap));
|
||||
BOOST_TEST(!k_gcrf(ctap));
|
||||
|
||||
BOOST_TEST(!k_gcrf(tw));
|
||||
BOOST_TEST(!k_gcrf(ctw));
|
||||
|
||||
BOOST_TEST(k_grf(tr));
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
BOOST_TEST(k_grf(td));
|
||||
#endif
|
||||
|
||||
BOOST_TEST(k_grf(tp));
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
BOOST_TEST(k_grf(tdp));
|
||||
#endif
|
||||
|
||||
BOOST_TEST(k_grf(tpp));
|
||||
BOOST_TEST(k_grf(tap));
|
||||
BOOST_TEST(k_grf(tw));
|
||||
|
||||
BOOST_TEST(ccmpk_w(tw)==make_tuple(false));
|
||||
|
||||
#if !defined(BOOST_NO_SFINAE)
|
||||
/* testcases for problems with non-copyable classes reported at
|
||||
* http://lists.boost.org/Archives/boost/2006/04/103065.php
|
||||
*/
|
||||
@@ -583,7 +546,6 @@ void test_key_extractors()
|
||||
|
||||
test_nc_class nc_t(1,0);
|
||||
BOOST_TEST(nc_cmpk(nc_td)==make_tuple(boost::cref(nc_t),1,1,true));
|
||||
#endif
|
||||
|
||||
std::list<test_class> tl;
|
||||
for(int i=0;i<20;++i)tl.push_back(test_class(i));
|
||||
|
||||
+1
-14
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex test for standard list operations.
|
||||
*
|
||||
* Copyright 2003-2021 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -63,15 +63,6 @@ bool is_sorted(
|
||||
}
|
||||
}
|
||||
|
||||
#if BOOST_WORKAROUND(__MWERKS__,<=0x3003)
|
||||
/* The "ISO C++ Template Parser" option makes CW8.3 incorrectly fail at
|
||||
* expressions of the form sizeof(x) where x is an array local to a
|
||||
* template function.
|
||||
*/
|
||||
|
||||
#pragma parse_func_templ off
|
||||
#endif
|
||||
|
||||
template<typename Sequence>
|
||||
static void test_list_ops_unique_seq()
|
||||
{
|
||||
@@ -245,10 +236,6 @@ static void test_list_ops_non_unique_seq()
|
||||
}
|
||||
}
|
||||
|
||||
#if BOOST_WORKAROUND(__MWERKS__,<=0x3003)
|
||||
#pragma parse_func_templ reset
|
||||
#endif
|
||||
|
||||
void test_list_ops()
|
||||
{
|
||||
typedef multi_index_container<
|
||||
|
||||
+8
-63
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex test for modifier memfuns.
|
||||
*
|
||||
* Copyright 2003-2018 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -14,11 +14,10 @@
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
#include <boost/enable_shared_from_this.hpp>
|
||||
#include <boost/iterator/iterator_facade.hpp>
|
||||
#include <boost/move/core.hpp>
|
||||
#include <boost/move/utility_core.hpp>
|
||||
#include <boost/next_prior.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <iterator>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include "pre_multi_index.hpp"
|
||||
#include "employee.hpp"
|
||||
@@ -28,8 +27,8 @@ using namespace boost::multi_index;
|
||||
struct non_copyable_int
|
||||
{
|
||||
explicit non_copyable_int(int n_):n(n_){}
|
||||
non_copyable_int(BOOST_RV_REF(non_copyable_int) x):n(x.n){x.n=0;}
|
||||
non_copyable_int& operator=(BOOST_RV_REF(non_copyable_int) x)
|
||||
non_copyable_int(non_copyable_int&& x):n(x.n){x.n=0;}
|
||||
non_copyable_int& operator=(non_copyable_int&& x)
|
||||
{
|
||||
n=x.n;
|
||||
x.n=0;
|
||||
@@ -37,8 +36,6 @@ struct non_copyable_int
|
||||
}
|
||||
|
||||
int n;
|
||||
private:
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(non_copyable_int)
|
||||
};
|
||||
|
||||
class always_one
|
||||
@@ -58,19 +55,11 @@ inline bool operator==(const always_one& x,const always_one& y)
|
||||
return x.get()==y.get();
|
||||
}
|
||||
|
||||
#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
namespace boost{
|
||||
#endif
|
||||
|
||||
inline std::size_t hash_value(const always_one& x)
|
||||
{
|
||||
return static_cast<std::size_t>(x.get());
|
||||
}
|
||||
|
||||
#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
} /* namespace boost */
|
||||
#endif
|
||||
|
||||
class linked_object
|
||||
{
|
||||
struct impl:boost::enable_shared_from_this<impl>
|
||||
@@ -86,15 +75,8 @@ class linked_object
|
||||
typedef multi_index_container<
|
||||
impl,
|
||||
indexed_by<
|
||||
|
||||
#if BOOST_WORKAROUND(__IBMCPP__,BOOST_TESTED_AT(1010))
|
||||
ordered_unique<member<impl,int,&linked_object::impl::n> >,
|
||||
hashed_non_unique<member<impl,int,&linked_object::impl::n> >,
|
||||
#else
|
||||
ordered_unique<member<impl,int,&impl::n> >,
|
||||
hashed_non_unique<member<impl,int,&impl::n> >,
|
||||
#endif
|
||||
|
||||
sequenced<>,
|
||||
random_access<>
|
||||
>
|
||||
@@ -261,10 +243,8 @@ void test_modifiers()
|
||||
i1.insert(ve.begin(),ve.end());
|
||||
BOOST_TEST(i2.size()==3);
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
i1.insert({{4,"Vanessa",20,9236},{5,"Penelope",55,2358}});
|
||||
BOOST_TEST(i2.size()==5);
|
||||
#endif
|
||||
|
||||
BOOST_TEST(i2.erase(i2.begin(),i2.end())==i2.end());
|
||||
BOOST_TEST(es.size()==0);
|
||||
@@ -272,10 +252,8 @@ void test_modifiers()
|
||||
i2.insert(ve.begin(),ve.end());
|
||||
BOOST_TEST(i3.size()==3);
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
i2.insert({{4,"Vanessa",20,9236},{5,"Penelope",55,2358}});
|
||||
BOOST_TEST(i3.size()==5);
|
||||
#endif
|
||||
|
||||
BOOST_TEST(*(i3.erase(i3.begin()))==employee(1,"Rachel",27,9012));
|
||||
BOOST_TEST(i3.erase(i3.begin(),i3.end())==i3.end());
|
||||
@@ -284,11 +262,9 @@ void test_modifiers()
|
||||
i3.insert(i3.end(),ve.begin(),ve.end());
|
||||
BOOST_TEST(es.size()==3);
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
i3.insert(i3.begin(),{{4,"Vanessa",20,9236},{5,"Penelope",55,2358}});
|
||||
BOOST_TEST(i3.front().name=="Vanessa");
|
||||
BOOST_TEST(i4.size()==5);
|
||||
#endif
|
||||
|
||||
BOOST_TEST(i4.erase(9012)==1);
|
||||
i4.erase(i4.begin());
|
||||
@@ -303,11 +279,9 @@ void test_modifiers()
|
||||
i5.insert(i5.begin(),ve.begin(),ve.end());
|
||||
BOOST_TEST(i1.size()==3);
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
||||
i5.insert(i5.end(),{{4,"Vanessa",20,9236},{5,"Penelope",55,2358}});
|
||||
BOOST_TEST(i5.back().name=="Penelope");
|
||||
BOOST_TEST(i1.size()==5);
|
||||
#endif
|
||||
|
||||
BOOST_TEST(es.erase(es.begin(),es.end())==es.end());
|
||||
BOOST_TEST(i2.size()==0);
|
||||
@@ -342,49 +316,20 @@ void test_modifiers()
|
||||
i5.swap(get<5>(es2));
|
||||
BOOST_TEST(es==es2_backup&&es2==es_backup);
|
||||
|
||||
#if defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL)
|
||||
::boost::multi_index::detail::swap(i1,get<1>(es2));
|
||||
#else
|
||||
using std::swap;
|
||||
swap(i1,get<1>(es2));
|
||||
#endif
|
||||
|
||||
BOOST_TEST(es==es_backup&&es2==es2_backup);
|
||||
|
||||
#if defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL)
|
||||
::boost::multi_index::detail::swap(i2,get<2>(es2));
|
||||
#else
|
||||
using std::swap;
|
||||
swap(i2,get<2>(es2));
|
||||
#endif
|
||||
|
||||
BOOST_TEST(es==es2_backup&&es2==es_backup);
|
||||
|
||||
#if defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL)
|
||||
::boost::multi_index::detail::swap(i3,get<3>(es2));
|
||||
#else
|
||||
using std::swap;
|
||||
swap(i3,get<3>(es2));
|
||||
#endif
|
||||
|
||||
BOOST_TEST(es==es_backup&&es2==es2_backup);
|
||||
|
||||
#if defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL)
|
||||
::boost::multi_index::detail::swap(i4,get<4>(es2));
|
||||
#else
|
||||
using std::swap;
|
||||
swap(i4,get<4>(es2));
|
||||
#endif
|
||||
|
||||
BOOST_TEST(es==es2_backup&&es2==es_backup);
|
||||
|
||||
#if defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL)
|
||||
::boost::multi_index::detail::swap(i5,get<5>(es2));
|
||||
#else
|
||||
using std::swap;
|
||||
swap(i5,get<5>(es2));
|
||||
#endif
|
||||
|
||||
BOOST_TEST(es==es_backup&&es2==es2_backup);
|
||||
|
||||
i3.clear();
|
||||
@@ -419,19 +364,19 @@ void test_modifiers()
|
||||
get<3>(ncic).emplace_back(1);
|
||||
|
||||
non_copyable_int nci(1);
|
||||
ncic.insert(boost::move(nci));
|
||||
ncic.insert(std::move(nci));
|
||||
BOOST_TEST(nci.n==0);
|
||||
|
||||
nci.n=1;
|
||||
get<1>(ncic).insert(boost::move(nci));
|
||||
get<1>(ncic).insert(std::move(nci));
|
||||
BOOST_TEST(nci.n==0);
|
||||
|
||||
nci.n=1;
|
||||
get<2>(ncic).push_back(boost::move(nci));
|
||||
get<2>(ncic).push_back(std::move(nci));
|
||||
BOOST_TEST(nci.n==0);
|
||||
|
||||
nci.n=1;
|
||||
get<3>(ncic).push_back(boost::move(nci));
|
||||
get<3>(ncic).push_back(std::move(nci));
|
||||
BOOST_TEST(nci.n==0);
|
||||
|
||||
std::vector<int> vi(4,1);
|
||||
|
||||
+45
-65
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex test for node handling operations.
|
||||
*
|
||||
* Copyright 2003-2021 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <boost/core/enable_if.hpp>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
#include <boost/move/utility_core.hpp>
|
||||
#include "pre_multi_index.hpp"
|
||||
#include <boost/multi_index_container.hpp>
|
||||
#include <boost/multi_index/hashed_index.hpp>
|
||||
@@ -70,17 +69,17 @@ void test_node_handle()
|
||||
BOOST_TEST(&n2.value()==addr0);
|
||||
BOOST_TEST(allocator_count==1);
|
||||
|
||||
node_type n3(boost::move(n2));
|
||||
node_type n3(std::move(n2));
|
||||
BOOST_TEST(n2.empty());
|
||||
BOOST_TEST(!n3.empty());
|
||||
BOOST_TEST(&n3.value()==addr0);
|
||||
BOOST_TEST(allocator_count==1);
|
||||
|
||||
node_type n4(boost::move(n2));
|
||||
node_type n4(std::move(n2));
|
||||
BOOST_TEST(n4.empty());
|
||||
BOOST_TEST(allocator_count==1);
|
||||
|
||||
n1=boost::move(n3);
|
||||
n1=std::move(n3);
|
||||
BOOST_TEST(!n1.empty());
|
||||
BOOST_TEST(&n1.value()==addr0);
|
||||
BOOST_TEST(n3.empty());
|
||||
@@ -115,19 +114,19 @@ void test_node_handle()
|
||||
BOOST_TEST(n2.empty());
|
||||
BOOST_TEST(allocator_count==2);
|
||||
|
||||
n2=boost::move(n3);
|
||||
n2=std::move(n3);
|
||||
BOOST_TEST(n2.empty());
|
||||
BOOST_TEST(n3.empty());
|
||||
BOOST_TEST(allocator_count==2);
|
||||
|
||||
BOOST_TEST(element_count==3);
|
||||
n1=boost::move(n5);
|
||||
n1=std::move(n5);
|
||||
BOOST_TEST(&n1.value()==addr0);
|
||||
BOOST_TEST(n5.empty());
|
||||
BOOST_TEST(element_count==2);
|
||||
BOOST_TEST(allocator_count==1);
|
||||
|
||||
n1=boost::move(n5);
|
||||
n1=std::move(n5);
|
||||
BOOST_TEST(n1.empty());
|
||||
BOOST_TEST(element_count==1);
|
||||
BOOST_TEST(allocator_count==0);
|
||||
@@ -212,7 +211,7 @@ void test_transfer_result(
|
||||
(!is_key_based<Dst>::value||*pos==x)){
|
||||
BOOST_TEST(boost::next(res.position)==pos);
|
||||
}
|
||||
test_transfer_result(dst,Ret(boost::move(res)),n,x);
|
||||
test_transfer_result(dst,Ret(std::move(res)),n,x);
|
||||
}
|
||||
|
||||
template<typename Dst,typename NodeHandle,typename Value>
|
||||
@@ -232,7 +231,7 @@ void test_transfer_result_empty(
|
||||
Dst& dst,typename Dst::iterator,Ret res,
|
||||
typename enable_if_not_iterator<Ret>::type=0)
|
||||
{
|
||||
test_transfer_result_empty(dst,Ret(boost::move(res)));
|
||||
test_transfer_result_empty(dst,Ret(std::move(res)));
|
||||
}
|
||||
|
||||
template<typename Dst>
|
||||
@@ -249,7 +248,7 @@ typename Src::node_type checked_extract(
|
||||
{
|
||||
typename Src::node_type n=src.extract(k);
|
||||
if(n)BOOST_TEST(src.key_extractor()(n.value())==k);
|
||||
return boost::move(n);
|
||||
return n;
|
||||
}
|
||||
|
||||
template<typename Src>
|
||||
@@ -258,7 +257,7 @@ typename Src::node_type checked_extract(Src& src,typename Src::iterator pos)
|
||||
typename Src::value_type x=*pos;
|
||||
typename Src::node_type n=src.extract(pos);
|
||||
if(n)BOOST_TEST(n.value()==x);
|
||||
return boost::move(n);
|
||||
return n;
|
||||
}
|
||||
|
||||
template<typename Src,typename Locator,typename Dst>
|
||||
@@ -267,10 +266,10 @@ void test_transfer(Src& src,Locator loc,Dst& dst)
|
||||
typename Dst::node_type n=checked_extract(src,loc);
|
||||
if(n){
|
||||
typename Dst::value_type x=n.value();
|
||||
test_transfer_result(dst,dst.insert(boost::move(n)),n,x);
|
||||
test_transfer_result(dst,dst.insert(std::move(n)),n,x);
|
||||
}
|
||||
else{
|
||||
test_transfer_result_empty(dst,dst.insert(boost::move(n)));
|
||||
test_transfer_result_empty(dst,dst.insert(std::move(n)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -280,10 +279,10 @@ void test_transfer(Src& src,Locator loc,Dst& dst,Iterator pos)
|
||||
typename Dst::node_type n=checked_extract(src,loc);
|
||||
if(n){
|
||||
typename Dst::value_type x=n.value();
|
||||
test_transfer_result(dst,pos,dst.insert(pos,boost::move(n)),n,x);
|
||||
test_transfer_result(dst,pos,dst.insert(pos,std::move(n)),n,x);
|
||||
}
|
||||
else{
|
||||
test_transfer_result_empty(dst,pos,dst.insert(pos,boost::move(n)));
|
||||
test_transfer_result_empty(dst,pos,dst.insert(pos,std::move(n)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -420,84 +419,65 @@ struct enable_if_not_key_based:boost::enable_if_c<
|
||||
void*
|
||||
>{};
|
||||
|
||||
/* Boost.Move C++03 perfect forwarding emulation converts non-const lvalue
|
||||
* refs to const lvalue refs. final_forward undoes that.
|
||||
*/
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
||||
|
||||
template<typename T>
|
||||
T&& final_forward(typename boost::remove_reference<T>::type& x)
|
||||
{
|
||||
return static_cast<T&&>(x);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
template<typename T>
|
||||
T& final_forward(const T& x){return const_cast<T&>(x);}
|
||||
|
||||
#endif
|
||||
|
||||
template<typename Dst,typename Src>
|
||||
void merge(
|
||||
Dst& dst,BOOST_FWD_REF(Src) src,
|
||||
Dst& dst,Src&& src,
|
||||
typename enable_if_key_based<Dst>::type=0)
|
||||
{
|
||||
dst.merge(final_forward<Src>(src));
|
||||
dst.merge(std::forward<Src>(src));
|
||||
}
|
||||
|
||||
template<typename Dst,typename Src>
|
||||
void merge(
|
||||
Dst& dst,BOOST_FWD_REF(Src) src,
|
||||
Dst& dst,Src&& src,
|
||||
typename enable_if_not_key_based<Dst>::type=0)
|
||||
{
|
||||
dst.splice(dst.end(),final_forward<Src>(src));
|
||||
dst.splice(dst.end(),std::forward<Src>(src));
|
||||
}
|
||||
|
||||
template<typename Dst,typename Src>
|
||||
std::pair<typename Dst::iterator,bool> merge(
|
||||
Dst& dst,BOOST_FWD_REF(Src) src,
|
||||
Dst& dst,Src&& src,
|
||||
typename boost::remove_reference<Src>::type::iterator i,
|
||||
typename enable_if_key_based<Dst>::type=0)
|
||||
{
|
||||
return dst.merge(final_forward<Src>(src),i);
|
||||
return dst.merge(std::forward<Src>(src),i);
|
||||
}
|
||||
|
||||
template<typename Dst,typename Src>
|
||||
std::pair<typename Dst::iterator,bool> merge(
|
||||
Dst& dst,BOOST_FWD_REF(Src) src,
|
||||
Dst& dst,Src&& src,
|
||||
typename boost::remove_reference<Src>::type::iterator i,
|
||||
typename enable_if_not_key_based<Dst>::type=0)
|
||||
{
|
||||
return dst.splice(dst.end(),final_forward<Src>(src),i);
|
||||
return dst.splice(dst.end(),std::forward<Src>(src),i);
|
||||
}
|
||||
|
||||
template<typename Dst,typename Src>
|
||||
void merge(
|
||||
Dst& dst,BOOST_FWD_REF(Src) src,
|
||||
Dst& dst,Src&& src,
|
||||
typename boost::remove_reference<Src>::type::iterator first,
|
||||
typename boost::remove_reference<Src>::type::iterator last,
|
||||
typename enable_if_key_based<Dst>::type=0)
|
||||
{
|
||||
dst.merge(final_forward<Src>(src),first,last);
|
||||
dst.merge(std::forward<Src>(src),first,last);
|
||||
}
|
||||
|
||||
template<typename Dst,typename Src>
|
||||
void merge(
|
||||
Dst& dst,BOOST_FWD_REF(Src) src,
|
||||
Dst& dst,Src&& src,
|
||||
typename boost::remove_reference<Src>::type::iterator first,
|
||||
typename boost::remove_reference<Src>::type::iterator last,
|
||||
typename enable_if_not_key_based<Dst>::type=0)
|
||||
{
|
||||
dst.splice(dst.end(),final_forward<Src>(src),first,last);
|
||||
dst.splice(dst.end(),std::forward<Src>(src),first,last);
|
||||
}
|
||||
|
||||
template<typename Dst,typename Src>
|
||||
void test_merge_same(Dst& dst,BOOST_FWD_REF(Src) src)
|
||||
void test_merge_same(Dst& dst,Src&& src)
|
||||
{
|
||||
std::size_t n=dst.size();
|
||||
merge(dst,boost::forward<Src>(src));
|
||||
merge(dst,std::forward<Src>(src));
|
||||
BOOST_TEST(dst.size()==n);
|
||||
BOOST_TEST(src.size()==n);
|
||||
}
|
||||
@@ -511,7 +491,7 @@ bool find_address(Iterator first,Iterator last,const Value* x)
|
||||
|
||||
template<typename Dst,typename Src>
|
||||
void test_merge_different(
|
||||
Dst& dst,BOOST_FWD_REF(Src) src,bool transferred_iters)
|
||||
Dst& dst,Src&& src,bool transferred_iters)
|
||||
{
|
||||
typedef typename boost::remove_reference<Src>::
|
||||
type::iterator src_iterator;
|
||||
@@ -526,7 +506,7 @@ void test_merge_different(
|
||||
v.push_back(std::make_pair(first,&*first));
|
||||
}
|
||||
|
||||
merge(dst,boost::forward<Src>(src));
|
||||
merge(dst,std::forward<Src>(src));
|
||||
BOOST_TEST(dst.size()>=n && m>=src.size() && dst.size()-n==m-src.size());
|
||||
for(std::size_t i=0;i<v.size();++i){
|
||||
BOOST_TEST(
|
||||
@@ -542,7 +522,7 @@ void test_merge_different(
|
||||
|
||||
template<typename Dst,typename Src>
|
||||
void test_merge_same(
|
||||
Dst& dst,BOOST_FWD_REF(Src) src,
|
||||
Dst& dst,Src&& src,
|
||||
typename boost::remove_reference<Src>::type::iterator i,
|
||||
bool key_based=is_key_based<Dst>::value)
|
||||
{
|
||||
@@ -550,7 +530,7 @@ void test_merge_same(
|
||||
|
||||
std::size_t n=dst.size();
|
||||
|
||||
std::pair<dst_iterator,bool> p=merge(dst,boost::forward<Src>(src),i);
|
||||
std::pair<dst_iterator,bool> p=merge(dst,std::forward<Src>(src),i);
|
||||
BOOST_TEST(dst.size()==n);
|
||||
BOOST_TEST(src.size()==n);
|
||||
BOOST_TEST(&*(p.first)==&*i && p.second);
|
||||
@@ -559,7 +539,7 @@ void test_merge_same(
|
||||
|
||||
template<typename Dst,typename Src>
|
||||
void test_merge_different(
|
||||
Dst& dst,BOOST_FWD_REF(Src) src,
|
||||
Dst& dst,Src&& src,
|
||||
typename boost::remove_reference<Src>::type::iterator i,
|
||||
bool key_based=is_key_based<Dst>::value)
|
||||
{
|
||||
@@ -568,7 +548,7 @@ void test_merge_different(
|
||||
std::size_t n=dst.size(),m=src.size();
|
||||
const typename Dst::value_type* pi=&*i;
|
||||
|
||||
std::pair<dst_iterator,bool> p=merge(dst,boost::forward<Src>(src),i);
|
||||
std::pair<dst_iterator,bool> p=merge(dst,std::forward<Src>(src),i);
|
||||
BOOST_TEST(dst.size()+src.size()==n+m);
|
||||
BOOST_TEST(p.second?
|
||||
&*(p.first)==pi:
|
||||
@@ -578,7 +558,7 @@ void test_merge_different(
|
||||
|
||||
template<typename Dst,typename Src>
|
||||
void test_merge_same(
|
||||
Dst& dst,BOOST_FWD_REF(Src) src,
|
||||
Dst& dst,Src&& src,
|
||||
typename boost::remove_reference<Src>::type::iterator first,
|
||||
typename boost::remove_reference<Src>::type::iterator last,
|
||||
bool key_based=is_key_based<Dst>::value)
|
||||
@@ -593,7 +573,7 @@ void test_merge_same(
|
||||
std::vector<const src_value_type*> v;
|
||||
for(src_iterator it=first;it!=last;++it)v.push_back(&*it);
|
||||
|
||||
merge(dst,boost::forward<Src>(src),first,last);
|
||||
merge(dst,std::forward<Src>(src),first,last);
|
||||
BOOST_TEST(dst.size()==n);
|
||||
BOOST_TEST(src.size()==n);
|
||||
if(!key_based){
|
||||
@@ -612,7 +592,7 @@ void test_merge_same(
|
||||
|
||||
template<typename Dst,typename Src>
|
||||
void test_merge_different(
|
||||
Dst& dst,BOOST_FWD_REF(Src) src,
|
||||
Dst& dst,Src&& src,
|
||||
typename boost::remove_reference<Src>::type::iterator first,
|
||||
typename boost::remove_reference<Src>::type::iterator last,
|
||||
bool key_based=is_key_based<Dst>::value)
|
||||
@@ -628,7 +608,7 @@ void test_merge_different(
|
||||
std::vector<const src_value_type*> v;
|
||||
for(src_iterator it=first;it!=last;++it)v.push_back(&*it);
|
||||
|
||||
merge(dst,boost::forward<Src>(src),first,last);
|
||||
merge(dst,std::forward<Src>(src),first,last);
|
||||
BOOST_TEST(dst.size()>=n && m>=src.size() && dst.size()-n==m-src.size());
|
||||
if(!key_based){
|
||||
for(dst_iterator it=boost::next(dst.begin(),(std::ptrdiff_t)n);
|
||||
@@ -652,7 +632,7 @@ void test_merge_same(Dst& dst)
|
||||
test_merge_same(
|
||||
dst2.template get<N>(),dst2.template get<M>());
|
||||
test_merge_same(
|
||||
dst2.template get<N>(),boost::move(dst2.template get<M>()));
|
||||
dst2.template get<N>(),std::move(dst2.template get<M>()));
|
||||
}
|
||||
{
|
||||
Dst dst2=dst1;
|
||||
@@ -661,7 +641,7 @@ void test_merge_same(Dst& dst)
|
||||
boost::next(
|
||||
dst2.template get<M>().begin(),(std::ptrdiff_t)(dst2.size()/2)));
|
||||
test_merge_same(
|
||||
dst2.template get<N>(),boost::move(dst2.template get<M>()),
|
||||
dst2.template get<N>(),std::move(dst2.template get<M>()),
|
||||
boost::next(
|
||||
dst2.template get<M>().begin(),(std::ptrdiff_t)(dst2.size()/2)));
|
||||
}
|
||||
@@ -673,7 +653,7 @@ void test_merge_same(Dst& dst)
|
||||
boost::next(
|
||||
dst2.template get<M>().begin(),(std::ptrdiff_t)(dst2.size()/2)));
|
||||
test_merge_same(
|
||||
dst2.template get<N>(),boost::move(dst2.template get<M>()),
|
||||
dst2.template get<N>(),std::move(dst2.template get<M>()),
|
||||
dst2.template get<M>().begin(),
|
||||
boost::next(
|
||||
dst2.template get<M>().begin(),(std::ptrdiff_t)(dst2.size()/2)));
|
||||
@@ -699,7 +679,7 @@ void test_merge_different(Dst& dst,Src& src)
|
||||
Dst dst2=dst1;
|
||||
Src src2=src1;
|
||||
test_merge_different(
|
||||
dst2.template get<N>(),boost::move(src2.template get<M>()),
|
||||
dst2.template get<N>(),std::move(src2.template get<M>()),
|
||||
transferred_iters);
|
||||
}
|
||||
{
|
||||
@@ -714,7 +694,7 @@ void test_merge_different(Dst& dst,Src& src)
|
||||
Dst dst2=dst1;
|
||||
Src src2=src1;
|
||||
test_merge_different(
|
||||
dst2.template get<N>(),boost::move(src2.template get<M>()),
|
||||
dst2.template get<N>(),std::move(src2.template get<M>()),
|
||||
boost::next(
|
||||
src2.template get<M>().begin(),(std::ptrdiff_t)(src2.size()/2)));
|
||||
}
|
||||
@@ -731,7 +711,7 @@ void test_merge_different(Dst& dst,Src& src)
|
||||
Dst dst2=dst1;
|
||||
Src src2=src1;
|
||||
test_merge_different(
|
||||
dst2.template get<N>(),boost::move(src2.template get<M>()),
|
||||
dst2.template get<N>(),std::move(src2.template get<M>()),
|
||||
src2.template get<M>().begin(),
|
||||
boost::next(
|
||||
src2.template get<M>().begin(),(std::ptrdiff_t)(src2.size()/2)));
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex test for projection capabilities.
|
||||
*
|
||||
* Copyright 2003-2013 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -39,15 +39,9 @@ void test_projection()
|
||||
BOOST_STATIC_ASSERT((boost::is_same<
|
||||
employee_set_by_name::iterator,
|
||||
nth_index_iterator<employee_set,1>::type >::value));
|
||||
#if defined(BOOST_NO_MEMBER_TEMPLATES)
|
||||
BOOST_STATIC_ASSERT((boost::is_same<
|
||||
employee_set_by_age::iterator,
|
||||
index_iterator<employee_set,age>::type >::value));
|
||||
#else
|
||||
BOOST_STATIC_ASSERT((boost::is_same<
|
||||
employee_set_by_age::iterator,
|
||||
employee_set::index_iterator<age>::type >::value));
|
||||
#endif
|
||||
BOOST_STATIC_ASSERT((boost::is_same<
|
||||
employee_set_as_inserted::iterator,
|
||||
nth_index_iterator<employee_set,3>::type >::value));
|
||||
@@ -64,11 +58,7 @@ void test_projection()
|
||||
it3= project<as_inserted>(es,it2);
|
||||
it4= project<ssn>(es,it3);
|
||||
it5= project<randomly>(es,it4);
|
||||
#if defined(BOOST_NO_MEMBER_TEMPLATES)
|
||||
itbis=project<0>(es,it5);
|
||||
#else
|
||||
itbis=es.project<0>(it5);
|
||||
#endif
|
||||
|
||||
BOOST_TEST(
|
||||
*it==*it1&&*it1==*it2&&*it2==*it3&&*it3==*it4&&*it4==*it5&&itbis==it);
|
||||
@@ -94,15 +84,9 @@ void test_projection()
|
||||
BOOST_STATIC_ASSERT((boost::is_same<
|
||||
employee_set_by_name::const_iterator,
|
||||
nth_index_const_iterator<employee_set,1>::type >::value));
|
||||
#if defined(BOOST_NO_MEMBER_TEMPLATES)
|
||||
BOOST_STATIC_ASSERT((boost::is_same<
|
||||
employee_set_by_age::const_iterator,
|
||||
index_const_iterator<employee_set,age>::type >::value));
|
||||
#else
|
||||
BOOST_STATIC_ASSERT((boost::is_same<
|
||||
employee_set_by_age::const_iterator,
|
||||
employee_set::index_const_iterator<age>::type >::value));
|
||||
#endif
|
||||
BOOST_STATIC_ASSERT((boost::is_same<
|
||||
employee_set_as_inserted::const_iterator,
|
||||
nth_index_const_iterator<employee_set,3>::type >::value));
|
||||
@@ -114,17 +98,9 @@ void test_projection()
|
||||
nth_index_const_iterator<employee_set,5>::type >::value));
|
||||
|
||||
cit= ces.find(employee(4,"John",57,1002));
|
||||
#if defined(BOOST_NO_MEMBER_TEMPLATES)
|
||||
cit1= project<by_name>(ces,cit);
|
||||
#else
|
||||
cit1= ces.project<by_name>(cit);
|
||||
#endif
|
||||
cit2= project<age>(ces,cit1);
|
||||
#if defined(BOOST_NO_MEMBER_TEMPLATES)
|
||||
cit3= project<as_inserted>(ces,cit2);
|
||||
#else
|
||||
cit3= ces.project<as_inserted>(cit2);
|
||||
#endif
|
||||
cit4= project<ssn>(ces,cit3);
|
||||
cit5= project<randomly>(ces,cit4);
|
||||
citbis=project<0>(ces,cit5);
|
||||
|
||||
+1
-14
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex test for rearrange operations.
|
||||
*
|
||||
* Copyright 2003-2022 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -37,15 +37,6 @@ using namespace boost::multi_index;
|
||||
#undef CHECK_VOID_RANGE
|
||||
#define CHECK_VOID_RANGE(p) BOOST_TEST((p).first==(p).second)
|
||||
|
||||
#if BOOST_WORKAROUND(__MWERKS__,<=0x3003)
|
||||
/* The "ISO C++ Template Parser" option makes CW8.3 incorrectly fail at
|
||||
* expressions of the form sizeof(x) where x is an array local to a
|
||||
* template function.
|
||||
*/
|
||||
|
||||
#pragma parse_func_templ off
|
||||
#endif
|
||||
|
||||
template<typename Sequence>
|
||||
static void local_test_rearrange()
|
||||
{
|
||||
@@ -110,10 +101,6 @@ static void local_test_rearrange()
|
||||
BOOST_TEST(std::equal(sc.begin(),sc.end(),v.begin()));
|
||||
}
|
||||
|
||||
#if BOOST_WORKAROUND(__MWERKS__,<=0x3003)
|
||||
#pragma parse_func_templ reset
|
||||
#endif
|
||||
|
||||
void test_rearrange()
|
||||
{
|
||||
typedef multi_index_container<
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex test for safe_mode.
|
||||
*
|
||||
* Copyright 2003-2021 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -11,12 +11,11 @@
|
||||
#include "test_safe_mode.hpp"
|
||||
|
||||
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
||||
#include <boost/move/core.hpp>
|
||||
#include <boost/move/utility_core.hpp>
|
||||
#include "pre_multi_index.hpp"
|
||||
#include "employee.hpp"
|
||||
#include "pair_of_ints.hpp"
|
||||
#include <stdexcept>
|
||||
#include <utility>
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
|
||||
using namespace boost::multi_index;
|
||||
@@ -209,7 +208,7 @@ static void local_test_safe_mode(
|
||||
node_type nh=i.extract(it);
|
||||
container c3(c2,allocator_type(-1));
|
||||
index_type& i3=Policy::index_from_container(c3);
|
||||
Policy::insert(i3,boost::move(nh));
|
||||
Policy::insert(i3,std::move(nh));
|
||||
CATCH_SAFE_MODE(safe_mode::unequal_allocators)
|
||||
|
||||
/* testcase for bug reported at
|
||||
@@ -374,9 +373,9 @@ struct key_based_index_policy_base:
|
||||
return i.insert(it,v);
|
||||
}
|
||||
|
||||
static void insert(index_type& i,BOOST_RV_REF(node_type) nh)
|
||||
static void insert(index_type& i,node_type&& nh)
|
||||
{
|
||||
i.insert(boost::move(nh));
|
||||
i.insert(std::move(nh));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -402,9 +401,9 @@ struct non_key_based_index_policy_base:
|
||||
return i.insert(it,v).first;
|
||||
}
|
||||
|
||||
static void insert(index_type& i,BOOST_RV_REF(node_type) nh)
|
||||
static void insert(index_type& i,node_type&& nh)
|
||||
{
|
||||
i.insert(i.end(),boost::move(nh));
|
||||
i.insert(i.end(),std::move(nh));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Boost.MultiIndex test for serialization, part 3.
|
||||
*
|
||||
* Copyright 2003-2018 Joaquin M Lopez Munoz.
|
||||
* Copyright 2003-2025 Joaquin M Lopez Munoz.
|
||||
* 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)
|
||||
@@ -11,7 +11,6 @@
|
||||
#include "test_serialization3.hpp"
|
||||
#include "test_serialization_template.hpp"
|
||||
|
||||
#include <boost/move/core.hpp>
|
||||
#include <boost/multi_index/hashed_index.hpp>
|
||||
#include <boost/multi_index/sequenced_index.hpp>
|
||||
#include <boost/multi_index/ordered_index.hpp>
|
||||
@@ -27,11 +26,6 @@ struct non_default_ctble
|
||||
int n;
|
||||
};
|
||||
|
||||
#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
namespace boost{
|
||||
namespace serialization{
|
||||
#endif
|
||||
|
||||
template<class Archive>
|
||||
void save_construct_data(
|
||||
Archive& ar,const non_default_ctble* p,const unsigned int version)
|
||||
@@ -57,11 +51,6 @@ void serialize(Archive&,non_default_ctble&,const unsigned int)
|
||||
{
|
||||
}
|
||||
|
||||
#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
} /* namespace serialization */
|
||||
} /* namespace boost*/
|
||||
#endif
|
||||
|
||||
namespace boost{
|
||||
namespace serialization{
|
||||
template<> struct version<non_default_ctble>
|
||||
@@ -74,33 +63,20 @@ template<> struct version<non_default_ctble>
|
||||
struct non_copyable
|
||||
{
|
||||
non_copyable(int n_=0):n(n_){}
|
||||
non_copyable(BOOST_RV_REF(non_copyable) x):n(x.n){}
|
||||
non_copyable(non_copyable&& x):n(x.n){}
|
||||
|
||||
bool operator==(const non_copyable& x)const{return n==x.n;}
|
||||
bool operator<(const non_copyable& x)const{return n<x.n;}
|
||||
|
||||
int n;
|
||||
|
||||
private:
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(non_copyable)
|
||||
};
|
||||
|
||||
#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
namespace boost{
|
||||
namespace serialization{
|
||||
#endif
|
||||
|
||||
template<class Archive>
|
||||
void serialize(Archive& ar,non_copyable& x,const unsigned int)
|
||||
{
|
||||
ar&boost::serialization::make_nvp("n",x.n);
|
||||
}
|
||||
|
||||
#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
||||
} /* namespace serialization */
|
||||
} /* namespace boost*/
|
||||
#endif
|
||||
|
||||
using namespace boost::multi_index;
|
||||
|
||||
void test_serialization3()
|
||||
|
||||
@@ -56,11 +56,11 @@ bool all_indices_equal(
|
||||
#if defined(BOOST_MULTI_INDEX_ENABLE_MPL_SUPPORT)
|
||||
BOOST_STATIC_CONSTANT(int,
|
||||
N=boost::mpl::size<
|
||||
BOOST_DEDUCED_TYPENAME MultiIndexContainer::index_type_list>::value);
|
||||
typename MultiIndexContainer::index_type_list>::value);
|
||||
#else
|
||||
BOOST_STATIC_CONSTANT(int,
|
||||
N=boost::mp11::mp_size<
|
||||
BOOST_DEDUCED_TYPENAME MultiIndexContainer::index_type_list>::value);
|
||||
typename MultiIndexContainer::index_type_list>::value);
|
||||
#endif
|
||||
|
||||
return all_indices_equal_helper<N-1>::compare(m1,m2);
|
||||
|
||||
Reference in New Issue
Block a user