passenger 6.2.0 → 6.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (898) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +69 -15
  3. data/CONTRIBUTING.md +7 -311
  4. data/CONTRIBUTORS +1 -0
  5. data/LICENSE +1 -1
  6. data/README.md +1 -1
  7. data/Rakefile +1 -1
  8. data/bin/passenger +1 -1
  9. data/bin/passenger-config +1 -1
  10. data/bin/passenger-install-apache2-module +1 -1
  11. data/bin/passenger-install-nginx-module +4 -9
  12. data/bin/passenger-memory-stats +1 -1
  13. data/bin/passenger-status +1 -1
  14. data/build/agent.rb +13 -15
  15. data/build/apache2.rb +13 -16
  16. data/build/basics.rb +10 -13
  17. data/build/common_library.rb +5 -9
  18. data/build/cxx_tests.rb +39 -12
  19. data/build/integration_tests.rb +5 -2
  20. data/build/misc.rb +1 -1
  21. data/build/nginx.rb +1 -1
  22. data/build/node_tests.rb +1 -1
  23. data/build/oxt_tests.rb +6 -8
  24. data/build/packaging.rb +1 -1
  25. data/build/ruby_extension.rb +1 -1
  26. data/build/ruby_tests.rb +1 -1
  27. data/build/schema_printer.rb +13 -15
  28. data/build/support/cplusplus.rb +61 -69
  29. data/build/support/cxx_dependency_map.rb +5 -64
  30. data/build/support/general.rb +1 -1
  31. data/build/support/vendor/cxx_hinted_parser/LICENSE.md +1 -1
  32. data/build/support/vendor/cxx_hinted_parser/lib/cxx_hinted_parser/parser.rb +1 -1
  33. data/build/support/vendor/cxx_hinted_parser/lib/cxx_hinted_parser.rb +1 -1
  34. data/build/support/vendor/cxxcodebuilder/LICENSE.md +1 -1
  35. data/build/support/vendor/cxxcodebuilder/lib/cxxcodebuilder/builder.rb +1 -1
  36. data/build/support/vendor/cxxcodebuilder/lib/cxxcodebuilder/initializer_builder.rb +1 -1
  37. data/build/support/vendor/cxxcodebuilder/lib/cxxcodebuilder.rb +1 -1
  38. data/build/test_basics.rb +1 -1
  39. data/dev/copy_boost_headers +1 -1
  40. data/dev/index_cxx_dependencies.rb +5 -1
  41. data/dev/libev-changes.patch +108 -0
  42. data/dev/nginx_version_sha256 +1 -1
  43. data/dev/ruby_server.rb +1 -6
  44. data/dev/upgrading_libuv.sh +16 -0
  45. data/doc/BasicArchitectureOverview.md +55 -0
  46. data/doc/BuildCaching.md +23 -0
  47. data/doc/BuildSystem.md +49 -0
  48. data/doc/DebuggingAndStressTesting.md +2 -0
  49. data/doc/DesignAspects/LimitedGemDependencies.md +1 -0
  50. data/doc/DevEnvironmentSetup.md +46 -0
  51. data/doc/DevHandbook.md +28 -0
  52. data/doc/Packaging.md +1 -1
  53. data/doc/RunningTests.md +88 -0
  54. data/doc/{TempFileHandling.md → SecureTempFileHandling.md} +1 -1
  55. data/doc/{CxxTestingGuide.md → WritingCxxTests.md} +1 -20
  56. data/src/agent/AgentMain.cpp +1 -1
  57. data/src/agent/Core/ApiServer.h +1 -1
  58. data/src/agent/Core/ApplicationPool/AbstractSession.h +1 -1
  59. data/src/agent/Core/ApplicationPool/BasicGroupInfo.h +1 -1
  60. data/src/agent/Core/ApplicationPool/BasicProcessInfo.h +1 -1
  61. data/src/agent/Core/ApplicationPool/Common.h +1 -1
  62. data/src/agent/Core/ApplicationPool/Context.h +1 -1
  63. data/src/agent/Core/ApplicationPool/Group/InitializationAndShutdown.cpp +1 -1
  64. data/src/agent/Core/ApplicationPool/Group/InternalUtils.cpp +1 -1
  65. data/src/agent/Core/ApplicationPool/Group/LifetimeAndBasics.cpp +1 -1
  66. data/src/agent/Core/ApplicationPool/Group/Miscellaneous.cpp +1 -1
  67. data/src/agent/Core/ApplicationPool/Group/OutOfBandWork.cpp +1 -1
  68. data/src/agent/Core/ApplicationPool/Group/ProcessListManagement.cpp +1 -1
  69. data/src/agent/Core/ApplicationPool/Group/SessionManagement.cpp +1 -1
  70. data/src/agent/Core/ApplicationPool/Group/SpawningAndRestarting.cpp +1 -1
  71. data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +1 -1
  72. data/src/agent/Core/ApplicationPool/Group/Verification.cpp +1 -1
  73. data/src/agent/Core/ApplicationPool/Group.h +1 -1
  74. data/src/agent/Core/ApplicationPool/Implementation.cpp +1 -1
  75. data/src/agent/Core/ApplicationPool/Options.h +1 -1
  76. data/src/agent/Core/ApplicationPool/Pool/AnalyticsCollection.cpp +1 -1
  77. data/src/agent/Core/ApplicationPool/Pool/GarbageCollection.cpp +1 -1
  78. data/src/agent/Core/ApplicationPool/Pool/GeneralUtils.cpp +1 -1
  79. data/src/agent/Core/ApplicationPool/Pool/GroupUtils.cpp +1 -1
  80. data/src/agent/Core/ApplicationPool/Pool/InitializationAndShutdown.cpp +1 -1
  81. data/src/agent/Core/ApplicationPool/Pool/Miscellaneous.cpp +1 -1
  82. data/src/agent/Core/ApplicationPool/Pool/ProcessUtils.cpp +1 -1
  83. data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +1 -1
  84. data/src/agent/Core/ApplicationPool/Pool.h +1 -1
  85. data/src/agent/Core/ApplicationPool/Process.cpp +1 -1
  86. data/src/agent/Core/ApplicationPool/Process.h +1 -1
  87. data/src/agent/Core/ApplicationPool/Session.h +1 -1
  88. data/src/agent/Core/ApplicationPool/Socket.h +1 -1
  89. data/src/agent/Core/ApplicationPool/TestSession.h +1 -1
  90. data/src/agent/Core/Config.h +3 -2
  91. data/src/agent/Core/ConfigChange.cpp +1 -1
  92. data/src/agent/Core/ConfigChange.h +1 -1
  93. data/src/agent/Core/Controller/AppResponse.h +1 -1
  94. data/src/agent/Core/Controller/BufferBody.cpp +1 -1
  95. data/src/agent/Core/Controller/CheckoutSession.cpp +8 -5
  96. data/src/agent/Core/Controller/Client.h +1 -1
  97. data/src/agent/Core/Controller/Config.cpp +1 -1
  98. data/src/agent/Core/Controller/Config.h +2 -2
  99. data/src/agent/Core/Controller/ForwardResponse.cpp +2 -2
  100. data/src/agent/Core/Controller/Hooks.cpp +12 -9
  101. data/src/agent/Core/Controller/Implementation.cpp +1 -1
  102. data/src/agent/Core/Controller/InitRequest.cpp +1 -1
  103. data/src/agent/Core/Controller/InitializationAndShutdown.cpp +1 -1
  104. data/src/agent/Core/Controller/InternalUtils.cpp +1 -1
  105. data/src/agent/Core/Controller/Miscellaneous.cpp +1 -1
  106. data/src/agent/Core/Controller/Request.h +1 -1
  107. data/src/agent/Core/Controller/SendRequest.cpp +1 -1
  108. data/src/agent/Core/Controller/StateInspection.cpp +1 -1
  109. data/src/agent/Core/Controller/TurboCaching.h +1 -1
  110. data/src/agent/Core/Controller.h +1 -1
  111. data/src/agent/Core/CoreMain.cpp +1 -1
  112. data/src/agent/Core/OptionParser.h +1 -1
  113. data/src/agent/Core/ResponseCache.h +1 -1
  114. data/src/agent/Core/SecurityUpdateChecker.h +1 -1
  115. data/src/agent/Core/SpawningKit/Config/AutoGeneratedCode.h +1 -1
  116. data/src/agent/Core/SpawningKit/Config/AutoGeneratedCode.h.cxxcodebuilder +1 -1
  117. data/src/agent/Core/SpawningKit/Config.h +1 -1
  118. data/src/agent/Core/SpawningKit/Context.h +1 -1
  119. data/src/agent/Core/SpawningKit/DirectSpawner.h +1 -1
  120. data/src/agent/Core/SpawningKit/DummySpawner.h +1 -1
  121. data/src/agent/Core/SpawningKit/ErrorRenderer.h +1 -1
  122. data/src/agent/Core/SpawningKit/Exceptions.h +63 -2
  123. data/src/agent/Core/SpawningKit/Factory.h +1 -1
  124. data/src/agent/Core/SpawningKit/Handshake/BackgroundIOCapturer.h +1 -1
  125. data/src/agent/Core/SpawningKit/Handshake/Perform.h +3 -2
  126. data/src/agent/Core/SpawningKit/Handshake/Prepare.h +1 -1
  127. data/src/agent/Core/SpawningKit/Handshake/Session.h +1 -1
  128. data/src/agent/Core/SpawningKit/Handshake/WorkDir.h +1 -1
  129. data/src/agent/Core/SpawningKit/Journey.h +1 -1
  130. data/src/agent/Core/SpawningKit/PipeWatcher.h +1 -1
  131. data/src/agent/Core/SpawningKit/README.md +3 -3
  132. data/src/agent/Core/SpawningKit/Result/AutoGeneratedCode.h +1 -1
  133. data/src/agent/Core/SpawningKit/Result/AutoGeneratedCode.h.cxxcodebuilder +1 -1
  134. data/src/agent/Core/SpawningKit/Result.h +1 -1
  135. data/src/agent/Core/SpawningKit/SmartSpawner.h +17 -17
  136. data/src/agent/Core/SpawningKit/Spawner.h +1 -1
  137. data/src/agent/Core/SpawningKit/UserSwitchingRules.h +1 -1
  138. data/src/agent/Core/TelemetryCollector.h +1 -1
  139. data/src/agent/ExecHelper/ExecHelperMain.cpp +1 -1
  140. data/src/agent/FileReadHelper/FileReadHelperMain.cpp +1 -1
  141. data/src/agent/MainFunctions.h +1 -1
  142. data/src/agent/Shared/ApiAccountUtils.h +4 -3
  143. data/src/agent/Shared/ApiServerUtils.h +2 -3
  144. data/src/agent/Shared/ApplicationPoolApiKey.h +1 -1
  145. data/src/agent/Shared/Fundamentals/AbortHandler.cpp +1 -1
  146. data/src/agent/Shared/Fundamentals/AbortHandler.h +1 -1
  147. data/src/agent/Shared/Fundamentals/Initialization.cpp +1 -1
  148. data/src/agent/Shared/Fundamentals/Initialization.h +1 -1
  149. data/src/agent/Shared/Fundamentals/Utils.cpp +1 -1
  150. data/src/agent/Shared/Fundamentals/Utils.h +1 -1
  151. data/src/agent/SpawnEnvSetupper/SpawnEnvSetupperMain.cpp +1 -1
  152. data/src/agent/SystemMetrics/SystemMetricsMain.cpp +1 -1
  153. data/src/agent/TempDirToucher/TempDirToucherMain.cpp +1 -1
  154. data/src/agent/Watchdog/ApiServer.h +7 -6
  155. data/src/agent/Watchdog/Config.h +2 -2
  156. data/src/apache2_module/Bucket.cpp +1 -1
  157. data/src/apache2_module/Bucket.h +1 -1
  158. data/src/apache2_module/CBindings.cpp +1 -1
  159. data/src/apache2_module/Config.cpp +1 -1
  160. data/src/apache2_module/Config.h +1 -1
  161. data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp +104 -104
  162. data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp.cxxcodebuilder +2 -2
  163. data/src/apache2_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.cpp +1 -1
  164. data/src/apache2_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.cpp.cxxcodebuilder +1 -1
  165. data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp +1 -1
  166. data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp.cxxcodebuilder +1 -1
  167. data/src/apache2_module/ConfigGeneral/Common.h +1 -1
  168. data/src/apache2_module/ConfigGeneral/ManifestGeneration.h +1 -1
  169. data/src/apache2_module/ConfigGeneral/SetterFuncs.h +1 -1
  170. data/src/apache2_module/DirConfig/AutoGeneratedCreateFunction.cpp +1 -1
  171. data/src/apache2_module/DirConfig/AutoGeneratedCreateFunction.cpp.cxxcodebuilder +1 -1
  172. data/src/apache2_module/DirConfig/AutoGeneratedHeaderSerialization.cpp +1 -1
  173. data/src/apache2_module/DirConfig/AutoGeneratedHeaderSerialization.cpp.cxxcodebuilder +1 -1
  174. data/src/apache2_module/DirConfig/AutoGeneratedManifestGeneration.cpp +1 -1
  175. data/src/apache2_module/DirConfig/AutoGeneratedManifestGeneration.cpp.cxxcodebuilder +1 -1
  176. data/src/apache2_module/DirConfig/AutoGeneratedMergeFunction.cpp +1 -1
  177. data/src/apache2_module/DirConfig/AutoGeneratedMergeFunction.cpp.cxxcodebuilder +1 -1
  178. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h +1 -1
  179. data/src/apache2_module/DirConfig/AutoGeneratedStruct.h.cxxcodebuilder +1 -1
  180. data/src/apache2_module/DirectoryMapper.h +1 -1
  181. data/src/apache2_module/Hooks.cpp +21 -2
  182. data/src/apache2_module/Hooks.h +1 -1
  183. data/src/apache2_module/ServerConfig/AutoGeneratedManifestGeneration.cpp +1 -1
  184. data/src/apache2_module/ServerConfig/AutoGeneratedManifestGeneration.cpp.cxxcodebuilder +1 -1
  185. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +1 -1
  186. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h.cxxcodebuilder +1 -1
  187. data/src/apache2_module/Utils.h +15 -1
  188. data/src/apache2_module/mod_passenger.c +1 -1
  189. data/src/cxx_supportlib/Algorithms/Hasher.cpp +1 -1
  190. data/src/cxx_supportlib/Algorithms/Hasher.h +1 -1
  191. data/src/cxx_supportlib/Algorithms/MovingAverage.h +1 -1
  192. data/src/cxx_supportlib/AppLocalConfigFileUtils.h +1 -1
  193. data/src/cxx_supportlib/AppTypeDetector/CBindings.cpp +1 -1
  194. data/src/cxx_supportlib/AppTypeDetector/CBindings.h +1 -1
  195. data/src/cxx_supportlib/AppTypeDetector/Detector.h +1 -1
  196. data/src/cxx_supportlib/BackgroundEventLoop.cpp +1 -1
  197. data/src/cxx_supportlib/BackgroundEventLoop.h +1 -1
  198. data/src/cxx_supportlib/ConfigKit/AsyncUtils.h +1 -1
  199. data/src/cxx_supportlib/ConfigKit/Common.h +1 -1
  200. data/src/cxx_supportlib/ConfigKit/ConfigKit.h +1 -1
  201. data/src/cxx_supportlib/ConfigKit/DummyTranslator.h +1 -1
  202. data/src/cxx_supportlib/ConfigKit/IN_PRACTICE.md +1 -3
  203. data/src/cxx_supportlib/ConfigKit/PrefixTranslator.h +3 -3
  204. data/src/cxx_supportlib/ConfigKit/Schema.h +1 -1
  205. data/src/cxx_supportlib/ConfigKit/SchemaUtils.h +1 -1
  206. data/src/cxx_supportlib/ConfigKit/Store.h +1 -1
  207. data/src/cxx_supportlib/ConfigKit/SubComponentUtils.h +1 -1
  208. data/src/cxx_supportlib/ConfigKit/TableTranslator.h +1 -1
  209. data/src/cxx_supportlib/ConfigKit/Translator.h +1 -1
  210. data/src/cxx_supportlib/ConfigKit/Utils.h +1 -1
  211. data/src/cxx_supportlib/Constants.h +2 -2
  212. data/src/cxx_supportlib/Constants.h.cxxcodebuilder +1 -1
  213. data/src/cxx_supportlib/DataStructures/HashedStaticString.h +1 -1
  214. data/src/cxx_supportlib/DataStructures/LString.cpp +1 -1
  215. data/src/cxx_supportlib/DataStructures/LString.h +1 -1
  216. data/src/cxx_supportlib/DataStructures/StringKeyTable.h +1 -1
  217. data/src/cxx_supportlib/DataStructures/StringMap.h +1 -1
  218. data/src/cxx_supportlib/Exceptions.cpp +1 -1
  219. data/src/cxx_supportlib/Exceptions.h +1 -1
  220. data/src/cxx_supportlib/FileDescriptor.h +1 -1
  221. data/src/cxx_supportlib/FileTools/FileManip.cpp +28 -4
  222. data/src/cxx_supportlib/FileTools/FileManip.h +1 -1
  223. data/src/cxx_supportlib/FileTools/PathManip.cpp +1 -1
  224. data/src/cxx_supportlib/FileTools/PathManip.h +1 -1
  225. data/src/cxx_supportlib/FileTools/PathManipCBindings.cpp +1 -1
  226. data/src/cxx_supportlib/FileTools/PathManipCBindings.h +1 -1
  227. data/src/cxx_supportlib/FileTools/PathSecurityCheck.cpp +1 -1
  228. data/src/cxx_supportlib/FileTools/PathSecurityCheck.h +1 -1
  229. data/src/cxx_supportlib/Hooks.h +1 -1
  230. data/src/cxx_supportlib/IOTools/BufferedIO.h +1 -1
  231. data/src/cxx_supportlib/IOTools/IOUtils.cpp +10 -10
  232. data/src/cxx_supportlib/IOTools/IOUtils.h +1 -1
  233. data/src/cxx_supportlib/IOTools/MessageIO.h +1 -1
  234. data/src/cxx_supportlib/IOTools/MessageSerialization.h +1 -1
  235. data/src/cxx_supportlib/InstanceDirectory.h +31 -4
  236. data/src/cxx_supportlib/Integrations/LibevJsonUtils.h +1 -1
  237. data/src/cxx_supportlib/JsonTools/Autocast.h +1 -1
  238. data/src/cxx_supportlib/JsonTools/CBindings.cpp +1 -1
  239. data/src/cxx_supportlib/JsonTools/CBindings.h +1 -1
  240. data/src/cxx_supportlib/JsonTools/JsonUtils.h +1 -1
  241. data/src/cxx_supportlib/LoggingKit/Assert.h +1 -1
  242. data/src/cxx_supportlib/LoggingKit/Config.h +2 -1
  243. data/src/cxx_supportlib/LoggingKit/Context.h +1 -1
  244. data/src/cxx_supportlib/LoggingKit/Forward.h +1 -1
  245. data/src/cxx_supportlib/LoggingKit/Implementation.cpp +11 -1
  246. data/src/cxx_supportlib/LoggingKit/Logging.h +1 -1
  247. data/src/cxx_supportlib/LoggingKit/LoggingKit.h +1 -1
  248. data/src/cxx_supportlib/LveLoggingDecorator.h +1 -1
  249. data/src/cxx_supportlib/MemoryKit/mbuf.cpp +1 -1
  250. data/src/cxx_supportlib/MemoryKit/mbuf.h +1 -1
  251. data/src/cxx_supportlib/MemoryKit/palloc.cpp +1 -1
  252. data/src/cxx_supportlib/MemoryKit/palloc.h +1 -1
  253. data/src/cxx_supportlib/ProcessManagement/Ruby.cpp +1 -1
  254. data/src/cxx_supportlib/ProcessManagement/Ruby.h +1 -1
  255. data/src/cxx_supportlib/ProcessManagement/Spawn.cpp +1 -1
  256. data/src/cxx_supportlib/ProcessManagement/Spawn.h +1 -1
  257. data/src/cxx_supportlib/ProcessManagement/Utils.cpp +1 -1
  258. data/src/cxx_supportlib/ProcessManagement/Utils.h +1 -1
  259. data/src/cxx_supportlib/RandomGenerator.h +1 -1
  260. data/src/cxx_supportlib/ResourceLocator.h +1 -1
  261. data/src/cxx_supportlib/SafeLibev.h +1 -1
  262. data/src/cxx_supportlib/SecurityKit/Crypto.cpp +9 -27
  263. data/src/cxx_supportlib/SecurityKit/Crypto.h +2 -2
  264. data/src/cxx_supportlib/SecurityKit/MemZeroGuard.h +1 -1
  265. data/src/cxx_supportlib/ServerKit/AcceptLoadBalancer.h +1 -1
  266. data/src/cxx_supportlib/ServerKit/Channel.h +1 -1
  267. data/src/cxx_supportlib/ServerKit/Client.h +1 -1
  268. data/src/cxx_supportlib/ServerKit/ClientRef.h +1 -1
  269. data/src/cxx_supportlib/ServerKit/Config.h +1 -1
  270. data/src/cxx_supportlib/ServerKit/Context.h +1 -1
  271. data/src/cxx_supportlib/ServerKit/CookieUtils.h +1 -1
  272. data/src/cxx_supportlib/ServerKit/Errors.h +2 -2
  273. data/src/cxx_supportlib/ServerKit/FdSinkChannel.h +1 -1
  274. data/src/cxx_supportlib/ServerKit/FdSourceChannel.h +1 -1
  275. data/src/cxx_supportlib/ServerKit/FileBufferedChannel.h +54 -2
  276. data/src/cxx_supportlib/ServerKit/FileBufferedFdSinkChannel.h +1 -1
  277. data/src/cxx_supportlib/ServerKit/HeaderTable.h +1 -1
  278. data/src/cxx_supportlib/ServerKit/Hooks.h +1 -1
  279. data/src/cxx_supportlib/ServerKit/HttpChunkedBodyParser.h +1 -1
  280. data/src/cxx_supportlib/ServerKit/HttpChunkedBodyParserState.h +1 -1
  281. data/src/cxx_supportlib/ServerKit/HttpClient.h +1 -1
  282. data/src/cxx_supportlib/ServerKit/HttpHeaderParser.h +2 -2
  283. data/src/cxx_supportlib/ServerKit/HttpHeaderParserState.h +2 -2
  284. data/src/cxx_supportlib/ServerKit/HttpRequest.h +2 -2
  285. data/src/cxx_supportlib/ServerKit/HttpRequestRef.h +1 -1
  286. data/src/cxx_supportlib/ServerKit/HttpServer.h +1 -1
  287. data/src/cxx_supportlib/ServerKit/Implementation.cpp +1 -1
  288. data/src/cxx_supportlib/ServerKit/Server.h +4 -2
  289. data/src/cxx_supportlib/ServerKit/llerrors.h +3 -3
  290. data/src/cxx_supportlib/ServerKit/llversion.h +1 -1
  291. data/src/cxx_supportlib/StaticString.h +1 -1
  292. data/src/cxx_supportlib/StrIntTools/DateParsing.h +1 -1
  293. data/src/cxx_supportlib/StrIntTools/StrIntUtils.cpp +1 -1
  294. data/src/cxx_supportlib/StrIntTools/StrIntUtils.h +1 -1
  295. data/src/cxx_supportlib/StrIntTools/StrIntUtilsNoStrictAliasing.cpp +1 -1
  296. data/src/cxx_supportlib/StrIntTools/StringScanning.h +1 -1
  297. data/src/cxx_supportlib/StrIntTools/Template.h +1 -1
  298. data/src/cxx_supportlib/SystemTools/ContainerHelpers.h +1 -1
  299. data/src/cxx_supportlib/SystemTools/ProcessMetricsCollector.h +1 -1
  300. data/src/cxx_supportlib/SystemTools/SystemMetricsCollector.h +1 -1
  301. data/src/cxx_supportlib/SystemTools/SystemTime.cpp +1 -1
  302. data/src/cxx_supportlib/SystemTools/SystemTime.h +1 -1
  303. data/src/cxx_supportlib/SystemTools/UserDatabase.cpp +1 -1
  304. data/src/cxx_supportlib/SystemTools/UserDatabase.h +1 -1
  305. data/src/cxx_supportlib/Utils/AnsiColorConstants.h +1 -1
  306. data/src/cxx_supportlib/Utils/AsyncSignalSafeUtils.h +1 -1
  307. data/src/cxx_supportlib/Utils/BlockingQueue.h +1 -1
  308. data/src/cxx_supportlib/Utils/CachedFileStat.cpp +1 -1
  309. data/src/cxx_supportlib/Utils/CachedFileStat.h +1 -1
  310. data/src/cxx_supportlib/Utils/CachedFileStat.hpp +1 -1
  311. data/src/cxx_supportlib/Utils/ClassUtils.h +1 -1
  312. data/src/cxx_supportlib/Utils/Curl.h +1 -1
  313. data/src/cxx_supportlib/Utils/FastStringStream.h +1 -1
  314. data/src/cxx_supportlib/Utils/FileChangeChecker.h +1 -1
  315. data/src/cxx_supportlib/Utils/HttpConstants.h +1 -1
  316. data/src/cxx_supportlib/Utils/IniFile.h +1 -1
  317. data/src/cxx_supportlib/Utils/MessagePassing.h +1 -1
  318. data/src/cxx_supportlib/Utils/OptionParsing.h +1 -1
  319. data/src/cxx_supportlib/Utils/ReleaseableScopedPointer.h +1 -1
  320. data/src/cxx_supportlib/Utils/ScopeGuard.h +1 -1
  321. data/src/cxx_supportlib/Utils/SpeedMeter.h +1 -1
  322. data/src/cxx_supportlib/Utils/Timer.h +1 -1
  323. data/src/cxx_supportlib/Utils/VariantMap.h +1 -1
  324. data/src/cxx_supportlib/Utils.cpp +1 -1
  325. data/src/cxx_supportlib/Utils.h +1 -1
  326. data/src/cxx_supportlib/WatchdogLauncher.cpp +1 -1
  327. data/src/cxx_supportlib/WatchdogLauncher.h +1 -1
  328. data/src/cxx_supportlib/WrapperRegistry/CBindings.cpp +1 -1
  329. data/src/cxx_supportlib/WrapperRegistry/CBindings.h +1 -1
  330. data/src/cxx_supportlib/WrapperRegistry/Entry.h +1 -1
  331. data/src/cxx_supportlib/WrapperRegistry/Registry.h +1 -1
  332. data/src/cxx_supportlib/oxt/backtrace.hpp +1 -1
  333. data/src/cxx_supportlib/oxt/detail/backtrace_disabled.hpp +1 -1
  334. data/src/cxx_supportlib/oxt/detail/backtrace_enabled.hpp +1 -1
  335. data/src/cxx_supportlib/oxt/detail/context.hpp +1 -1
  336. data/src/cxx_supportlib/oxt/detail/tracable_exception_disabled.hpp +1 -1
  337. data/src/cxx_supportlib/oxt/detail/tracable_exception_enabled.hpp +1 -1
  338. data/src/cxx_supportlib/oxt/dynamic_thread_group.hpp +1 -1
  339. data/src/cxx_supportlib/oxt/implementation.cpp +1 -1
  340. data/src/cxx_supportlib/oxt/initialize.hpp +1 -1
  341. data/src/cxx_supportlib/oxt/macros.hpp +1 -1
  342. data/src/cxx_supportlib/oxt/spin_lock.hpp +1 -1
  343. data/src/cxx_supportlib/oxt/system_calls.cpp +1 -1
  344. data/src/cxx_supportlib/oxt/system_calls.hpp +1 -1
  345. data/src/cxx_supportlib/oxt/thread.hpp +1 -1
  346. data/src/cxx_supportlib/oxt/tracable_exception.hpp +1 -1
  347. data/src/cxx_supportlib/vendor-copy/adhoc_lve.h +1 -1
  348. data/src/cxx_supportlib/vendor-copy/libuv/AUTHORS +353 -3
  349. data/src/cxx_supportlib/vendor-copy/libuv/ChangeLog +3981 -2
  350. data/src/cxx_supportlib/vendor-copy/libuv/LICENSE +1 -28
  351. data/src/cxx_supportlib/vendor-copy/libuv/LICENSE-docs +396 -0
  352. data/src/cxx_supportlib/vendor-copy/libuv/LICENSE-extra +36 -0
  353. data/src/cxx_supportlib/vendor-copy/libuv/Makefile.am +275 -58
  354. data/src/cxx_supportlib/vendor-copy/libuv/Makefile.in +4380 -2125
  355. data/src/cxx_supportlib/vendor-copy/libuv/aclocal.m4 +425 -221
  356. data/src/cxx_supportlib/vendor-copy/libuv/ar-lib +30 -10
  357. data/src/cxx_supportlib/vendor-copy/libuv/compile +31 -14
  358. data/src/cxx_supportlib/vendor-copy/libuv/config.guess +1084 -690
  359. data/src/cxx_supportlib/vendor-copy/libuv/config.sub +1844 -1297
  360. data/src/cxx_supportlib/vendor-copy/libuv/configure +6935 -3664
  361. data/src/cxx_supportlib/vendor-copy/libuv/configure.ac +43 -19
  362. data/src/cxx_supportlib/vendor-copy/libuv/depcomp +12 -11
  363. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-darwin.h → uv/darwin.h} +3 -3
  364. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-errno.h → uv/errno.h} +119 -60
  365. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-linux.h → uv/linux.h} +1 -1
  366. data/src/cxx_supportlib/vendor-copy/libuv/include/uv/os390.h +33 -0
  367. data/src/cxx_supportlib/vendor-copy/libuv/include/uv/posix.h +31 -0
  368. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-threadpool.h → uv/threadpool.h} +1 -1
  369. data/src/cxx_supportlib/vendor-copy/libuv/include/{tree.h → uv/tree.h} +3 -250
  370. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-unix.h → uv/unix.h} +186 -60
  371. data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-version.h → uv/version.h} +3 -3
  372. data/src/cxx_supportlib/vendor-copy/libuv/include/uv/win.h +703 -0
  373. data/src/cxx_supportlib/vendor-copy/libuv/include/uv.h +528 -40
  374. data/src/cxx_supportlib/vendor-copy/libuv/install-sh +110 -70
  375. data/src/cxx_supportlib/vendor-copy/libuv/libuv-static.pc.in +12 -0
  376. data/src/cxx_supportlib/vendor-copy/libuv/libuv.pc.in +4 -2
  377. data/src/cxx_supportlib/vendor-copy/libuv/ltmain.sh +995 -619
  378. data/src/cxx_supportlib/vendor-copy/libuv/m4/ax_pthread.m4 +485 -0
  379. data/src/cxx_supportlib/vendor-copy/libuv/m4/libtool.m4 +438 -289
  380. data/src/cxx_supportlib/vendor-copy/libuv/m4/libuv-check-flags.m4 +21 -4
  381. data/src/cxx_supportlib/vendor-copy/libuv/m4/libuv-check-versions.m4 +7 -0
  382. data/src/cxx_supportlib/vendor-copy/libuv/m4/ltoptions.m4 +69 -39
  383. data/src/cxx_supportlib/vendor-copy/libuv/m4/ltsugar.m4 +1 -1
  384. data/src/cxx_supportlib/vendor-copy/libuv/m4/ltversion.m4 +7 -6
  385. data/src/cxx_supportlib/vendor-copy/libuv/m4/lt~obsolete.m4 +2 -2
  386. data/src/cxx_supportlib/vendor-copy/libuv/missing +55 -34
  387. data/src/cxx_supportlib/vendor-copy/libuv/src/fs-poll.c +52 -20
  388. data/src/cxx_supportlib/vendor-copy/libuv/src/idna.c +560 -0
  389. data/src/cxx_supportlib/vendor-copy/libuv/src/idna.h +31 -0
  390. data/src/cxx_supportlib/vendor-copy/libuv/src/inet.c +5 -16
  391. data/src/cxx_supportlib/vendor-copy/libuv/src/queue.h +68 -86
  392. data/src/cxx_supportlib/vendor-copy/libuv/src/random.c +123 -0
  393. data/src/cxx_supportlib/vendor-copy/libuv/src/strscpy.c +38 -0
  394. data/src/cxx_supportlib/vendor-copy/libuv/src/strscpy.h +39 -0
  395. data/src/cxx_supportlib/vendor-copy/libuv/src/strtok.c +52 -0
  396. data/src/cxx_supportlib/vendor-copy/libuv/src/strtok.h +27 -0
  397. data/src/cxx_supportlib/vendor-copy/libuv/src/thread-common.c +175 -0
  398. data/src/cxx_supportlib/vendor-copy/libuv/src/threadpool.c +172 -57
  399. data/src/cxx_supportlib/vendor-copy/libuv/src/{unix/timer.c → timer.c} +57 -29
  400. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/aix-common.c +89 -0
  401. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/aix.c +418 -256
  402. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/async.c +168 -129
  403. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/bsd-ifaddrs.c +163 -0
  404. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/bsd-proctitle.c +99 -0
  405. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/core.c +1312 -378
  406. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/cygwin.c +93 -0
  407. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/darwin-proctitle.c +18 -32
  408. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/darwin-stub.h +97 -0
  409. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/darwin-syscalls.h +17 -0
  410. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/darwin.c +41 -139
  411. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/dl.c +1 -1
  412. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/freebsd.c +75 -235
  413. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/fs.c +1308 -299
  414. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/fsevents.c +150 -148
  415. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/getaddrinfo.c +58 -8
  416. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/getnameinfo.c +3 -2
  417. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/haiku.c +172 -0
  418. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/hurd.c +172 -0
  419. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/ibmi.c +542 -0
  420. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/internal.h +297 -106
  421. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/kqueue.c +325 -94
  422. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/linux.c +2708 -0
  423. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/loop-watcher.c +11 -11
  424. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/loop.c +105 -24
  425. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/netbsd.c +51 -157
  426. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/no-fsevents.c +42 -0
  427. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/no-proctitle.c +45 -0
  428. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/openbsd.c +42 -183
  429. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/os390-proctitle.c +136 -0
  430. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/os390-syscalls.c +536 -0
  431. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/os390-syscalls.h +75 -0
  432. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/os390.c +1070 -0
  433. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/pipe.c +324 -55
  434. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/poll.c +58 -11
  435. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/posix-hrtime.c +36 -0
  436. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/posix-poll.c +385 -0
  437. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/process.c +795 -248
  438. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/procfs-exepath.c +45 -0
  439. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/proctitle.c +77 -22
  440. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/qnx.c +142 -0
  441. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/random-devurandom.c +93 -0
  442. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/random-getentropy.c +57 -0
  443. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/random-getrandom.c +86 -0
  444. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/random-sysctl-linux.c +99 -0
  445. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/signal.c +147 -39
  446. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/stream.c +426 -474
  447. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/sunos.c +240 -98
  448. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/sysinfo-loadavg.c +36 -0
  449. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/sysinfo-memory.c +42 -0
  450. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/tcp.c +402 -91
  451. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/thread.c +497 -145
  452. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/tty.c +269 -45
  453. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/udp.c +695 -165
  454. data/src/cxx_supportlib/vendor-copy/libuv/src/uv-common.c +463 -61
  455. data/src/cxx_supportlib/vendor-copy/libuv/src/uv-common.h +248 -44
  456. data/src/cxx_supportlib/vendor-copy/libuv/src/uv-data-getter-setters.c +119 -0
  457. data/src/cxx_supportlib/vendor-copy/libuv/tsansupp.txt +2 -0
  458. data/src/cxx_supportlib/{ServerKit/llhttp_api.c → vendor-copy/llhttp/api.c} +30 -23
  459. data/src/cxx_supportlib/{ServerKit → vendor-copy/llhttp}/llhttp.c +1756 -1645
  460. data/src/cxx_supportlib/{ServerKit → vendor-copy/llhttp}/llhttp.h +35 -13
  461. data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/classification.hpp +19 -0
  462. data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/formatter.hpp +1 -1
  463. data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/trim_all.hpp +0 -2
  464. data/src/cxx_supportlib/vendor-modified/boost/assert.hpp +20 -13
  465. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_x86.hpp +2 -2
  466. data/src/cxx_supportlib/vendor-modified/boost/atomic/thread_pause.hpp +4 -0
  467. data/src/cxx_supportlib/vendor-modified/boost/bind/mem_fn.hpp +1 -1
  468. data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/debug.hpp +4 -0
  469. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx03.hpp +1 -1
  470. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx11.hpp +1 -1
  471. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx14.hpp +1 -1
  472. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx17.hpp +1 -1
  473. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx20.hpp +1 -1
  474. data/src/cxx_supportlib/vendor-modified/boost/config/assert_cxx23.hpp +1 -1
  475. data/src/cxx_supportlib/vendor-modified/boost/config/auto_link.hpp +6 -1
  476. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/clang_version.hpp +10 -1
  477. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/visualc.hpp +5 -3
  478. data/src/cxx_supportlib/vendor-modified/boost/config/detail/cxx_composite.hpp +1 -1
  479. data/src/cxx_supportlib/vendor-modified/boost/config/workaround.hpp +5 -0
  480. data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +57 -53
  481. data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +10 -10
  482. data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +34 -2
  483. data/src/cxx_supportlib/vendor-modified/boost/container/container_fwd.hpp +14 -2
  484. data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +176 -2287
  485. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool.hpp +13 -9
  486. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +186 -70
  487. data/src/cxx_supportlib/vendor-modified/boost/container/detail/algorithm.hpp +2 -2
  488. data/src/cxx_supportlib/vendor-modified/boost/container/detail/aligned_allocation.hpp +149 -0
  489. data/src/cxx_supportlib/vendor-modified/boost/container/detail/alloc_helpers.hpp +35 -0
  490. data/src/cxx_supportlib/vendor-modified/boost/container/detail/alloc_lib.h +1 -0
  491. data/src/cxx_supportlib/vendor-modified/boost/container/detail/bit_utilities.hpp +133 -0
  492. data/src/cxx_supportlib/vendor-modified/boost/container/detail/compare_functors.hpp +18 -3
  493. data/src/cxx_supportlib/vendor-modified/boost/container/detail/config_begin.hpp +5 -0
  494. data/src/cxx_supportlib/vendor-modified/boost/container/detail/config_end.hpp +4 -0
  495. data/src/cxx_supportlib/vendor-modified/boost/container/detail/container_rebind.hpp +1 -1
  496. data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +20 -10
  497. data/src/cxx_supportlib/vendor-modified/boost/container/detail/deque_impl.hpp +2744 -0
  498. data/src/cxx_supportlib/vendor-modified/boost/container/detail/dispatch_uses_allocator.hpp +202 -104
  499. data/src/cxx_supportlib/vendor-modified/boost/container/detail/dlmalloc.hpp +5 -4
  500. data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +161 -85
  501. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_constructible.hpp +180 -0
  502. data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterators.hpp +3 -2
  503. data/src/cxx_supportlib/vendor-modified/boost/container/detail/math_functions.hpp +12 -0
  504. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mpl.hpp +16 -0
  505. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mutex.hpp +1 -1
  506. data/src/cxx_supportlib/vendor-modified/boost/container/detail/next_capacity.hpp +9 -1
  507. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool.hpp +18 -14
  508. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool_impl.hpp +256 -41
  509. data/src/cxx_supportlib/vendor-modified/boost/container/detail/operator_new_helpers.hpp +75 -24
  510. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +1 -56
  511. data/src/cxx_supportlib/vendor-modified/boost/container/detail/placement_new.hpp +16 -3
  512. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pool_common_alloc.hpp +1 -7
  513. data/src/cxx_supportlib/vendor-modified/boost/container/detail/range_utils.hpp +196 -0
  514. data/src/cxx_supportlib/vendor-modified/boost/container/detail/std_fwd.hpp +33 -1
  515. data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +124 -69
  516. data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +109 -7
  517. data/src/cxx_supportlib/vendor-modified/boost/container/devector.hpp +168 -162
  518. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/nest.hpp +2978 -0
  519. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/pmr/nest.hpp +45 -0
  520. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_all_of.hpp +43 -0
  521. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_any_of.hpp +42 -0
  522. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_copy.hpp +229 -0
  523. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_copy_if.hpp +270 -0
  524. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_copy_n.hpp +308 -0
  525. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_count.hpp +101 -0
  526. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_count_if.hpp +100 -0
  527. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_equal.hpp +268 -0
  528. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_fill.hpp +101 -0
  529. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_fill_n.hpp +171 -0
  530. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find.hpp +110 -0
  531. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find_if.hpp +110 -0
  532. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find_if_not.hpp +43 -0
  533. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find_last.hpp +179 -0
  534. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find_last_if.hpp +179 -0
  535. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_find_last_if_not.hpp +43 -0
  536. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_for_each.hpp +92 -0
  537. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_generate.hpp +90 -0
  538. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_generate_n.hpp +162 -0
  539. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_is_partitioned.hpp +46 -0
  540. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_is_sorted.hpp +49 -0
  541. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_is_sorted_until.hpp +169 -0
  542. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_iterator_traits.hpp +382 -0
  543. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_merge.hpp +428 -0
  544. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_mismatch.hpp +350 -0
  545. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_none_of.hpp +98 -0
  546. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_partition.hpp +296 -0
  547. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_partition_copy.hpp +105 -0
  548. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_partition_point.hpp +116 -0
  549. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_remove.hpp +57 -0
  550. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_remove_copy.hpp +207 -0
  551. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_remove_copy_if.hpp +223 -0
  552. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_remove_if.hpp +57 -0
  553. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_replace.hpp +90 -0
  554. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_replace_if.hpp +90 -0
  555. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_reverse.hpp +245 -0
  556. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_reverse_copy.hpp +229 -0
  557. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_search.hpp +211 -0
  558. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_search_n.hpp +476 -0
  559. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_set_difference.hpp +300 -0
  560. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_set_intersection.hpp +287 -0
  561. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_set_symmetric_difference.hpp +306 -0
  562. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_set_union.hpp +294 -0
  563. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_stable_partition.hpp +153 -0
  564. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_swap_ranges.hpp +92 -0
  565. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/segmented_transform.hpp +93 -0
  566. data/src/cxx_supportlib/vendor-modified/boost/container/experimental/wrapped_iterator.hpp +142 -0
  567. data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +642 -417
  568. data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +141 -30
  569. data/src/cxx_supportlib/vendor-modified/boost/container/hub.hpp +2426 -0
  570. data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +65 -57
  571. data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +247 -68
  572. data/src/cxx_supportlib/vendor-modified/boost/container/new_allocator.hpp +7 -0
  573. data/src/cxx_supportlib/vendor-modified/boost/container/node_allocator.hpp +39 -33
  574. data/src/cxx_supportlib/vendor-modified/boost/container/options.hpp +156 -23
  575. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/global_resource.hpp +3 -3
  576. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/hub.hpp +43 -0
  577. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/memory_resource.hpp +5 -3
  578. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/monotonic_buffer_resource.hpp +1 -0
  579. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/polymorphic_allocator.hpp +1 -1
  580. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/resource_adaptor.hpp +4 -0
  581. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/segtor.hpp +45 -0
  582. data/src/cxx_supportlib/vendor-modified/boost/container/scoped_allocator.hpp +5 -4
  583. data/src/cxx_supportlib/vendor-modified/boost/container/segtor.hpp +905 -0
  584. data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +148 -35
  585. data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +59 -52
  586. data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +632 -5
  587. data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +66 -60
  588. data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +46 -1
  589. data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +612 -317
  590. data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator.hpp +54 -111
  591. data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator_construction.hpp +100 -0
  592. data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator_fwd.hpp +1 -3
  593. data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +233 -116
  594. data/src/cxx_supportlib/vendor-modified/boost/container_hash/hash.hpp +5 -1
  595. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +17 -10
  596. data/src/cxx_supportlib/vendor-modified/boost/date_time/period.hpp +1 -3
  597. data/src/cxx_supportlib/vendor-modified/boost/describe/detail/config.hpp +16 -0
  598. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/encoder.hpp +114 -0
  599. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/error_info_impl.hpp +4 -0
  600. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/requires_cxx11.hpp +1 -1
  601. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/type_info.hpp +211 -1
  602. data/src/cxx_supportlib/vendor-modified/boost/exception/diagnostic_information.hpp +59 -0
  603. data/src/cxx_supportlib/vendor-modified/boost/exception/exception.hpp +6 -0
  604. data/src/cxx_supportlib/vendor-modified/boost/exception/info.hpp +34 -0
  605. data/src/cxx_supportlib/vendor-modified/boost/intrusive/avltree.hpp +0 -1
  606. data/src/cxx_supportlib/vendor-modified/boost/intrusive/bstree.hpp +12 -3
  607. data/src/cxx_supportlib/vendor-modified/boost/intrusive/derivation_value_traits.hpp +1 -1
  608. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/ebo_functor_holder.hpp +29 -174
  609. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/generic_hook.hpp +18 -2
  610. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/key_nodeptr_comp.hpp +0 -1
  611. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/workaround.hpp +4 -5
  612. data/src/cxx_supportlib/vendor-modified/boost/intrusive/hashtable.hpp +20 -11
  613. data/src/cxx_supportlib/vendor-modified/boost/intrusive/list.hpp +42 -14
  614. data/src/cxx_supportlib/vendor-modified/boost/intrusive/slist.hpp +58 -22
  615. data/src/cxx_supportlib/vendor-modified/boost/intrusive/unordered_set.hpp +3 -1
  616. data/src/cxx_supportlib/vendor-modified/boost/iterator/advance.hpp +5 -1
  617. data/src/cxx_supportlib/vendor-modified/boost/iterator/distance.hpp +8 -2
  618. data/src/cxx_supportlib/vendor-modified/boost/iterator/is_iterator.hpp +9 -0
  619. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/bad_lexical_cast.hpp +11 -1
  620. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/buffer_view.hpp +9 -1
  621. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/config.hpp +22 -0
  622. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical.hpp +15 -7
  623. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +23 -11
  624. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_numeric.hpp +11 -1
  625. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/inf_nan.hpp +9 -1
  626. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/is_character.hpp +11 -2
  627. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_basic_unlockedbuf.hpp +10 -1
  628. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_char_constants.hpp +8 -1
  629. data/src/cxx_supportlib/vendor-modified/boost/{detail → lexical_cast/detail}/lcast_precision.hpp +13 -1
  630. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_unsigned_converters.hpp +11 -1
  631. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/widest_char.hpp +10 -2
  632. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/try_lexical_convert.hpp +15 -2
  633. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast.hpp +11 -1
  634. data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/pthread/once_atomic.cpp +1 -1
  635. data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/pthread/thread.cpp +48 -46
  636. data/src/cxx_supportlib/vendor-modified/boost/move/detail/meta_utils.hpp +23 -0
  637. data/src/cxx_supportlib/vendor-modified/boost/move/detail/move_helpers.hpp +24 -24
  638. data/src/cxx_supportlib/vendor-modified/boost/move/detail/nsec_clock.hpp +12 -4
  639. data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +76 -0
  640. data/src/cxx_supportlib/vendor-modified/boost/move/detail/workaround.hpp +1 -1
  641. data/src/cxx_supportlib/vendor-modified/boost/move/traits.hpp +11 -0
  642. data/src/cxx_supportlib/vendor-modified/boost/mp11/algorithm.hpp +58 -37
  643. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_copy_if.hpp +1 -2
  644. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_map_find.hpp +17 -9
  645. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_remove_if.hpp +1 -2
  646. data/src/cxx_supportlib/vendor-modified/boost/mp11/integer_sequence.hpp +6 -0
  647. data/src/cxx_supportlib/vendor-modified/boost/mp11/version.hpp +1 -1
  648. data/src/cxx_supportlib/vendor-modified/boost/none_t.hpp +6 -1
  649. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_common_defs.hpp +188 -0
  650. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_factory_support.hpp +0 -6
  651. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_hash.hpp +1 -1
  652. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_nonmember_interface.hpp +117 -0
  653. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_reference_spec.hpp +108 -83
  654. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_relops.hpp +39 -39
  655. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_select_implementation.hpp +37 -0
  656. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_swap.hpp +1 -1
  657. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_trivially_copyable_base.hpp +8 -8
  658. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/union_optional.hpp +724 -0
  659. data/src/cxx_supportlib/vendor-modified/boost/optional/optional.hpp +93 -220
  660. data/src/cxx_supportlib/vendor-modified/boost/optional/optional_fwd.hpp +14 -4
  661. data/src/cxx_supportlib/vendor-modified/boost/optional/optional_io.hpp +1 -1
  662. data/src/cxx_supportlib/vendor-modified/boost/random/binomial_distribution.hpp +1 -1
  663. data/src/cxx_supportlib/vendor-modified/boost/random/uniform_int_distribution.hpp +1 -1
  664. data/src/cxx_supportlib/vendor-modified/boost/rational.hpp +1 -1
  665. data/src/cxx_supportlib/vendor-modified/boost/static_assert.hpp +4 -6
  666. data/src/cxx_supportlib/vendor-modified/boost/system/api_config.hpp +1 -1
  667. data/src/cxx_supportlib/vendor-modified/boost/system/detail/config.hpp +16 -0
  668. data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_category.hpp +13 -13
  669. data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_category_impl.hpp +5 -5
  670. data/src/cxx_supportlib/vendor-modified/boost/thread/concurrent_queues/detail/sync_deque_base.hpp +3 -2
  671. data/src/cxx_supportlib/vendor-modified/boost/thread/concurrent_queues/detail/sync_queue_base.hpp +3 -2
  672. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/thread.hpp +2 -1
  673. data/src/cxx_supportlib/vendor-modified/boost/thread/experimental/parallel/v2/task_region.hpp +1 -1
  674. data/src/cxx_supportlib/vendor-modified/boost/thread/future.hpp +30 -28
  675. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/once.hpp +6 -3
  676. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/once_atomic.hpp +5 -1
  677. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/pthread_helpers.hpp +1 -0
  678. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/shared_mutex.hpp +16 -16
  679. data/src/cxx_supportlib/vendor-modified/boost/thread/v2/shared_mutex.hpp +26 -26
  680. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map.hpp +196 -6
  681. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_set.hpp +191 -6
  682. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_node_map.hpp +196 -5
  683. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_node_set.hpp +192 -5
  684. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/concurrent_table.hpp +3 -3
  685. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/core.hpp +2 -2
  686. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/table.hpp +3 -3
  687. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/implementation.hpp +52 -16
  688. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/ranges_support.hpp +104 -0
  689. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/type_traits.hpp +1 -14
  690. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/unordered_printers.hpp +10 -4
  691. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map.hpp +121 -3
  692. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set.hpp +118 -3
  693. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map.hpp +338 -1
  694. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map.hpp +121 -3
  695. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set.hpp +118 -3
  696. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set.hpp +333 -1
  697. data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
  698. data/src/cxx_supportlib/vendor-modified/jsoncpp/json-forwards.h +276 -143
  699. data/src/cxx_supportlib/vendor-modified/jsoncpp/json.h +1262 -771
  700. data/src/cxx_supportlib/vendor-modified/jsoncpp/jsoncpp.cpp +1704 -1586
  701. data/src/cxx_supportlib/vendor-modified/libev/Changes +109 -0
  702. data/src/cxx_supportlib/vendor-modified/libev/Makefile.am +2 -1
  703. data/src/cxx_supportlib/vendor-modified/libev/Makefile.in +47 -33
  704. data/src/cxx_supportlib/vendor-modified/libev/README +2 -1
  705. data/src/cxx_supportlib/vendor-modified/libev/aclocal.m4 +1653 -1224
  706. data/src/cxx_supportlib/vendor-modified/libev/config.guess +376 -316
  707. data/src/cxx_supportlib/vendor-modified/libev/config.h.in +13 -2
  708. data/src/cxx_supportlib/vendor-modified/libev/config.sub +156 -154
  709. data/src/cxx_supportlib/vendor-modified/libev/configure +1431 -940
  710. data/src/cxx_supportlib/vendor-modified/libev/configure.ac +3 -3
  711. data/src/cxx_supportlib/vendor-modified/libev/depcomp +5 -5
  712. data/src/cxx_supportlib/vendor-modified/libev/ev++.h +109 -107
  713. data/src/cxx_supportlib/vendor-modified/libev/ev.c +807 -319
  714. data/src/cxx_supportlib/vendor-modified/libev/ev.h +111 -105
  715. data/src/cxx_supportlib/vendor-modified/libev/ev_epoll.c +42 -29
  716. data/src/cxx_supportlib/vendor-modified/libev/ev_iouring.c +694 -0
  717. data/src/cxx_supportlib/vendor-modified/libev/ev_kqueue.c +15 -9
  718. data/src/cxx_supportlib/vendor-modified/libev/ev_linuxaio.c +620 -0
  719. data/src/cxx_supportlib/vendor-modified/libev/ev_poll.c +19 -14
  720. data/src/cxx_supportlib/vendor-modified/libev/ev_port.c +8 -5
  721. data/src/cxx_supportlib/vendor-modified/libev/ev_select.c +6 -6
  722. data/src/cxx_supportlib/vendor-modified/libev/ev_vars.h +48 -3
  723. data/src/cxx_supportlib/vendor-modified/libev/ev_win32.c +2 -2
  724. data/src/cxx_supportlib/vendor-modified/libev/ev_wrap.h +72 -0
  725. data/src/cxx_supportlib/vendor-modified/libev/install-sh +23 -13
  726. data/src/cxx_supportlib/vendor-modified/libev/libev.m4 +6 -1
  727. data/src/cxx_supportlib/vendor-modified/libev/ltmain.sh +3581 -1993
  728. data/src/cxx_supportlib/vendor-modified/libev/missing +8 -8
  729. data/src/cxx_supportlib/vendor-modified/libev/mkinstalldirs +3 -3
  730. data/src/cxx_supportlib/vendor-modified/modp_b64_strict_aliasing.cpp +1 -1
  731. data/src/helper-scripts/backtrace-sanitizer.rb +1 -1
  732. data/src/helper-scripts/crash-watch.rb +1 -1
  733. data/src/helper-scripts/download_binaries/extconf.rb +1 -1
  734. data/src/helper-scripts/meteor-loader.rb +1 -1
  735. data/src/helper-scripts/node-loader.js +1 -1
  736. data/src/helper-scripts/prespawn +1 -1
  737. data/src/helper-scripts/rack-loader.rb +1 -1
  738. data/src/helper-scripts/rack-preloader.rb +1 -1
  739. data/src/helper-scripts/wsgi-loader.py +1 -1
  740. data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +1 -1
  741. data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c.cxxcodebuilder +1 -1
  742. data/src/nginx_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.c +1 -1
  743. data/src/nginx_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.c.cxxcodebuilder +1 -1
  744. data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +1 -1
  745. data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c.cxxcodebuilder +1 -1
  746. data/src/nginx_module/Configuration.c +1 -1
  747. data/src/nginx_module/Configuration.h +1 -1
  748. data/src/nginx_module/ContentHandler.c +36 -1
  749. data/src/nginx_module/ContentHandler.h +1 -1
  750. data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c +1 -1
  751. data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c.cxxcodebuilder +1 -1
  752. data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c +1 -1
  753. data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c.cxxcodebuilder +1 -1
  754. data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c +1 -1
  755. data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c.cxxcodebuilder +1 -1
  756. data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c +1 -1
  757. data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c.cxxcodebuilder +1 -1
  758. data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h +1 -1
  759. data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h.cxxcodebuilder +1 -1
  760. data/src/nginx_module/MainConfig/AutoGeneratedCreateFunction.c +1 -1
  761. data/src/nginx_module/MainConfig/AutoGeneratedCreateFunction.c.cxxcodebuilder +1 -1
  762. data/src/nginx_module/MainConfig/AutoGeneratedManifestGeneration.c +1 -1
  763. data/src/nginx_module/MainConfig/AutoGeneratedManifestGeneration.c.cxxcodebuilder +1 -1
  764. data/src/nginx_module/MainConfig/AutoGeneratedStruct.h +1 -1
  765. data/src/nginx_module/MainConfig/AutoGeneratedStruct.h.cxxcodebuilder +1 -1
  766. data/src/nginx_module/StaticContentHandler.c +1 -1
  767. data/src/nginx_module/StaticContentHandler.h +1 -1
  768. data/src/nginx_module/ngx_http_passenger_module.c +1 -1
  769. data/src/nginx_module/ngx_http_passenger_module.h +1 -1
  770. data/src/nodejs_supportlib/phusion_passenger/line_reader.js +1 -1
  771. data/src/ruby_native_extension/extconf.rb +1 -1
  772. data/src/ruby_native_extension/passenger_native_support.c +1 -1
  773. data/src/ruby_supportlib/phusion_passenger/abstract_installer.rb +1 -1
  774. data/src/ruby_supportlib/phusion_passenger/admin_tools/instance.rb +1 -1
  775. data/src/ruby_supportlib/phusion_passenger/admin_tools/instance_registry.rb +1 -1
  776. data/src/ruby_supportlib/phusion_passenger/admin_tools/memory_stats.rb +2 -12
  777. data/src/ruby_supportlib/phusion_passenger/admin_tools.rb +1 -1
  778. data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +1 -1
  779. data/src/ruby_supportlib/phusion_passenger/apache2/config_utils.rb +1 -1
  780. data/src/ruby_supportlib/phusion_passenger/common_library.rb +14 -16
  781. data/src/ruby_supportlib/phusion_passenger/config/about_command.rb +1 -1
  782. data/src/ruby_supportlib/phusion_passenger/config/agent_compiler.rb +1 -1
  783. data/src/ruby_supportlib/phusion_passenger/config/api_call_command.rb +1 -1
  784. data/src/ruby_supportlib/phusion_passenger/config/build_native_support_command.rb +1 -1
  785. data/src/ruby_supportlib/phusion_passenger/config/command.rb +1 -1
  786. data/src/ruby_supportlib/phusion_passenger/config/compile_agent_command.rb +1 -1
  787. data/src/ruby_supportlib/phusion_passenger/config/compile_nginx_engine_command.rb +1 -1
  788. data/src/ruby_supportlib/phusion_passenger/config/detach_process_command.rb +1 -1
  789. data/src/ruby_supportlib/phusion_passenger/config/download_agent_command.rb +1 -1
  790. data/src/ruby_supportlib/phusion_passenger/config/download_nginx_engine_command.rb +1 -1
  791. data/src/ruby_supportlib/phusion_passenger/config/install_agent_command.rb +1 -1
  792. data/src/ruby_supportlib/phusion_passenger/config/install_standalone_runtime_command.rb +1 -1
  793. data/src/ruby_supportlib/phusion_passenger/config/installation_utils.rb +1 -1
  794. data/src/ruby_supportlib/phusion_passenger/config/list_instances_command.rb +1 -1
  795. data/src/ruby_supportlib/phusion_passenger/config/main.rb +1 -1
  796. data/src/ruby_supportlib/phusion_passenger/config/nginx_engine_compiler.rb +3 -2
  797. data/src/ruby_supportlib/phusion_passenger/config/reopen_logs_command.rb +6 -1
  798. data/src/ruby_supportlib/phusion_passenger/config/restart_app_command.rb +1 -1
  799. data/src/ruby_supportlib/phusion_passenger/config/system_metrics_command.rb +1 -1
  800. data/src/ruby_supportlib/phusion_passenger/config/system_properties_command.rb +1 -1
  801. data/src/ruby_supportlib/phusion_passenger/config/utils.rb +1 -1
  802. data/src/ruby_supportlib/phusion_passenger/config/validate_install_command.rb +1 -1
  803. data/src/ruby_supportlib/phusion_passenger/console_text_template.rb +1 -1
  804. data/src/ruby_supportlib/phusion_passenger/constants.rb +1 -1
  805. data/src/ruby_supportlib/phusion_passenger/debug_logging.rb +1 -1
  806. data/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb +1 -1
  807. data/src/ruby_supportlib/phusion_passenger/message_channel.rb +1 -1
  808. data/src/ruby_supportlib/phusion_passenger/message_client.rb +1 -1
  809. data/src/ruby_supportlib/phusion_passenger/native_support.rb +1 -1
  810. data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +1 -1
  811. data/src/ruby_supportlib/phusion_passenger/packaging.rb +4 -3
  812. data/src/ruby_supportlib/phusion_passenger/platform_info/apache.rb +1 -1
  813. data/src/ruby_supportlib/phusion_passenger/platform_info/apache_detector.rb +1 -1
  814. data/src/ruby_supportlib/phusion_passenger/platform_info/binary_compatibility.rb +1 -1
  815. data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +195 -11
  816. data/src/ruby_supportlib/phusion_passenger/platform_info/crypto.rb +1 -1
  817. data/src/ruby_supportlib/phusion_passenger/platform_info/curl.rb +1 -1
  818. data/src/ruby_supportlib/phusion_passenger/platform_info/cxx_portability.rb +1 -1
  819. data/src/ruby_supportlib/phusion_passenger/platform_info/linux.rb +1 -1
  820. data/src/ruby_supportlib/phusion_passenger/platform_info/networking.rb +1 -1
  821. data/src/ruby_supportlib/phusion_passenger/platform_info/openssl.rb +1 -1
  822. data/src/ruby_supportlib/phusion_passenger/platform_info/operating_system.rb +1 -1
  823. data/src/ruby_supportlib/phusion_passenger/platform_info/pcre.rb +1 -1
  824. data/src/ruby_supportlib/phusion_passenger/platform_info/ruby.rb +1 -1
  825. data/src/ruby_supportlib/phusion_passenger/platform_info/zlib.rb +1 -1
  826. data/src/ruby_supportlib/phusion_passenger/platform_info.rb +1 -1
  827. data/src/ruby_supportlib/phusion_passenger/plugin.rb +1 -1
  828. data/src/ruby_supportlib/phusion_passenger/preloader_shared_helpers.rb +1 -1
  829. data/src/ruby_supportlib/phusion_passenger/public_api.rb +1 -1
  830. data/src/ruby_supportlib/phusion_passenger/rack/handler.rb +1 -1
  831. data/src/ruby_supportlib/phusion_passenger/rack/out_of_band_gc.rb +1 -1
  832. data/src/ruby_supportlib/phusion_passenger/rack/thread_handler_extension.rb +1 -1
  833. data/src/ruby_supportlib/phusion_passenger/rack_handler.rb +1 -1
  834. data/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb +2 -7
  835. data/src/ruby_supportlib/phusion_passenger/request_handler.rb +1 -1
  836. data/src/ruby_supportlib/phusion_passenger/ruby_core_enhancements.rb +1 -1
  837. data/src/ruby_supportlib/phusion_passenger/ruby_core_io_enhancements.rb +1 -1
  838. data/src/ruby_supportlib/phusion_passenger/simple_benchmarking.rb +1 -1
  839. data/src/ruby_supportlib/phusion_passenger/standalone/app_finder.rb +1 -1
  840. data/src/ruby_supportlib/phusion_passenger/standalone/command.rb +1 -1
  841. data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +1 -1
  842. data/src/ruby_supportlib/phusion_passenger/standalone/config_utils.rb +1 -1
  843. data/src/ruby_supportlib/phusion_passenger/standalone/control_utils.rb +1 -1
  844. data/src/ruby_supportlib/phusion_passenger/standalone/main.rb +1 -1
  845. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +2 -2
  846. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/nginx_engine.rb +4 -8
  847. data/src/ruby_supportlib/phusion_passenger/standalone/start_command.rb +1 -1
  848. data/src/ruby_supportlib/phusion_passenger/standalone/status_command.rb +1 -1
  849. data/src/ruby_supportlib/phusion_passenger/standalone/stop_command.rb +1 -1
  850. data/src/ruby_supportlib/phusion_passenger/standalone/version_command.rb +1 -1
  851. data/src/ruby_supportlib/phusion_passenger/utils/ansi_colors.rb +1 -1
  852. data/src/ruby_supportlib/phusion_passenger/utils/download.rb +1 -1
  853. data/src/ruby_supportlib/phusion_passenger/utils/file_system_watcher.rb +1 -1
  854. data/src/ruby_supportlib/phusion_passenger/utils/hosts_file_parser.rb +1 -1
  855. data/src/ruby_supportlib/phusion_passenger/utils/json.rb +25 -2
  856. data/src/ruby_supportlib/phusion_passenger/utils/lock.rb +1 -1
  857. data/src/ruby_supportlib/phusion_passenger/utils/native_support_utils.rb +1 -1
  858. data/src/ruby_supportlib/phusion_passenger/utils/progress_bar.rb +1 -1
  859. data/src/ruby_supportlib/phusion_passenger/utils/strscan.rb +1 -1
  860. data/src/ruby_supportlib/phusion_passenger/utils/terminal_choice_menu.rb +1 -1
  861. data/src/ruby_supportlib/phusion_passenger/utils/unseekable_socket.rb +3 -13
  862. data/src/ruby_supportlib/phusion_passenger/utils.rb +1 -1
  863. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/app.rb +1 -1
  864. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/base.rb +1 -1
  865. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +1 -1
  866. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/lldb_controller.rb +1 -1
  867. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/utils.rb +1 -1
  868. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/version.rb +1 -1
  869. data/src/ruby_supportlib/phusion_passenger/vendor/daemon_controller/lock_file.rb +8 -6
  870. data/src/ruby_supportlib/phusion_passenger/vendor/daemon_controller/spawn.rb +4 -3
  871. data/src/ruby_supportlib/phusion_passenger/vendor/daemon_controller/version.rb +6 -4
  872. data/src/ruby_supportlib/phusion_passenger/vendor/daemon_controller.rb +406 -579
  873. data/src/ruby_supportlib/phusion_passenger.rb +8 -8
  874. data/src/schema_printer/SchemaPrinterMain.cpp +1 -1
  875. data/src/schema_printer/SchemaPrinterMain.cpp.cxxcodebuilder +1 -1
  876. metadata +140 -38
  877. data/doc/DeveloperQuickstart.md +0 -70
  878. data/src/README.md +0 -7
  879. data/src/cxx_supportlib/vendor-copy/libuv/README.md +0 -245
  880. data/src/cxx_supportlib/vendor-copy/libuv/checksparse.sh +0 -234
  881. data/src/cxx_supportlib/vendor-copy/libuv/common.gypi +0 -210
  882. data/src/cxx_supportlib/vendor-copy/libuv/gyp_uv.py +0 -93
  883. data/src/cxx_supportlib/vendor-copy/libuv/include/android-ifaddrs.h +0 -54
  884. data/src/cxx_supportlib/vendor-copy/libuv/include/pthread-fixes.h +0 -72
  885. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/android-ifaddrs.c +0 -703
  886. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/atomic-ops.h +0 -77
  887. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/linux-core.c +0 -899
  888. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/linux-inotify.c +0 -285
  889. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/linux-syscalls.c +0 -471
  890. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/linux-syscalls.h +0 -158
  891. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/pthread-fixes.c +0 -104
  892. data/src/cxx_supportlib/vendor-copy/libuv/src/unix/spinlock.h +0 -53
  893. data/src/cxx_supportlib/vendor-copy/libuv/uv.gyp +0 -508
  894. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_utility.hpp +0 -41
  895. /data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-aix.h → uv/aix.h} +0 -0
  896. /data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-bsd.h → uv/bsd.h} +0 -0
  897. /data/src/cxx_supportlib/vendor-copy/libuv/include/{uv-sunos.h → uv/sunos.h} +0 -0
  898. /data/src/cxx_supportlib/{ServerKit/llhttp_http.c → vendor-copy/llhttp/http.c} +0 -0
@@ -49,6 +49,8 @@
49
49
  #include <initializer_list>
50
50
  #endif
51
51
 
52
+ #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
53
+
52
54
  #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
53
55
  #define BOOST_CONTAINER_STD_PAIR_IS_MOVABLE
54
56
  #endif
@@ -64,49 +66,39 @@
64
66
  #pragma GCC optimize("no-strict-aliasing")
65
67
  #endif
66
68
 
69
+ #endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
70
+
67
71
  namespace boost {
68
- namespace container {
72
+ namespace container {
69
73
 
70
74
  #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
71
75
 
72
- template <class Key, class T, class Compare, class AllocatorOrContainer>
73
- class flat_multimap;
74
-
75
- namespace dtl{
76
+ template <class Key, class T, class Compare, class AllocatorOrContainer>
77
+ class flat_multimap;
76
78
 
77
79
  #if defined(BOOST_CONTAINER_STD_PAIR_IS_MOVABLE)
78
- template<class D, class S>
79
- BOOST_CONTAINER_FORCEINLINE static D &force(S &s)
80
- { return s; }
81
80
 
82
- template<class D, class S>
83
- BOOST_CONTAINER_FORCEINLINE static const D &force(const S &s)
84
- { return s; }
81
+ #define BOOST_CONTAINER_FORCE(DEST_TYPE, SRC) (SRC)
82
+ #define BOOST_CONTAINER_FORCECOPY(DEST_TYPE, SRC) (SRC)
85
83
 
86
- template<class D>
87
- BOOST_CONTAINER_FORCEINLINE static D force_copy(D s)
88
- { return s; }
84
+ #else
89
85
 
90
- #else //!BOOST_CONTAINER_DOXYGEN_INVOKED
86
+ namespace forceimpl{
91
87
 
92
- template<class D, class S>
93
- BOOST_CONTAINER_FORCEINLINE static D &force(S &s)
94
- { return *move_detail::launder_cast<D*>(&s); }
88
+ template<class T>
89
+ BOOST_CONTAINER_FORCEINLINE static const void* voidptr(const T& t)
90
+ { return &t; }
95
91
 
96
- template<class D, class S>
97
- BOOST_CONTAINER_FORCEINLINE static const D &force(const S &s)
98
- { return *move_detail::launder_cast<const D*>(&s); }
92
+ } //namespace forceimpl{
99
93
 
100
- template<class D, class S>
101
- BOOST_CONTAINER_FORCEINLINE static D force_copy(const S &s)
102
- {
103
- const D *const vp = move_detail::launder_cast<const D *>(&s);
104
- D ret_val(*vp);
105
- return ret_val;
106
- }
107
- #endif //BOOST_CONTAINER_DOXYGEN_INVOKED
94
+ #define BOOST_CONTAINER_FORCE(DEST_TYPE, SRC) \
95
+ (*::boost::move_detail::launder_cast<DEST_TYPE*>(&(SRC)))
96
+
97
+ #define BOOST_CONTAINER_FORCECOPY(DEST_TYPE, SRC) \
98
+ static_cast<DEST_TYPE>(*::boost::move_detail::launder_cast<const DEST_TYPE*>( \
99
+ forceimpl::voidptr(SRC)))
108
100
 
109
- } //namespace dtl{
101
+ #endif //BOOST_CONTAINER_STD_PAIR_IS_MOVABLE
110
102
 
111
103
  #endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
112
104
 
@@ -225,7 +217,7 @@ class flat_map
225
217
  typedef std::pair<Key, T> value_type;
226
218
  typedef typename BOOST_CONTAINER_IMPDEF(tree_t::sequence_type) sequence_type;
227
219
  typedef typename sequence_type::allocator_type allocator_type;
228
- typedef ::boost::container::allocator_traits<allocator_type> allocator_traits_type;
220
+ typedef boost::container::allocator_traits<allocator_type> allocator_traits_type;
229
221
  typedef typename sequence_type::pointer pointer;
230
222
  typedef typename sequence_type::const_pointer const_pointer;
231
223
  typedef typename sequence_type::reference reference;
@@ -244,6 +236,14 @@ class flat_map
244
236
  //AllocatorOrContainer::value_type must be std::pair<Key, T>
245
237
  BOOST_CONTAINER_STATIC_ASSERT((dtl::is_same<std::pair<Key, T>, value_type>::value));
246
238
 
239
+ #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
240
+ private:
241
+ typedef std::pair<iterator, bool> iterator_bool_t;
242
+ typedef std::pair<iterator, iterator> iterator_iterator_t;
243
+ typedef std::pair<const_iterator, const_iterator> const_iterator_const_iterator_t;
244
+ public:
245
+ #endif
246
+
247
247
  //////////////////////////////////////////////
248
248
  //
249
249
  // construct/copy/destroy
@@ -262,7 +262,7 @@ class flat_map
262
262
  //!
263
263
  //! <b>Complexity</b>: Constant.
264
264
  inline explicit flat_map(const allocator_type& a)
265
- : m_flat_tree(dtl::force<const impl_allocator_type>(a))
265
+ : m_flat_tree(BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
266
266
  {}
267
267
 
268
268
  //! <b>Effects</b>: Constructs an empty flat_map using the specified
@@ -278,7 +278,7 @@ class flat_map
278
278
  //!
279
279
  //! <b>Complexity</b>: Constant.
280
280
  inline flat_map(const Compare& comp, const allocator_type& a)
281
- : m_flat_tree(comp, dtl::force<const impl_allocator_type>(a))
281
+ : m_flat_tree(comp, BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
282
282
  {}
283
283
 
284
284
  //! <b>Effects</b>: Constructs an empty flat_map and
@@ -298,7 +298,7 @@ class flat_map
298
298
  //! the predicate and otherwise N logN, where N is last - first.
299
299
  template <class InputIterator>
300
300
  inline flat_map(InputIterator first, InputIterator last, const allocator_type& a)
301
- : m_flat_tree(true, first, last, dtl::force<const impl_allocator_type>(a))
301
+ : m_flat_tree(true, first, last, BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
302
302
  {}
303
303
 
304
304
  //! <b>Effects</b>: Constructs an empty flat_map using the specified comparison object and
@@ -318,7 +318,7 @@ class flat_map
318
318
  //! the predicate and otherwise N logN, where N is last - first.
319
319
  template <class InputIterator>
320
320
  inline flat_map(InputIterator first, InputIterator last, const Compare& comp, const allocator_type& a)
321
- : m_flat_tree(true, first, last, comp, dtl::force<const impl_allocator_type>(a))
321
+ : m_flat_tree(true, first, last, comp, BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
322
322
  {}
323
323
 
324
324
  //! <b>Effects</b>: Constructs an empty flat_map
@@ -363,7 +363,7 @@ class flat_map
363
363
  template <class InputIterator>
364
364
  inline
365
365
  flat_map(ordered_unique_range_t, InputIterator first, InputIterator last, const Compare& comp, const allocator_type& a)
366
- : m_flat_tree(ordered_range, first, last, comp, dtl::force<const impl_allocator_type>(a))
366
+ : m_flat_tree(ordered_range, first, last, comp, BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
367
367
  {}
368
368
 
369
369
  //! <b>Effects</b>: Constructs an empty flat_map using the specified allocator and
@@ -389,8 +389,8 @@ class flat_map
389
389
  //! the predicate and otherwise N logN, where N is last - first.
390
390
  inline flat_map(std::initializer_list<value_type> il)
391
391
  : m_flat_tree( true
392
- , dtl::force<impl_initializer_list>(il).begin()
393
- , dtl::force<impl_initializer_list>(il).end())
392
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
393
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end())
394
394
  {}
395
395
 
396
396
  //! <b>Effects</b>: Constructs an empty flat_map using the specified
@@ -400,9 +400,9 @@ class flat_map
400
400
  //! the predicate and otherwise N logN, where N is last - first.
401
401
  inline flat_map(std::initializer_list<value_type> il, const allocator_type& a)
402
402
  : m_flat_tree( true
403
- , dtl::force<impl_initializer_list>(il).begin()
404
- , dtl::force<impl_initializer_list>(il).end()
405
- , dtl::force<const impl_allocator_type>(a))
403
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
404
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end()
405
+ , BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
406
406
  {}
407
407
 
408
408
  //! <b>Effects</b>: Constructs an empty flat_map using the specified comparison object and
@@ -412,8 +412,8 @@ class flat_map
412
412
  //! the predicate and otherwise N logN, where N is last - first.
413
413
  inline flat_map(std::initializer_list<value_type> il, const Compare& comp)
414
414
  : m_flat_tree(true
415
- , dtl::force<impl_initializer_list>(il).begin()
416
- , dtl::force<impl_initializer_list>(il).end()
415
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
416
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end()
417
417
  , comp)
418
418
  {}
419
419
 
@@ -424,10 +424,10 @@ class flat_map
424
424
  //! the predicate and otherwise N logN, where N is last - first.
425
425
  inline flat_map(std::initializer_list<value_type> il, const Compare& comp, const allocator_type& a)
426
426
  : m_flat_tree(true
427
- , dtl::force<impl_initializer_list>(il).begin()
428
- , dtl::force<impl_initializer_list>(il).end()
427
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
428
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end()
429
429
  , comp
430
- , dtl::force<const impl_allocator_type>(a))
430
+ , BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
431
431
  {}
432
432
 
433
433
  //! <b>Effects</b>: Constructs an empty flat_map using and
@@ -442,8 +442,8 @@ class flat_map
442
442
  //! <b>Note</b>: Non-standard extension.
443
443
  inline flat_map(ordered_unique_range_t, std::initializer_list<value_type> il)
444
444
  : m_flat_tree(ordered_unique_range
445
- , dtl::force<impl_initializer_list>(il).begin()
446
- , dtl::force<impl_initializer_list>(il).end())
445
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
446
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end())
447
447
  {}
448
448
 
449
449
  //! <b>Effects</b>: Constructs an empty flat_map using the specified comparison object and
@@ -458,8 +458,8 @@ class flat_map
458
458
  //! <b>Note</b>: Non-standard extension.
459
459
  inline flat_map(ordered_unique_range_t, std::initializer_list<value_type> il, const Compare& comp)
460
460
  : m_flat_tree(ordered_unique_range
461
- , dtl::force<impl_initializer_list>(il).begin()
462
- , dtl::force<impl_initializer_list>(il).end()
461
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
462
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end()
463
463
  , comp)
464
464
  {}
465
465
 
@@ -475,10 +475,10 @@ class flat_map
475
475
  //! <b>Note</b>: Non-standard extension.
476
476
  inline flat_map(ordered_unique_range_t, std::initializer_list<value_type> il, const Compare& comp, const allocator_type& a)
477
477
  : m_flat_tree( ordered_unique_range
478
- , dtl::force<impl_initializer_list>(il).begin()
479
- , dtl::force<impl_initializer_list>(il).end()
478
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
479
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end()
480
480
  , comp
481
- , dtl::force<const impl_allocator_type>(a))
481
+ , BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
482
482
  {}
483
483
  #endif
484
484
 
@@ -503,16 +503,16 @@ class flat_map
503
503
  //! <b>Effects</b>: Copy constructs a flat_map using the specified allocator.
504
504
  //!
505
505
  //! <b>Complexity</b>: Linear in x.size().
506
- inline flat_map(const flat_map& x, const allocator_type &a)
507
- : m_flat_tree(x.m_flat_tree, dtl::force<const impl_allocator_type>(a))
506
+ inline flat_map(const flat_map& x, const BOOST_CONTAINER_DOC1ST(allocator_type, typename dtl::type_identity<allocator_type>::type) &a)
507
+ : m_flat_tree(x.m_flat_tree, BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
508
508
  {}
509
509
 
510
510
  //! <b>Effects</b>: Move constructs a flat_map using the specified allocator.
511
511
  //! Constructs *this using x's resources.
512
512
  //!
513
513
  //! <b>Complexity</b>: Constant if x.get_allocator() == a, linear otherwise.
514
- inline flat_map(BOOST_RV_REF(flat_map) x, const allocator_type &a)
515
- : m_flat_tree(boost::move(x.m_flat_tree), dtl::force<const impl_allocator_type>(a))
514
+ inline flat_map(BOOST_RV_REF(flat_map) x, const BOOST_CONTAINER_DOC1ST(allocator_type, typename dtl::type_identity<allocator_type>::type) &a)
515
+ : m_flat_tree(boost::move(x.m_flat_tree), BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
516
516
  {}
517
517
 
518
518
  //! <b>Effects</b>: Makes *this a copy of x.
@@ -550,9 +550,9 @@ class flat_map
550
550
  //! was passed to the object's constructor.
551
551
  //!
552
552
  //! <b>Complexity</b>: Constant.
553
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
553
+ BOOST_CONTAINER_NODISCARD inline
554
554
  allocator_type get_allocator() const BOOST_NOEXCEPT_OR_NOTHROW
555
- { return dtl::force_copy<allocator_type>(m_flat_tree.get_allocator()); }
555
+ { return BOOST_CONTAINER_FORCECOPY(allocator_type, m_flat_tree.get_allocator()); }
556
556
 
557
557
  //! <b>Effects</b>: Returns a reference to the internal allocator.
558
558
  //!
@@ -561,11 +561,11 @@ class flat_map
561
561
  //! <b>Complexity</b>: Constant.
562
562
  //!
563
563
  //! <b>Note</b>: Non-standard extension.
564
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
564
+ BOOST_CONTAINER_NODISCARD inline
565
565
  get_stored_allocator_noconst_return_t get_stored_allocator() BOOST_NOEXCEPT_OR_NOTHROW
566
566
  {
567
567
  impl_get_stored_allocator_noconst_return_t r = m_flat_tree.get_stored_allocator();
568
- return dtl::force<stored_allocator_type>(r);
568
+ return BOOST_CONTAINER_FORCE(stored_allocator_type, r);
569
569
  }
570
570
 
571
571
  //! <b>Effects</b>: Returns a reference to the internal allocator.
@@ -575,11 +575,11 @@ class flat_map
575
575
  //! <b>Complexity</b>: Constant.
576
576
  //!
577
577
  //! <b>Note</b>: Non-standard extension.
578
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
578
+ BOOST_CONTAINER_NODISCARD inline
579
579
  get_stored_allocator_const_return_t get_stored_allocator() const BOOST_NOEXCEPT_OR_NOTHROW
580
580
  {
581
581
  impl_get_stored_allocator_const_return_t r = m_flat_tree.get_stored_allocator();
582
- return dtl::force<const stored_allocator_type>(r);
582
+ return BOOST_CONTAINER_FORCE(const stored_allocator_type, r);
583
583
  }
584
584
 
585
585
  //////////////////////////////////////////////
@@ -593,36 +593,36 @@ class flat_map
593
593
  //! <b>Throws</b>: Nothing.
594
594
  //!
595
595
  //! <b>Complexity</b>: Constant.
596
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
596
+ BOOST_CONTAINER_NODISCARD inline
597
597
  iterator begin() BOOST_NOEXCEPT_OR_NOTHROW
598
- { return dtl::force_copy<iterator>(m_flat_tree.begin()); }
598
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.begin()); }
599
599
 
600
600
  //! <b>Effects</b>: Returns a const_iterator to the first element contained in the container.
601
601
  //!
602
602
  //! <b>Throws</b>: Nothing.
603
603
  //!
604
604
  //! <b>Complexity</b>: Constant.
605
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
605
+ BOOST_CONTAINER_NODISCARD inline
606
606
  const_iterator begin() const BOOST_NOEXCEPT_OR_NOTHROW
607
- { return dtl::force_copy<const_iterator>(m_flat_tree.begin()); }
607
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.begin()); }
608
608
 
609
609
  //! <b>Effects</b>: Returns an iterator to the end of the container.
610
610
  //!
611
611
  //! <b>Throws</b>: Nothing.
612
612
  //!
613
613
  //! <b>Complexity</b>: Constant.
614
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
614
+ BOOST_CONTAINER_NODISCARD inline
615
615
  iterator end() BOOST_NOEXCEPT_OR_NOTHROW
616
- { return dtl::force_copy<iterator>(m_flat_tree.end()); }
616
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.end()); }
617
617
 
618
618
  //! <b>Effects</b>: Returns a const_iterator to the end of the container.
619
619
  //!
620
620
  //! <b>Throws</b>: Nothing.
621
621
  //!
622
622
  //! <b>Complexity</b>: Constant.
623
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
623
+ BOOST_CONTAINER_NODISCARD inline
624
624
  const_iterator end() const BOOST_NOEXCEPT_OR_NOTHROW
625
- { return dtl::force_copy<const_iterator>(m_flat_tree.end()); }
625
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.end()); }
626
626
 
627
627
  //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning
628
628
  //! of the reversed container.
@@ -630,9 +630,9 @@ class flat_map
630
630
  //! <b>Throws</b>: Nothing.
631
631
  //!
632
632
  //! <b>Complexity</b>: Constant.
633
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
633
+ BOOST_CONTAINER_NODISCARD inline
634
634
  reverse_iterator rbegin() BOOST_NOEXCEPT_OR_NOTHROW
635
- { return dtl::force_copy<reverse_iterator>(m_flat_tree.rbegin()); }
635
+ { return BOOST_CONTAINER_FORCECOPY(reverse_iterator, m_flat_tree.rbegin()); }
636
636
 
637
637
  //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
638
638
  //! of the reversed container.
@@ -640,9 +640,9 @@ class flat_map
640
640
  //! <b>Throws</b>: Nothing.
641
641
  //!
642
642
  //! <b>Complexity</b>: Constant.
643
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
643
+ BOOST_CONTAINER_NODISCARD inline
644
644
  const_reverse_iterator rbegin() const BOOST_NOEXCEPT_OR_NOTHROW
645
- { return dtl::force_copy<const_reverse_iterator>(m_flat_tree.rbegin()); }
645
+ { return BOOST_CONTAINER_FORCECOPY(const_reverse_iterator, m_flat_tree.rbegin()); }
646
646
 
647
647
  //! <b>Effects</b>: Returns a reverse_iterator pointing to the end
648
648
  //! of the reversed container.
@@ -650,9 +650,9 @@ class flat_map
650
650
  //! <b>Throws</b>: Nothing.
651
651
  //!
652
652
  //! <b>Complexity</b>: Constant.
653
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
653
+ BOOST_CONTAINER_NODISCARD inline
654
654
  reverse_iterator rend() BOOST_NOEXCEPT_OR_NOTHROW
655
- { return dtl::force_copy<reverse_iterator>(m_flat_tree.rend()); }
655
+ { return BOOST_CONTAINER_FORCECOPY(reverse_iterator, m_flat_tree.rend()); }
656
656
 
657
657
  //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
658
658
  //! of the reversed container.
@@ -660,27 +660,27 @@ class flat_map
660
660
  //! <b>Throws</b>: Nothing.
661
661
  //!
662
662
  //! <b>Complexity</b>: Constant.
663
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
663
+ BOOST_CONTAINER_NODISCARD inline
664
664
  const_reverse_iterator rend() const BOOST_NOEXCEPT_OR_NOTHROW
665
- { return dtl::force_copy<const_reverse_iterator>(m_flat_tree.rend()); }
665
+ { return BOOST_CONTAINER_FORCECOPY(const_reverse_iterator, m_flat_tree.rend()); }
666
666
 
667
667
  //! <b>Effects</b>: Returns a const_iterator to the first element contained in the container.
668
668
  //!
669
669
  //! <b>Throws</b>: Nothing.
670
670
  //!
671
671
  //! <b>Complexity</b>: Constant.
672
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
672
+ BOOST_CONTAINER_NODISCARD inline
673
673
  const_iterator cbegin() const BOOST_NOEXCEPT_OR_NOTHROW
674
- { return dtl::force_copy<const_iterator>(m_flat_tree.cbegin()); }
674
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.cbegin()); }
675
675
 
676
676
  //! <b>Effects</b>: Returns a const_iterator to the end of the container.
677
677
  //!
678
678
  //! <b>Throws</b>: Nothing.
679
679
  //!
680
680
  //! <b>Complexity</b>: Constant.
681
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
681
+ BOOST_CONTAINER_NODISCARD inline
682
682
  const_iterator cend() const BOOST_NOEXCEPT_OR_NOTHROW
683
- { return dtl::force_copy<const_iterator>(m_flat_tree.cend()); }
683
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.cend()); }
684
684
 
685
685
  //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
686
686
  //! of the reversed container.
@@ -688,9 +688,9 @@ class flat_map
688
688
  //! <b>Throws</b>: Nothing.
689
689
  //!
690
690
  //! <b>Complexity</b>: Constant.
691
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
691
+ BOOST_CONTAINER_NODISCARD inline
692
692
  const_reverse_iterator crbegin() const BOOST_NOEXCEPT_OR_NOTHROW
693
- { return dtl::force_copy<const_reverse_iterator>(m_flat_tree.crbegin()); }
693
+ { return BOOST_CONTAINER_FORCECOPY(const_reverse_iterator, m_flat_tree.crbegin()); }
694
694
 
695
695
  //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
696
696
  //! of the reversed container.
@@ -698,9 +698,9 @@ class flat_map
698
698
  //! <b>Throws</b>: Nothing.
699
699
  //!
700
700
  //! <b>Complexity</b>: Constant.
701
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
701
+ BOOST_CONTAINER_NODISCARD inline
702
702
  const_reverse_iterator crend() const BOOST_NOEXCEPT_OR_NOTHROW
703
- { return dtl::force_copy<const_reverse_iterator>(m_flat_tree.crend()); }
703
+ { return BOOST_CONTAINER_FORCECOPY(const_reverse_iterator, m_flat_tree.crend()); }
704
704
 
705
705
  //////////////////////////////////////////////
706
706
  //
@@ -713,7 +713,7 @@ class flat_map
713
713
  //! <b>Throws</b>: Nothing.
714
714
  //!
715
715
  //! <b>Complexity</b>: Constant.
716
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
716
+ BOOST_CONTAINER_NODISCARD inline
717
717
  bool empty() const BOOST_NOEXCEPT_OR_NOTHROW
718
718
  { return m_flat_tree.empty(); }
719
719
 
@@ -722,7 +722,7 @@ class flat_map
722
722
  //! <b>Throws</b>: Nothing.
723
723
  //!
724
724
  //! <b>Complexity</b>: Constant.
725
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
725
+ BOOST_CONTAINER_NODISCARD inline
726
726
  size_type size() const BOOST_NOEXCEPT_OR_NOTHROW
727
727
  { return m_flat_tree.size(); }
728
728
 
@@ -731,7 +731,7 @@ class flat_map
731
731
  //! <b>Throws</b>: Nothing.
732
732
  //!
733
733
  //! <b>Complexity</b>: Constant.
734
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
734
+ BOOST_CONTAINER_NODISCARD inline
735
735
  size_type max_size() const BOOST_NOEXCEPT_OR_NOTHROW
736
736
  { return m_flat_tree.max_size(); }
737
737
 
@@ -741,7 +741,7 @@ class flat_map
741
741
  //! <b>Throws</b>: Nothing.
742
742
  //!
743
743
  //! <b>Complexity</b>: Constant.
744
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
744
+ BOOST_CONTAINER_NODISCARD inline
745
745
  size_type capacity() const BOOST_NOEXCEPT_OR_NOTHROW
746
746
  { return m_flat_tree.capacity(); }
747
747
 
@@ -773,26 +773,43 @@ class flat_map
773
773
  //
774
774
  //////////////////////////////////////////////
775
775
 
776
- #if defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
777
- //! Effects: If there is no key equivalent to x in the flat_map, inserts
778
- //! value_type(x, T()) into the flat_map.
776
+ #if defined(BOOST_CONTAINER_DOXYGEN_INVOKED) || (defined(BOOST_CXX_VERSION) &&(BOOST_CXX_VERSION >= 201103L))
777
+ //! Effects: If there is no key equivalent to k in the flat_map, inserts
778
+ //! value_type(k, T()) into the flat_map.
779
779
  //!
780
- //! Returns: A reference to the mapped_type corresponding to x in *this.
780
+ //! Returns: A reference to the mapped_type corresponding to k in *this.
781
781
  //!
782
782
  //! Complexity: Logarithmic search time plus linear insertion time in case no equivalent key is present.
783
- mapped_type &operator[](const key_type& k);
783
+ mapped_type &operator[](const key_type& k)
784
+ { return this->priv_subscript(k); }
784
785
 
785
- //! Effects: If there is no key equivalent to x in the flat_map, inserts
786
- //! value_type(move(x), T()) into the flat_map (the key is move-constructed)
786
+ //! Effects: If there is no key equivalent to k in the flat_map, inserts
787
+ //! value_type(move(k), T()) into the flat_map (the key is move-constructed)
787
788
  //!
788
- //! Returns: A reference to the mapped_type corresponding to x in *this.
789
+ //! Returns: A reference to the mapped_type corresponding to k in *this.
789
790
  //!
790
791
  //! Complexity: Logarithmic search time plus linear insertion time in case no equivalent key is present.
791
- mapped_type &operator[](key_type &&k);
792
- #elif defined(BOOST_MOVE_HELPERS_RETURN_SFINAE_BROKEN)
793
- //in compilers like GCC 3.4, we can't catch temporaries
794
- inline mapped_type& operator[](const key_type &k) { return this->priv_subscript(k); }
795
- inline mapped_type& operator[](BOOST_RV_REF(key_type) k) { return this->priv_subscript(::boost::move(k)); }
792
+ mapped_type &operator[](key_type &&k)
793
+ { return this->priv_subscript(boost::move(k)); }
794
+
795
+ //! <b>Precondition</b>: This overload is available only if key_compare::is_transparent exists.
796
+ //!
797
+ //! <b>Effects</b>: If there is no key equivalent to x in the map, inserts
798
+ //! value_type(boost::forward<K>(k), T()) into the map
799
+ //!
800
+ //! <b>Returns</b>: A reference to the mapped_type corresponding to k in *this.
801
+ //!
802
+ //! <b>Complexity</b>: Logarithmic search time plus linear insertion time in case no equivalent key is present
803
+ template <class K>
804
+ inline BOOST_CONTAINER_DOC1ST
805
+ ( mapped_type&
806
+ , typename dtl::enable_if_transparent< key_compare
807
+ BOOST_MOVE_I K
808
+ BOOST_MOVE_I mapped_type&
809
+ >::type) //transparent
810
+ operator[](K &&k)
811
+ { return this->priv_subscript(boost::forward<K>(k)); }
812
+
796
813
  #else
797
814
  BOOST_MOVE_CONVERSION_AWARE_CATCH( operator[] , key_type, mapped_type&, this->priv_subscript)
798
815
  #endif
@@ -801,10 +818,6 @@ class flat_map
801
818
  //! to the mapped_type corresponding to the key k. If the key does not exist, inserts the new value
802
819
  //! as if by insert, constructing it from value_type(k, forward<M>(obj)).
803
820
  //!
804
- //! No iterators or references are invalidated. If the insertion is successful, pointers and references
805
- //! to the element obtained while it is held in the node handle are invalidated, and pointers and
806
- //! references obtained to that element before it was extracted become valid.
807
- //!
808
821
  //! Returns: The bool component is true if the insertion took place and false if the assignment
809
822
  //! took place. The iterator component is pointing at the element that was inserted or updated.
810
823
  //!
@@ -812,20 +825,14 @@ class flat_map
812
825
  template <class M>
813
826
  inline std::pair<iterator, bool> insert_or_assign(const key_type& k, BOOST_FWD_REF(M) obj)
814
827
  {
815
- return dtl::force_copy< std::pair<iterator, bool> >
816
- (this->m_flat_tree.insert_or_assign
817
- ( impl_const_iterator(), k, ::boost::forward<M>(obj))
818
- );
828
+ return BOOST_CONTAINER_FORCECOPY(iterator_bool_t,
829
+ this->m_flat_tree.insert_or_assign(k, ::boost::forward<M>(obj)));
819
830
  }
820
831
 
821
832
  //! Effects: If a key equivalent to k already exists in the container, assigns forward<M>(obj)
822
833
  //! to the mapped_type corresponding to the key k. If the key does not exist, inserts the new value
823
834
  //! as if by insert, constructing it from value_type(k, move(obj)).
824
835
  //!
825
- //! No iterators or references are invalidated. If the insertion is successful, pointers and references
826
- //! to the element obtained while it is held in the node handle are invalidated, and pointers and
827
- //! references obtained to that element before it was extracted become valid.
828
- //!
829
836
  //! Returns: The bool component is true if the insertion took place and false if the assignment
830
837
  //! took place. The iterator component is pointing at the element that was inserted or updated.
831
838
  //!
@@ -833,10 +840,33 @@ class flat_map
833
840
  template <class M>
834
841
  inline std::pair<iterator, bool> insert_or_assign(BOOST_RV_REF(key_type) k, BOOST_FWD_REF(M) obj)
835
842
  {
836
- return dtl::force_copy< std::pair<iterator, bool> >
837
- (this->m_flat_tree.insert_or_assign
838
- ( impl_const_iterator(), ::boost::move(k), ::boost::forward<M>(obj))
839
- );
843
+ return BOOST_CONTAINER_FORCECOPY(iterator_bool_t,
844
+ this->m_flat_tree.insert_or_assign(::boost::move(k), ::boost::forward<M>(obj)));
845
+ }
846
+
847
+ //! <b>Requires</b>: This overload is available only if key_compare::is_transparent exists.
848
+ //!
849
+ //! <b>Effects</b>: If a key equivalent to k already exists in the container, assigns forward<M>(obj)
850
+ //! to the mapped_type corresponding to the key k. If the key does not exist, inserts the new value
851
+ //! as if by insert, constructing it from value_type(k, move(obj)).
852
+ //!
853
+ //! <b>Returns</b>: The bool component is true if the insertion took place and false if the assignment
854
+ //! took place. The iterator component is pointing at the element that was inserted or updated.
855
+ //!
856
+ //! <b>Complexity</b>: Logarithmic in the size of the container.
857
+ template <class K, class M>
858
+ inline BOOST_CONTAINER_DOC1ST
859
+ (std::pair<iterator BOOST_MOVE_I bool>
860
+ , typename dtl::enable_if_c<
861
+ dtl::is_transparent<key_compare>::value && //transparent
862
+ !dtl::is_convertible<K BOOST_MOVE_I iterator>::value && //not convertible to iterator
863
+ !dtl::is_convertible<K BOOST_MOVE_I const_iterator>::value //not convertible to const_iterator
864
+ BOOST_MOVE_I std::pair<iterator BOOST_MOVE_I bool>
865
+ >::type)
866
+ insert_or_assign(BOOST_FWD_REF(K) k, BOOST_FWD_REF(M) obj)
867
+ {
868
+ return BOOST_CONTAINER_FORCECOPY(iterator_bool_t,
869
+ this->m_flat_tree.insert_or_assign(::boost::forward<K>(k), ::boost::forward<M>(obj)));
840
870
  }
841
871
 
842
872
  //! Effects: If a key equivalent to k already exists in the container, assigns forward<M>(obj)
@@ -844,10 +874,6 @@ class flat_map
844
874
  //! as if by insert, constructing it from value_type(k, forward<M>(obj)) and the new element
845
875
  //! to the container as close as possible to the position just before hint.
846
876
  //!
847
- //! No iterators or references are invalidated. If the insertion is successful, pointers and references
848
- //! to the element obtained while it is held in the node handle are invalidated, and pointers and
849
- //! references obtained to that element before it was extracted become valid.
850
- //!
851
877
  //! <b>Returns</b>: The returned iterator points to the map element whose key is equivalent to k.
852
878
  //!
853
879
  //! Complexity: Logarithmic in the size of the container in general, but amortized constant if
@@ -855,9 +881,9 @@ class flat_map
855
881
  template <class M>
856
882
  inline iterator insert_or_assign(const_iterator hint, const key_type& k, BOOST_FWD_REF(M) obj)
857
883
  {
858
- return dtl::force_copy<iterator>
859
- (this->m_flat_tree.insert_or_assign
860
- ( dtl::force_copy<impl_const_iterator>(hint)
884
+ return BOOST_CONTAINER_FORCECOPY(iterator,
885
+ this->m_flat_tree.insert_or_assign
886
+ ( BOOST_CONTAINER_FORCECOPY(impl_const_iterator, hint)
861
887
  , k, ::boost::forward<M>(obj)).first
862
888
  );
863
889
  }
@@ -867,10 +893,6 @@ class flat_map
867
893
  //! as if by insert, constructing it from value_type(k, move(obj)) and the new element
868
894
  //! to the container as close as possible to the position just before hint.
869
895
  //!
870
- //! No iterators or references are invalidated. If the insertion is successful, pointers and references
871
- //! to the element obtained while it is held in the node handle are invalidated, and pointers and
872
- //! references obtained to that element before it was extracted become valid.
873
- //!
874
896
  //! <b>Returns</b>: The returned iterator points to the map element whose key is equivalent to k.
875
897
  //!
876
898
  //! Complexity: Logarithmic in the size of the container in general, but amortized constant if
@@ -878,39 +900,66 @@ class flat_map
878
900
  template <class M>
879
901
  inline iterator insert_or_assign(const_iterator hint, BOOST_RV_REF(key_type) k, BOOST_FWD_REF(M) obj)
880
902
  {
881
- return dtl::force_copy<iterator>
882
- (this->m_flat_tree.insert_or_assign
883
- ( dtl::force_copy<impl_const_iterator>(hint)
903
+ return BOOST_CONTAINER_FORCECOPY(iterator,
904
+ this->m_flat_tree.insert_or_assign
905
+ ( BOOST_CONTAINER_FORCECOPY(impl_const_iterator, hint)
884
906
  , ::boost::move(k), ::boost::forward<M>(obj)).first
885
907
  );
886
908
  }
887
909
 
910
+ //! <b>Requires</b>: This overload is available only if key_compare::is_transparent exists.
911
+ //!
912
+ //! <b>Effects</b>: If a key equivalent to k already exists in the container, assigns forward<M>(obj)
913
+ //! to the mapped_type corresponding to the key k. If the key does not exist, inserts the new value
914
+ //! as if by insert, constructing it from value_type(k, move(obj)) and the new element
915
+ //! to the container as close as possible to the position just before hint.
916
+ //!
917
+ //! <b>Returns</b>: The returned iterator points to the map element whose key is equivalent to k.
918
+ //!
919
+ //! <b>Complexity</b>: Logarithmic in the size of the container in general, but amortized constant if
920
+ //! the new element is inserted just before hint.
921
+ template <class K, class M>
922
+ BOOST_CONTAINER_DOC1ST
923
+ ( iterator
924
+ , typename dtl::enable_if_transparent< key_compare
925
+ BOOST_MOVE_I K
926
+ BOOST_MOVE_I iterator
927
+ >::type) //transparent
928
+ insert_or_assign(const_iterator hint, BOOST_FWD_REF(K) k, BOOST_FWD_REF(M) obj)
929
+ {
930
+ return BOOST_CONTAINER_FORCECOPY(iterator,
931
+ this->m_flat_tree.insert_or_assign
932
+ ( BOOST_CONTAINER_FORCECOPY(impl_const_iterator, hint)
933
+ , ::boost::forward<K>(k), ::boost::forward<M>(obj)).first
934
+ );
935
+ }
936
+
888
937
  //! @copydoc ::boost::container::flat_set::nth(size_type)
889
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
938
+ BOOST_CONTAINER_NODISCARD inline
890
939
  iterator nth(size_type n) BOOST_NOEXCEPT_OR_NOTHROW
891
- { return dtl::force_copy<iterator>(m_flat_tree.nth(n)); }
940
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.nth(n)); }
892
941
 
893
942
  //! @copydoc ::boost::container::flat_set::nth(size_type) const
894
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
943
+ BOOST_CONTAINER_NODISCARD inline
895
944
  const_iterator nth(size_type n) const BOOST_NOEXCEPT_OR_NOTHROW
896
- { return dtl::force_copy<const_iterator>(m_flat_tree.nth(n)); }
945
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.nth(n)); }
897
946
 
898
947
  //! @copydoc ::boost::container::flat_set::index_of(iterator)
899
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
948
+ BOOST_CONTAINER_NODISCARD inline
900
949
  size_type index_of(iterator p) BOOST_NOEXCEPT_OR_NOTHROW
901
- { return m_flat_tree.index_of(dtl::force_copy<impl_iterator>(p)); }
950
+ { return m_flat_tree.index_of(BOOST_CONTAINER_FORCECOPY(impl_iterator, p)); }
902
951
 
903
952
  //! @copydoc ::boost::container::flat_set::index_of(const_iterator) const
904
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
953
+ BOOST_CONTAINER_NODISCARD inline
905
954
  size_type index_of(const_iterator p) const BOOST_NOEXCEPT_OR_NOTHROW
906
- { return m_flat_tree.index_of(dtl::force_copy<impl_const_iterator>(p)); }
955
+ { return m_flat_tree.index_of(BOOST_CONTAINER_FORCECOPY(impl_const_iterator, p)); }
907
956
 
908
957
  //! Returns: A reference to the element whose key is equivalent to x.
909
958
  //!
910
959
  //! Throws: An exception object of type out_of_range if no such element is present.
911
960
  //!
912
961
  //! Complexity: logarithmic.
913
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD T& at(const key_type& k)
962
+ BOOST_CONTAINER_NODISCARD T& at(const key_type& k)
914
963
  {
915
964
  iterator i = this->find(k);
916
965
  if(i == this->end()){
@@ -924,15 +973,63 @@ class flat_map
924
973
  //! Throws: An exception object of type out_of_range if no such element is present.
925
974
  //!
926
975
  //! Complexity: logarithmic.
927
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD const T& at(const key_type& k) const
976
+ BOOST_CONTAINER_NODISCARD const T& at(const key_type& k) const
928
977
  {
929
978
  const_iterator i = this->find(k);
979
+ if(i == this->cend()){
980
+ throw_out_of_range("flat_map::at key not found");
981
+ }
982
+ return i->second;
983
+ }
984
+
985
+ //! <b>Precondition</b>: This overload is available only if key_compare::is_transparent exists.
986
+ //!
987
+ //! Returns: A reference to the element whose key is equivalent to x.
988
+ //!
989
+ //! Throws: An exception object of type out_of_range if no such element is present.
990
+ //!
991
+ //! Complexity: logarithmic.
992
+ template<class K>
993
+ BOOST_CONTAINER_NODISCARD
994
+ BOOST_CONTAINER_DOC1ST
995
+ ( T&
996
+ , typename dtl::enable_if_transparent< key_compare
997
+ BOOST_MOVE_I K
998
+ BOOST_MOVE_I T&
999
+ >::type) //transparent
1000
+ at(const K& k)
1001
+ {
1002
+ iterator i = this->find(k);
930
1003
  if(i == this->end()){
931
1004
  throw_out_of_range("flat_map::at key not found");
932
1005
  }
933
1006
  return i->second;
934
1007
  }
935
1008
 
1009
+ //! <b>Precondition</b>: This overload is available only if key_compare::is_transparent exists.
1010
+ //!
1011
+ //! Returns: A reference to the element whose key is equivalent to x.
1012
+ //!
1013
+ //! Throws: An exception object of type out_of_range if no such element is present.
1014
+ //!
1015
+ //! Complexity: logarithmic.
1016
+ template<class K>
1017
+ BOOST_CONTAINER_NODISCARD
1018
+ BOOST_CONTAINER_DOC1ST
1019
+ ( const T&
1020
+ , typename dtl::enable_if_transparent< key_compare
1021
+ BOOST_MOVE_I K
1022
+ BOOST_MOVE_I const T&
1023
+ >::type) //transparent
1024
+ at(const K& k) const
1025
+ {
1026
+ const_iterator i = this->find(k);
1027
+ if(i == this->cend()){
1028
+ throw_out_of_range("flat_map::at key not found");
1029
+ }
1030
+ return i->second;
1031
+ }
1032
+
936
1033
  //////////////////////////////////////////////
937
1034
  //
938
1035
  // modifiers
@@ -955,7 +1052,7 @@ class flat_map
955
1052
  //! <b>Note</b>: If an element is inserted it might invalidate elements.
956
1053
  template <class... Args>
957
1054
  inline std::pair<iterator,bool> emplace(BOOST_FWD_REF(Args)... args)
958
- { return dtl::force_copy< std::pair<iterator, bool> >(m_flat_tree.emplace_unique(boost::forward<Args>(args)...)); }
1055
+ { return BOOST_CONTAINER_FORCECOPY(iterator_bool_t, m_flat_tree.emplace_unique(boost::forward<Args>(args)...)); }
959
1056
 
960
1057
  //! <b>Effects</b>: Inserts an object of type value_type constructed with
961
1058
  //! std::forward<Args>(args)... in the container if and only if there is
@@ -972,8 +1069,8 @@ class flat_map
972
1069
  template <class... Args>
973
1070
  inline iterator emplace_hint(const_iterator hint, BOOST_FWD_REF(Args)... args)
974
1071
  {
975
- return dtl::force_copy<iterator>
976
- (m_flat_tree.emplace_hint_unique( dtl::force_copy<impl_const_iterator>(hint)
1072
+ return BOOST_CONTAINER_FORCECOPY(iterator,
1073
+ m_flat_tree.emplace_hint_unique( BOOST_CONTAINER_FORCECOPY(impl_const_iterator, hint)
977
1074
  , boost::forward<Args>(args)...));
978
1075
  }
979
1076
 
@@ -991,8 +1088,8 @@ class flat_map
991
1088
  template <class... Args>
992
1089
  inline std::pair<iterator, bool> try_emplace(const key_type& k, BOOST_FWD_REF(Args)... args)
993
1090
  {
994
- return dtl::force_copy< std::pair<iterator, bool> >(
995
- m_flat_tree.try_emplace(impl_const_iterator(), k, boost::forward<Args>(args)...));
1091
+ return BOOST_CONTAINER_FORCECOPY(iterator_bool_t,
1092
+ m_flat_tree.try_emplace(k, boost::forward<Args>(args)...));
996
1093
  }
997
1094
 
998
1095
  //! <b>Requires</b>: value_type shall be EmplaceConstructible into map from piecewise_construct,
@@ -1009,8 +1106,8 @@ class flat_map
1009
1106
  template <class... Args>
1010
1107
  inline iterator try_emplace(const_iterator hint, const key_type &k, BOOST_FWD_REF(Args)... args)
1011
1108
  {
1012
- return dtl::force_copy<iterator>(m_flat_tree.try_emplace
1013
- (dtl::force_copy<impl_const_iterator>(hint), k, boost::forward<Args>(args)...).first);
1109
+ return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.try_emplace
1110
+ (BOOST_CONTAINER_FORCECOPY(impl_const_iterator, hint), k, boost::forward<Args>(args)...).first);
1014
1111
  }
1015
1112
 
1016
1113
  //! <b>Requires</b>: value_type shall be EmplaceConstructible into map from piecewise_construct,
@@ -1027,8 +1124,8 @@ class flat_map
1027
1124
  template <class... Args>
1028
1125
  inline std::pair<iterator, bool> try_emplace(BOOST_RV_REF(key_type) k, BOOST_FWD_REF(Args)... args)
1029
1126
  {
1030
- return dtl::force_copy< std::pair<iterator, bool> >
1031
- (m_flat_tree.try_emplace(impl_const_iterator(), boost::move(k), boost::forward<Args>(args)...));
1127
+ return BOOST_CONTAINER_FORCECOPY(iterator_bool_t,
1128
+ m_flat_tree.try_emplace(boost::move(k), boost::forward<Args>(args)...));
1032
1129
  }
1033
1130
 
1034
1131
  //! <b>Requires</b>: value_type shall be EmplaceConstructible into map from piecewise_construct,
@@ -1045,9 +1142,64 @@ class flat_map
1045
1142
  template <class... Args>
1046
1143
  inline iterator try_emplace(const_iterator hint, BOOST_RV_REF(key_type) k, BOOST_FWD_REF(Args)... args)
1047
1144
  {
1048
- return dtl::force_copy<iterator>
1049
- (m_flat_tree.try_emplace(dtl::force_copy
1050
- <impl_const_iterator>(hint), boost::move(k), boost::forward<Args>(args)...).first);
1145
+ return BOOST_CONTAINER_FORCECOPY(iterator,
1146
+ m_flat_tree.try_emplace(BOOST_CONTAINER_FORCECOPY
1147
+ (impl_const_iterator, hint), boost::move(k), boost::forward<Args>(args)...).first);
1148
+ }
1149
+
1150
+ //! <b>Precondition</b>: This overload is available only if key_compare::is_transparent exists.
1151
+ //!
1152
+ //! <b>Requires</b>: value_type shall be EmplaceConstructible into map from piecewise_construct,
1153
+ //! forward_as_tuple(move(k)), forward_as_tuple(forward<Args>(args)...).
1154
+ //!
1155
+ //! <b>Effects</b>: If the map already contains an element whose key is equivalent to k, there is no effect. Otherwise
1156
+ //! inserts an object of type value_type constructed with piecewise_construct, forward_as_tuple(move(k)),
1157
+ //! forward_as_tuple(forward<Args>(args)...).
1158
+ //!
1159
+ //! <b>Returns</b>: The bool component of the returned pair is true if and only if the
1160
+ //! insertion took place. The returned iterator points to the map element whose key is equivalent to k.
1161
+ //!
1162
+ //! <b>Complexity</b>: Logarithmic search time plus linear insertion time in case the key is not present.
1163
+ template <class K, class... Args>
1164
+ inline BOOST_CONTAINER_DOC1ST
1165
+ (std::pair<iterator BOOST_MOVE_I bool>
1166
+ , typename dtl::enable_if_c<
1167
+ dtl::is_transparent<key_compare>::value && //transparent
1168
+ !dtl::is_convertible<K BOOST_MOVE_I iterator>::value && //not convertible to iterator
1169
+ !dtl::is_convertible<K BOOST_MOVE_I const_iterator>::value //not convertible to const_iterator
1170
+ BOOST_MOVE_I std::pair<iterator BOOST_MOVE_I bool>
1171
+ >::type)
1172
+ try_emplace(BOOST_FWD_REF(K) k, BOOST_FWD_REF(Args)... args)
1173
+ {
1174
+ return BOOST_CONTAINER_FORCECOPY(iterator_bool_t,
1175
+ m_flat_tree.try_emplace(boost::forward<K>(k), boost::forward<Args>(args)...));
1176
+ }
1177
+
1178
+ //! <b>Precondition</b>: This overload is available only if key_compare::is_transparent exists.
1179
+ //!
1180
+ //! <b>Requires</b>: value_type shall be EmplaceConstructible into map from piecewise_construct,
1181
+ //! forward_as_tuple(move(k)), forward_as_tuple(forward<Args>(args)...).
1182
+ //!
1183
+ //! <b>Effects</b>: If the map already contains an element whose key is equivalent to k, there is no effect. Otherwise
1184
+ //! inserts an object of type value_type constructed with piecewise_construct, forward_as_tuple(move(k)),
1185
+ //! forward_as_tuple(forward<Args>(args)...).
1186
+ //!
1187
+ //! <b>Returns</b>: The returned iterator points to the map element whose key is equivalent to k.
1188
+ //!
1189
+ //! <b>Complexity</b>: Logarithmic in general, but amortized constant if value
1190
+ //! is inserted right before p. Linear insertion time in case no equivalent key is present.
1191
+ template <class K, class... Args>
1192
+ inline BOOST_CONTAINER_DOC1ST
1193
+ ( iterator
1194
+ , typename dtl::enable_if_transparent< key_compare
1195
+ BOOST_MOVE_I K
1196
+ BOOST_MOVE_I iterator
1197
+ >::type) //transparent
1198
+ try_emplace(const_iterator hint, BOOST_FWD_REF(K) k, BOOST_FWD_REF(Args)... args)
1199
+ {
1200
+ return BOOST_CONTAINER_FORCECOPY(iterator,
1201
+ m_flat_tree.try_emplace(BOOST_CONTAINER_FORCECOPY
1202
+ (impl_const_iterator, hint), boost::forward<K>(k), boost::forward<Args>(args)...).first);
1051
1203
  }
1052
1204
 
1053
1205
  #else // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
@@ -1056,39 +1208,64 @@ class flat_map
1056
1208
  BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
1057
1209
  inline std::pair<iterator,bool> emplace(BOOST_MOVE_UREF##N)\
1058
1210
  {\
1059
- return dtl::force_copy< std::pair<iterator, bool> >\
1060
- (m_flat_tree.emplace_unique(BOOST_MOVE_FWD##N));\
1211
+ return BOOST_CONTAINER_FORCECOPY(iterator_bool_t,\
1212
+ m_flat_tree.emplace_unique(BOOST_MOVE_FWD##N));\
1061
1213
  }\
1062
1214
  \
1063
1215
  BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
1064
1216
  inline iterator emplace_hint(const_iterator hint BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
1065
1217
  {\
1066
- return dtl::force_copy<iterator>(m_flat_tree.emplace_hint_unique\
1067
- (dtl::force_copy<impl_const_iterator>(hint) BOOST_MOVE_I##N BOOST_MOVE_FWD##N));\
1218
+ return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.emplace_hint_unique\
1219
+ (BOOST_CONTAINER_FORCECOPY(impl_const_iterator, hint) BOOST_MOVE_I##N BOOST_MOVE_FWD##N));\
1068
1220
  }\
1069
1221
  BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
1070
1222
  inline std::pair<iterator, bool> try_emplace(const key_type& k BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
1071
1223
  {\
1072
- return dtl::force_copy< std::pair<iterator, bool> >\
1073
- (m_flat_tree.try_emplace(impl_const_iterator(), k BOOST_MOVE_I##N BOOST_MOVE_FWD##N));\
1224
+ return BOOST_CONTAINER_FORCECOPY(iterator_bool_t,\
1225
+ m_flat_tree.try_emplace(k BOOST_MOVE_I##N BOOST_MOVE_FWD##N));\
1074
1226
  }\
1075
1227
  \
1076
1228
  BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
1077
1229
  inline iterator try_emplace(const_iterator hint, const key_type &k BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
1078
- { return dtl::force_copy<iterator>(m_flat_tree.try_emplace\
1079
- (dtl::force_copy<impl_const_iterator>(hint), k BOOST_MOVE_I##N BOOST_MOVE_FWD##N).first); }\
1230
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.try_emplace\
1231
+ (BOOST_CONTAINER_FORCECOPY(impl_const_iterator, hint), k BOOST_MOVE_I##N BOOST_MOVE_FWD##N).first); }\
1080
1232
  \
1081
1233
  BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
1082
1234
  inline std::pair<iterator, bool> try_emplace(BOOST_RV_REF(key_type) k BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
1083
1235
  {\
1084
- return dtl::force_copy< std::pair<iterator, bool> >\
1085
- (m_flat_tree.try_emplace(impl_const_iterator(), boost::move(k) BOOST_MOVE_I##N BOOST_MOVE_FWD##N));\
1236
+ return BOOST_CONTAINER_FORCECOPY(iterator_bool_t,\
1237
+ m_flat_tree.try_emplace(boost::move(k) BOOST_MOVE_I##N BOOST_MOVE_FWD##N));\
1086
1238
  }\
1087
1239
  \
1088
1240
  BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
1089
1241
  inline iterator try_emplace(const_iterator hint, BOOST_RV_REF(key_type) k BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
1090
- { return dtl::force_copy<iterator>(m_flat_tree.try_emplace\
1091
- (dtl::force_copy<impl_const_iterator>(hint), boost::move(k) BOOST_MOVE_I##N BOOST_MOVE_FWD##N).first); }\
1242
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.try_emplace\
1243
+ (BOOST_CONTAINER_FORCECOPY(impl_const_iterator, hint), boost::move(k) BOOST_MOVE_I##N BOOST_MOVE_FWD##N).first); }\
1244
+ \
1245
+ template <class K BOOST_MOVE_I##N BOOST_MOVE_CLASS##N> \
1246
+ typename dtl::enable_if_c< \
1247
+ dtl::is_transparent<key_compare>::value && \
1248
+ !dtl::is_convertible<K BOOST_MOVE_I iterator>::value && \
1249
+ !dtl::is_convertible<K BOOST_MOVE_I const_iterator>::value \
1250
+ BOOST_MOVE_I std::pair<iterator BOOST_MOVE_I bool> \
1251
+ >::type \
1252
+ try_emplace(BOOST_FWD_REF(K) k BOOST_MOVE_I##N BOOST_MOVE_UREF##N) \
1253
+ { \
1254
+ return BOOST_CONTAINER_FORCECOPY(iterator_bool_t, \
1255
+ m_flat_tree.try_emplace(boost::forward<K>(k) BOOST_MOVE_I##N BOOST_MOVE_FWD##N)); \
1256
+ } \
1257
+ \
1258
+ template <class K BOOST_MOVE_I##N BOOST_MOVE_CLASS##N> \
1259
+ typename dtl::enable_if_transparent< key_compare \
1260
+ BOOST_MOVE_I K \
1261
+ BOOST_MOVE_I iterator \
1262
+ >::type \
1263
+ try_emplace(const_iterator hint BOOST_MOVE_I BOOST_FWD_REF(K) k BOOST_MOVE_I##N BOOST_MOVE_UREF##N) \
1264
+ { \
1265
+ return BOOST_CONTAINER_FORCECOPY(iterator, \
1266
+ m_flat_tree.try_emplace(BOOST_CONTAINER_FORCECOPY \
1267
+ (impl_const_iterator, hint) BOOST_MOVE_I boost::forward<K>(k) BOOST_MOVE_I##N BOOST_MOVE_FWD##N).first); \
1268
+ }
1092
1269
  //
1093
1270
  BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_FLAT_MAP_EMPLACE_CODE)
1094
1271
  #undef BOOST_CONTAINER_FLAT_MAP_EMPLACE_CODE
@@ -1107,8 +1284,8 @@ class flat_map
1107
1284
  //!
1108
1285
  //! <b>Note</b>: If an element is inserted it might invalidate elements.
1109
1286
  inline std::pair<iterator,bool> insert(const value_type& x)
1110
- { return dtl::force_copy<std::pair<iterator,bool> >(
1111
- m_flat_tree.insert_unique(dtl::force<const impl_value_type>(x))); }
1287
+ { return BOOST_CONTAINER_FORCECOPY(iterator_bool_t,
1288
+ m_flat_tree.insert_unique(BOOST_CONTAINER_FORCE(const impl_value_type, x))); }
1112
1289
 
1113
1290
  //! <b>Effects</b>: Inserts a new value_type move constructed from the pair if and
1114
1291
  //! only if there is no element in the container with key equivalent to the key of x.
@@ -1123,8 +1300,8 @@ class flat_map
1123
1300
  //! <b>Note</b>: If an element is inserted it might invalidate elements.
1124
1301
  inline std::pair<iterator,bool> insert(BOOST_RV_REF(value_type) x)
1125
1302
  {
1126
- return dtl::force_copy<std::pair<iterator,bool> >(
1127
- m_flat_tree.insert_unique(boost::move(dtl::force<impl_value_type>(x))));
1303
+ return BOOST_CONTAINER_FORCECOPY(iterator_bool_t,
1304
+ m_flat_tree.insert_unique(boost::move(BOOST_CONTAINER_FORCE(impl_value_type, x))));
1128
1305
  }
1129
1306
 
1130
1307
  //! <b>Effects</b>: Inserts a new value_type constructed from the pair if and
@@ -1145,8 +1322,8 @@ class flat_map
1145
1322
  BOOST_MOVE_I std::pair<iterator BOOST_MOVE_I bool> >::type)
1146
1323
  insert(BOOST_FWD_REF(Pair) x)
1147
1324
  {
1148
- return dtl::force_copy<std::pair<iterator,bool> >
1149
- (m_flat_tree.emplace_unique(boost::forward<Pair>(x)));
1325
+ return BOOST_CONTAINER_FORCECOPY(iterator_bool_t,
1326
+ m_flat_tree.emplace_unique(boost::forward<Pair>(x)));
1150
1327
  }
1151
1328
 
1152
1329
  //! <b>Effects</b>: Inserts a copy of x in the container if and only if there is
@@ -1162,9 +1339,9 @@ class flat_map
1162
1339
  //! <b>Note</b>: If an element is inserted it might invalidate elements.
1163
1340
  inline iterator insert(const_iterator p, const value_type& x)
1164
1341
  {
1165
- return dtl::force_copy<iterator>(
1166
- m_flat_tree.insert_unique( dtl::force_copy<impl_const_iterator>(p)
1167
- , dtl::force<const impl_value_type>(x)));
1342
+ return BOOST_CONTAINER_FORCECOPY(iterator,
1343
+ m_flat_tree.insert_unique( BOOST_CONTAINER_FORCECOPY(impl_const_iterator, p)
1344
+ , BOOST_CONTAINER_FORCE(const impl_value_type, x)));
1168
1345
  }
1169
1346
 
1170
1347
  //! <b>Effects</b>: Inserts an element move constructed from x in the container.
@@ -1178,9 +1355,9 @@ class flat_map
1178
1355
  //! <b>Note</b>: If an element is inserted it might invalidate elements.
1179
1356
  inline iterator insert(const_iterator p, BOOST_RV_REF(value_type) x)
1180
1357
  {
1181
- return dtl::force_copy<iterator>
1182
- (m_flat_tree.insert_unique( dtl::force_copy<impl_const_iterator>(p)
1183
- , boost::move(dtl::force<impl_value_type>(x))));
1358
+ return BOOST_CONTAINER_FORCECOPY(iterator,
1359
+ m_flat_tree.insert_unique( BOOST_CONTAINER_FORCECOPY(impl_const_iterator, p)
1360
+ , boost::move(BOOST_CONTAINER_FORCE(impl_value_type, x))));
1184
1361
  }
1185
1362
 
1186
1363
  //! <b>Effects</b>: Inserts an element constructed from x in the container.
@@ -1199,8 +1376,8 @@ class flat_map
1199
1376
  BOOST_MOVE_I iterator>::type)
1200
1377
  insert(const_iterator p, BOOST_FWD_REF(Pair) x)
1201
1378
  {
1202
- return dtl::force_copy<iterator>(
1203
- m_flat_tree.emplace_hint_unique(dtl::force_copy<impl_const_iterator>(p), boost::forward<Pair>(x)));
1379
+ return BOOST_CONTAINER_FORCECOPY(iterator,
1380
+ m_flat_tree.emplace_hint_unique(BOOST_CONTAINER_FORCECOPY(impl_const_iterator, p), boost::forward<Pair>(x)));
1204
1381
  }
1205
1382
 
1206
1383
  //! <b>Requires</b>: first, last are not iterators into *this.
@@ -1213,7 +1390,7 @@ class flat_map
1213
1390
  //! <b>Note</b>: If an element is inserted it might invalidate elements.
1214
1391
  template <class InputIterator>
1215
1392
  inline void insert(InputIterator first, InputIterator last)
1216
- { m_flat_tree.insert_unique(first, last); }
1393
+ { m_flat_tree.insert_unique_range(first, last); }
1217
1394
 
1218
1395
  //! <b>Requires</b>: first, last are not iterators into *this.
1219
1396
  //!
@@ -1231,7 +1408,7 @@ class flat_map
1231
1408
  //! <b>Note</b>: Non-standard extension.
1232
1409
  template <class InputIterator>
1233
1410
  inline void insert(ordered_unique_range_t, InputIterator first, InputIterator last)
1234
- { m_flat_tree.insert_unique(ordered_unique_range, first, last); }
1411
+ { m_flat_tree.insert_unique_range(ordered_unique_range, first, last); }
1235
1412
 
1236
1413
  #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
1237
1414
  //! <b>Effects</b>: inserts each element from the range [il.begin(), il.end()) if and only
@@ -1242,8 +1419,8 @@ class flat_map
1242
1419
  //! <b>Note</b>: If an element is inserted it might invalidate elements.
1243
1420
  inline void insert(std::initializer_list<value_type> il)
1244
1421
  {
1245
- m_flat_tree.insert_unique( dtl::force<impl_initializer_list>(il).begin()
1246
- , dtl::force<impl_initializer_list>(il).end());
1422
+ m_flat_tree.insert_unique_range( BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
1423
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end());
1247
1424
  }
1248
1425
 
1249
1426
  //! <b>Requires</b>: [il.begin(), il.end()) must be ordered according to the predicate and must be
@@ -1260,9 +1437,9 @@ class flat_map
1260
1437
  //! <b>Note</b>: Non-standard extension.
1261
1438
  inline void insert(ordered_unique_range_t, std::initializer_list<value_type> il)
1262
1439
  {
1263
- m_flat_tree.insert_unique(ordered_unique_range
1264
- , dtl::force<impl_initializer_list>(il).begin()
1265
- , dtl::force<impl_initializer_list>(il).end());
1440
+ m_flat_tree.insert_unique_range(ordered_unique_range
1441
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
1442
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end());
1266
1443
  }
1267
1444
  #endif
1268
1445
 
@@ -1306,13 +1483,13 @@ class flat_map
1306
1483
  //! not less than the erased element.
1307
1484
  inline iterator erase(const_iterator p)
1308
1485
  {
1309
- return dtl::force_copy<iterator>
1310
- (m_flat_tree.erase(dtl::force_copy<impl_const_iterator>(p)));
1486
+ return BOOST_CONTAINER_FORCECOPY(iterator,
1487
+ m_flat_tree.erase(BOOST_CONTAINER_FORCECOPY(impl_const_iterator, p)));
1311
1488
  }
1312
1489
 
1313
- //! <b>Effects</b>: If present, erases the element in the container with key equivalent to x.
1490
+ //! <b>Effects</b>: If present, erases the elements in the container with key equivalent to x.
1314
1491
  //!
1315
- //! <b>Returns</b>: Returns the number of erased elements (0/1).
1492
+ //! <b>Returns</b>: Returns the number of erased elements.
1316
1493
  //!
1317
1494
  //! <b>Complexity</b>: Logarithmic search time plus erasure time
1318
1495
  //! linear to the elements with bigger keys.
@@ -1322,17 +1499,17 @@ class flat_map
1322
1499
  //! <b>Requires</b>: This overload is available only if
1323
1500
  //! key_compare::is_transparent exists.
1324
1501
  //!
1325
- //! <b>Effects</b>: If present, erases the element in the container with key equivalent to x.
1502
+ //! <b>Effects</b>: If present, erases the elements in the container with key equivalent to x.
1326
1503
  //!
1327
- //! <b>Returns</b>: Returns the number of erased elements (0/1).
1504
+ //! <b>Returns</b>: Returns the number of erased elements.
1328
1505
  template <class K>
1329
1506
  inline BOOST_CONTAINER_DOC1ST
1330
- (size_type
1331
- , typename dtl::enable_if_c<
1332
- dtl::is_transparent<key_compare>::value && //transparent
1333
- !dtl::is_convertible<K BOOST_MOVE_I iterator>::value && //not convertible to iterator
1334
- !dtl::is_convertible<K BOOST_MOVE_I const_iterator>::value //not convertible to const_iterator
1335
- BOOST_MOVE_I size_type>::type)
1507
+ (size_type
1508
+ , typename dtl::enable_if_c<
1509
+ dtl::is_transparent<key_compare>::value && //transparent
1510
+ !dtl::is_convertible<K BOOST_MOVE_I iterator>::value && //not convertible to iterator
1511
+ !dtl::is_convertible<K BOOST_MOVE_I const_iterator>::value //not convertible to const_iterator
1512
+ BOOST_MOVE_I size_type>::type)
1336
1513
  erase(BOOST_FWD_REF(K) x)
1337
1514
  { return m_flat_tree.erase_unique(x); }
1338
1515
 
@@ -1346,9 +1523,9 @@ class flat_map
1346
1523
  //! linear to the elements with bigger keys.
1347
1524
  inline iterator erase(const_iterator first, const_iterator last)
1348
1525
  {
1349
- return dtl::force_copy<iterator>(
1350
- m_flat_tree.erase( dtl::force_copy<impl_const_iterator>(first)
1351
- , dtl::force_copy<impl_const_iterator>(last)));
1526
+ return BOOST_CONTAINER_FORCECOPY(iterator,
1527
+ m_flat_tree.erase( BOOST_CONTAINER_FORCECOPY(impl_const_iterator, first)
1528
+ , BOOST_CONTAINER_FORCECOPY(impl_const_iterator, last)));
1352
1529
  }
1353
1530
 
1354
1531
  //! <b>Effects</b>: Swaps the contents of *this and x.
@@ -1379,17 +1556,17 @@ class flat_map
1379
1556
  //! of which a was constructed.
1380
1557
  //!
1381
1558
  //! <b>Complexity</b>: Constant.
1382
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1559
+ BOOST_CONTAINER_NODISCARD inline
1383
1560
  key_compare key_comp() const
1384
- { return dtl::force_copy<key_compare>(m_flat_tree.key_comp()); }
1561
+ { return BOOST_CONTAINER_FORCECOPY(key_compare, m_flat_tree.key_comp()); }
1385
1562
 
1386
1563
  //! <b>Effects</b>: Returns an object of value_compare constructed out
1387
1564
  //! of the comparison object.
1388
1565
  //!
1389
1566
  //! <b>Complexity</b>: Constant.
1390
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1567
+ BOOST_CONTAINER_NODISCARD inline
1391
1568
  value_compare value_comp() const
1392
- { return value_compare(dtl::force_copy<key_compare>(m_flat_tree.key_comp())); }
1569
+ { return value_compare(BOOST_CONTAINER_FORCECOPY(key_compare, m_flat_tree.key_comp())); }
1393
1570
 
1394
1571
  //////////////////////////////////////////////
1395
1572
  //
@@ -1401,17 +1578,17 @@ class flat_map
1401
1578
  //! equivalent to x, or end() if such an element is not found.
1402
1579
  //!
1403
1580
  //! <b>Complexity</b>: Logarithmic.
1404
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1581
+ BOOST_CONTAINER_NODISCARD inline
1405
1582
  iterator find(const key_type& x)
1406
- { return dtl::force_copy<iterator>(m_flat_tree.find(x)); }
1583
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.find(x)); }
1407
1584
 
1408
1585
  //! <b>Returns</b>: A const_iterator pointing to an element with the key
1409
1586
  //! equivalent to x, or end() if such an element is not found.
1410
1587
  //!
1411
1588
  //! <b>Complexity</b>: Logarithmic.
1412
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1589
+ BOOST_CONTAINER_NODISCARD inline
1413
1590
  const_iterator find(const key_type& x) const
1414
- { return dtl::force_copy<const_iterator>(m_flat_tree.find(x)); }
1591
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.find(x)); }
1415
1592
 
1416
1593
  //! <b>Requires</b>: This overload is available only if
1417
1594
  //! key_compare::is_transparent exists.
@@ -1421,9 +1598,9 @@ class flat_map
1421
1598
  //!
1422
1599
  //! <b>Complexity</b>: Logarithmic.
1423
1600
  template<class K>
1424
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1601
+ BOOST_CONTAINER_NODISCARD inline
1425
1602
  iterator find(const K& x)
1426
- { return dtl::force_copy<iterator>(m_flat_tree.find(x)); }
1603
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.find(x)); }
1427
1604
 
1428
1605
  //! <b>Requires</b>: This overload is available only if
1429
1606
  //! key_compare::is_transparent exists.
@@ -1433,14 +1610,14 @@ class flat_map
1433
1610
  //!
1434
1611
  //! <b>Complexity</b>: Logarithmic.
1435
1612
  template<class K>
1436
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1613
+ BOOST_CONTAINER_NODISCARD inline
1437
1614
  const_iterator find(const K& x) const
1438
- { return dtl::force_copy<const_iterator>(m_flat_tree.find(x)); }
1615
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.find(x)); }
1439
1616
 
1440
1617
  //! <b>Returns</b>: The number of elements with key equivalent to x.
1441
1618
  //!
1442
1619
  //! <b>Complexity</b>: log(size())+count(k)
1443
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1620
+ BOOST_CONTAINER_NODISCARD inline
1444
1621
  size_type count(const key_type& x) const
1445
1622
  { return static_cast<size_type>(m_flat_tree.find(x) != m_flat_tree.end()); }
1446
1623
 
@@ -1451,7 +1628,7 @@ class flat_map
1451
1628
  //!
1452
1629
  //! <b>Complexity</b>: log(size())+count(k)
1453
1630
  template<class K>
1454
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1631
+ BOOST_CONTAINER_NODISCARD inline
1455
1632
  size_type count(const K& x) const
1456
1633
  //Don't use find() != end optimization here as transparent comparators with key K might
1457
1634
  //return a different range than key_type (which can only return a single element range)
@@ -1461,7 +1638,7 @@ class flat_map
1461
1638
  //! equivalent to key in the container, otherwise false.
1462
1639
  //!
1463
1640
  //! <b>Complexity</b>: log(size()).
1464
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1641
+ BOOST_CONTAINER_NODISCARD inline
1465
1642
  bool contains(const key_type& x) const
1466
1643
  { return m_flat_tree.find(x) != m_flat_tree.end(); }
1467
1644
 
@@ -1473,7 +1650,7 @@ class flat_map
1473
1650
  //!
1474
1651
  //! <b>Complexity</b>: log(size()).
1475
1652
  template<typename K>
1476
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1653
+ BOOST_CONTAINER_NODISCARD inline
1477
1654
  bool contains(const K& x) const
1478
1655
  { return m_flat_tree.find(x) != m_flat_tree.end(); }
1479
1656
 
@@ -1481,17 +1658,17 @@ class flat_map
1481
1658
  //! than x, or end() if such an element is not found.
1482
1659
  //!
1483
1660
  //! <b>Complexity</b>: Logarithmic.
1484
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1661
+ BOOST_CONTAINER_NODISCARD inline
1485
1662
  iterator lower_bound(const key_type& x)
1486
- { return dtl::force_copy<iterator>(m_flat_tree.lower_bound(x)); }
1663
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.lower_bound(x)); }
1487
1664
 
1488
1665
  //! <b>Returns</b>: A const iterator pointing to the first element with key not
1489
1666
  //! less than x, or end() if such an element is not found.
1490
1667
  //!
1491
1668
  //! <b>Complexity</b>: Logarithmic.
1492
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1669
+ BOOST_CONTAINER_NODISCARD inline
1493
1670
  const_iterator lower_bound(const key_type& x) const
1494
- { return dtl::force_copy<const_iterator>(m_flat_tree.lower_bound(x)); }
1671
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.lower_bound(x)); }
1495
1672
 
1496
1673
  //! <b>Requires</b>: This overload is available only if
1497
1674
  //! key_compare::is_transparent exists.
@@ -1501,9 +1678,9 @@ class flat_map
1501
1678
  //!
1502
1679
  //! <b>Complexity</b>: Logarithmic.
1503
1680
  template<class K>
1504
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1681
+ BOOST_CONTAINER_NODISCARD inline
1505
1682
  iterator lower_bound(const K& x)
1506
- { return dtl::force_copy<iterator>(m_flat_tree.lower_bound(x)); }
1683
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.lower_bound(x)); }
1507
1684
 
1508
1685
  //! <b>Requires</b>: This overload is available only if
1509
1686
  //! key_compare::is_transparent exists.
@@ -1513,25 +1690,25 @@ class flat_map
1513
1690
  //!
1514
1691
  //! <b>Complexity</b>: Logarithmic.
1515
1692
  template<class K>
1516
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1693
+ BOOST_CONTAINER_NODISCARD inline
1517
1694
  const_iterator lower_bound(const K& x) const
1518
- { return dtl::force_copy<const_iterator>(m_flat_tree.lower_bound(x)); }
1695
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.lower_bound(x)); }
1519
1696
 
1520
1697
  //! <b>Returns</b>: An iterator pointing to the first element with key greater
1521
1698
  //! than x, or end() if such an element is not found.
1522
1699
  //!
1523
1700
  //! <b>Complexity</b>: Logarithmic.
1524
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1701
+ BOOST_CONTAINER_NODISCARD inline
1525
1702
  iterator upper_bound(const key_type& x)
1526
- { return dtl::force_copy<iterator>(m_flat_tree.upper_bound(x)); }
1703
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.upper_bound(x)); }
1527
1704
 
1528
1705
  //! <b>Returns</b>: A const iterator pointing to the first element with key
1529
1706
  //! greater than x, or end() if such an element is not found.
1530
1707
  //!
1531
1708
  //! <b>Complexity</b>: Logarithmic.
1532
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1709
+ BOOST_CONTAINER_NODISCARD inline
1533
1710
  const_iterator upper_bound(const key_type& x) const
1534
- { return dtl::force_copy<const_iterator>(m_flat_tree.upper_bound(x)); }
1711
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.upper_bound(x)); }
1535
1712
 
1536
1713
  //! <b>Requires</b>: This overload is available only if
1537
1714
  //! key_compare::is_transparent exists.
@@ -1541,9 +1718,9 @@ class flat_map
1541
1718
  //!
1542
1719
  //! <b>Complexity</b>: Logarithmic.
1543
1720
  template<class K>
1544
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1721
+ BOOST_CONTAINER_NODISCARD inline
1545
1722
  iterator upper_bound(const K& x)
1546
- { return dtl::force_copy<iterator>(m_flat_tree.upper_bound(x)); }
1723
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.upper_bound(x)); }
1547
1724
 
1548
1725
  //! <b>Requires</b>: This overload is available only if
1549
1726
  //! key_compare::is_transparent exists.
@@ -1553,23 +1730,23 @@ class flat_map
1553
1730
  //!
1554
1731
  //! <b>Complexity</b>: Logarithmic.
1555
1732
  template<class K>
1556
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1733
+ BOOST_CONTAINER_NODISCARD inline
1557
1734
  const_iterator upper_bound(const K& x) const
1558
- { return dtl::force_copy<const_iterator>(m_flat_tree.upper_bound(x)); }
1735
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.upper_bound(x)); }
1559
1736
 
1560
1737
  //! <b>Effects</b>: Equivalent to std::make_pair(this->lower_bound(k), this->upper_bound(k)).
1561
1738
  //!
1562
1739
  //! <b>Complexity</b>: Logarithmic.
1563
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1740
+ BOOST_CONTAINER_NODISCARD inline
1564
1741
  std::pair<iterator,iterator> equal_range(const key_type& x)
1565
- { return dtl::force_copy<std::pair<iterator,iterator> >(m_flat_tree.lower_bound_range(x)); }
1742
+ { return BOOST_CONTAINER_FORCECOPY(iterator_iterator_t, m_flat_tree.lower_bound_range(x)); }
1566
1743
 
1567
1744
  //! <b>Effects</b>: Equivalent to std::make_pair(this->lower_bound(k), this->upper_bound(k)).
1568
1745
  //!
1569
1746
  //! <b>Complexity</b>: Logarithmic.
1570
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1747
+ BOOST_CONTAINER_NODISCARD inline
1571
1748
  std::pair<const_iterator, const_iterator> equal_range(const key_type& x) const
1572
- { return dtl::force_copy<std::pair<const_iterator,const_iterator> >(m_flat_tree.lower_bound_range(x)); }
1749
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator_const_iterator_t, m_flat_tree.lower_bound_range(x)); }
1573
1750
 
1574
1751
  //! <b>Requires</b>: This overload is available only if
1575
1752
  //! key_compare::is_transparent exists.
@@ -1578,11 +1755,11 @@ class flat_map
1578
1755
  //!
1579
1756
  //! <b>Complexity</b>: Logarithmic.
1580
1757
  template<class K>
1581
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1758
+ BOOST_CONTAINER_NODISCARD inline
1582
1759
  std::pair<iterator,iterator> equal_range(const K& x)
1583
1760
  //Don't use lower_bound_range optimization here as transparent comparators with key K might
1584
1761
  //return a different range than key_type (which can only return a single element range)
1585
- { return dtl::force_copy<std::pair<iterator,iterator> >(m_flat_tree.equal_range(x)); }
1762
+ { return BOOST_CONTAINER_FORCECOPY(iterator_iterator_t, m_flat_tree.equal_range(x)); }
1586
1763
 
1587
1764
  //! <b>Requires</b>: This overload is available only if
1588
1765
  //! key_compare::is_transparent exists.
@@ -1591,11 +1768,11 @@ class flat_map
1591
1768
  //!
1592
1769
  //! <b>Complexity</b>: Logarithmic.
1593
1770
  template<class K>
1594
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1771
+ BOOST_CONTAINER_NODISCARD inline
1595
1772
  std::pair<const_iterator, const_iterator> equal_range(const K& x) const
1596
1773
  //Don't use lower_bound_range optimization here as transparent comparators with key K might
1597
1774
  //return a different range than key_type (which can only return a single element range)
1598
- { return dtl::force_copy<std::pair<const_iterator,const_iterator> >(m_flat_tree.equal_range(x)); }
1775
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator_const_iterator_t, m_flat_tree.equal_range(x)); }
1599
1776
 
1600
1777
  //! <b>Effects</b>: Extracts the internal sequence container.
1601
1778
  //!
@@ -1604,9 +1781,9 @@ class flat_map
1604
1781
  //! <b>Postcondition</b>: this->empty()
1605
1782
  //!
1606
1783
  //! <b>Throws</b>: If secuence_type's move constructor throws
1607
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline sequence_type extract_sequence()
1784
+ BOOST_CONTAINER_NODISCARD inline sequence_type extract_sequence()
1608
1785
  {
1609
- return boost::move(dtl::force<sequence_type>(m_flat_tree.get_sequence_ref()));
1786
+ return boost::move(BOOST_CONTAINER_FORCE(sequence_type, m_flat_tree.get_sequence_ref()));
1610
1787
  }
1611
1788
 
1612
1789
  //! <b>Effects</b>: Discards the internally hold sequence container and adopts the
@@ -1616,7 +1793,7 @@ class flat_map
1616
1793
  //!
1617
1794
  //! <b>Throws</b>: If the comparison or the move constructor throws
1618
1795
  inline void adopt_sequence(BOOST_RV_REF(sequence_type) seq)
1619
- { this->m_flat_tree.adopt_sequence_unique(boost::move(dtl::force<impl_sequence_type>(seq))); }
1796
+ { this->m_flat_tree.adopt_sequence_unique(boost::move(BOOST_CONTAINER_FORCE(impl_sequence_type, seq))); }
1620
1797
 
1621
1798
  //! <b>Requires</b>: seq shall be ordered according to this->compare()
1622
1799
  //! and shall contain unique elements.
@@ -1628,7 +1805,7 @@ class flat_map
1628
1805
  //!
1629
1806
  //! <b>Throws</b>: If the move assignment throws
1630
1807
  inline void adopt_sequence(ordered_unique_range_t, BOOST_RV_REF(sequence_type) seq)
1631
- { this->m_flat_tree.adopt_sequence_unique(ordered_unique_range_t(), boost::move(dtl::force<impl_sequence_type>(seq))); }
1808
+ { this->m_flat_tree.adopt_sequence_unique(ordered_unique_range_t(), boost::move(BOOST_CONTAINER_FORCE(impl_sequence_type, seq))); }
1632
1809
 
1633
1810
  //! <b>Effects</b>: Returns a const view of the underlying sequence.
1634
1811
  //!
@@ -1636,47 +1813,47 @@ class flat_map
1636
1813
  //!
1637
1814
  //! <b>Throws</b>: Nothing
1638
1815
  inline const sequence_type & sequence() const BOOST_NOEXCEPT
1639
- { return dtl::force<sequence_type>(m_flat_tree.get_sequence_cref()); }
1816
+ { return BOOST_CONTAINER_FORCE(sequence_type, m_flat_tree.get_sequence_cref()); }
1640
1817
 
1641
1818
  //! <b>Effects</b>: Returns true if x and y are equal
1642
1819
  //!
1643
1820
  //! <b>Complexity</b>: Linear to the number of elements in the container.
1644
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1821
+ BOOST_CONTAINER_NODISCARD inline
1645
1822
  friend bool operator==(const flat_map& x, const flat_map& y)
1646
1823
  { return x.size() == y.size() && ::boost::container::algo_equal(x.begin(), x.end(), y.begin()); }
1647
1824
 
1648
1825
  //! <b>Effects</b>: Returns true if x and y are unequal
1649
1826
  //!
1650
1827
  //! <b>Complexity</b>: Linear to the number of elements in the container.
1651
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1828
+ BOOST_CONTAINER_NODISCARD inline
1652
1829
  friend bool operator!=(const flat_map& x, const flat_map& y)
1653
1830
  { return !(x == y); }
1654
1831
 
1655
1832
  //! <b>Effects</b>: Returns true if x is less than y
1656
1833
  //!
1657
1834
  //! <b>Complexity</b>: Linear to the number of elements in the container.
1658
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1835
+ BOOST_CONTAINER_NODISCARD inline
1659
1836
  friend bool operator<(const flat_map& x, const flat_map& y)
1660
1837
  { return ::boost::container::algo_lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); }
1661
1838
 
1662
1839
  //! <b>Effects</b>: Returns true if x is greater than y
1663
1840
  //!
1664
1841
  //! <b>Complexity</b>: Linear to the number of elements in the container.
1665
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1842
+ BOOST_CONTAINER_NODISCARD inline
1666
1843
  friend bool operator>(const flat_map& x, const flat_map& y)
1667
1844
  { return y < x; }
1668
1845
 
1669
1846
  //! <b>Effects</b>: Returns true if x is equal or less than y
1670
1847
  //!
1671
1848
  //! <b>Complexity</b>: Linear to the number of elements in the container.
1672
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1849
+ BOOST_CONTAINER_NODISCARD inline
1673
1850
  friend bool operator<=(const flat_map& x, const flat_map& y)
1674
1851
  { return !(y < x); }
1675
1852
 
1676
1853
  //! <b>Effects</b>: Returns true if x is equal or greater than y
1677
1854
  //!
1678
1855
  //! <b>Complexity</b>: Linear to the number of elements in the container.
1679
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
1856
+ BOOST_CONTAINER_NODISCARD inline
1680
1857
  friend bool operator>=(const flat_map& x, const flat_map& y)
1681
1858
  { return !(x < y); }
1682
1859
 
@@ -1689,29 +1866,26 @@ class flat_map
1689
1866
 
1690
1867
  #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
1691
1868
  private:
1692
- mapped_type &priv_subscript(const key_type& k)
1693
- {
1694
- iterator i = this->lower_bound(k);
1695
- // i->first is greater than or equivalent to k.
1696
- if (i == end() || key_comp()(k, (*i).first)){
1697
- dtl::value_init<mapped_type> m;
1698
- impl_value_type v(k, ::boost::move(m.m_t));
1699
- i = dtl::force_copy<iterator>(this->m_flat_tree.insert_equal(::boost::move(v)));
1700
- }
1701
- return (*i).second;
1702
- }
1703
- mapped_type &priv_subscript(BOOST_RV_REF(key_type) mk)
1869
+ template<class K>
1870
+ inline mapped_type& priv_subscript(BOOST_FWD_REF(K) key)
1704
1871
  {
1705
- key_type &k = mk;
1872
+ const typename dtl::remove_cvref<K>::type & k = key; //Support emulated rvalue references
1706
1873
  iterator i = this->lower_bound(k);
1707
- // i->first is greater than or equivalent to k.
1874
+
1708
1875
  if (i == end() || key_comp()(k, (*i).first)) {
1709
- dtl::value_init<mapped_type> m;
1710
- impl_value_type v(::boost::move(k), ::boost::move(m.m_t));
1711
- i = dtl::force_copy<iterator>(this->m_flat_tree.insert_equal(::boost::move(v)));
1876
+ typename dtl::aligned_storage<sizeof(impl_value_type), dtl::alignment_of<impl_value_type>::value>::type v;
1877
+ impl_value_type *vp = move_detail::launder_cast<impl_value_type *>(&v);
1878
+
1879
+ impl_get_stored_allocator_noconst_return_t r = m_flat_tree.get_stored_allocator();
1880
+ boost::container::allocator_traits<impl_stored_allocator_type>::construct
1881
+ (r, vp, try_emplace_t(), ::boost::forward<K>(key));
1882
+ i = BOOST_CONTAINER_FORCECOPY(iterator, this->m_flat_tree.insert_equal
1883
+ (BOOST_CONTAINER_FORCECOPY(impl_iterator, i), ::boost::move(*vp)));
1884
+ vp->~impl_value_type();
1712
1885
  }
1713
1886
  return (*i).second;
1714
1887
  }
1888
+
1715
1889
  #endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
1716
1890
  };
1717
1891
 
@@ -1726,11 +1900,18 @@ inline typename flat_map<K, M, C, A>::size_type erase_if(flat_map<K, M, C, A>& c
1726
1900
 
1727
1901
  #ifndef BOOST_CONTAINER_NO_CXX17_CTAD
1728
1902
 
1903
+ //! <b>Deduction guide</b>: allows a `flat_map` to be constructed from the iterator
1904
+ //! range <code>[first, last)</code>, deducing the key and mapped types from the pair
1905
+ //! value type of `InputIterator` and using the default comparator and allocator.
1729
1906
  template <typename InputIterator>
1730
1907
  flat_map(InputIterator, InputIterator) ->
1731
1908
  flat_map< it_based_non_const_first_type_t<InputIterator>
1732
1909
  , it_based_second_type_t<InputIterator>>;
1733
1910
 
1911
+ //! <b>Deduction guide</b>: allows a `flat_map` to be constructed from the iterator
1912
+ //! range <code>[first, last)</code>, deducing the key and mapped types from
1913
+ //! `InputIterator`. The trailing argument is used as the allocator if it is an
1914
+ //! allocator type, otherwise it is used as the comparator.
1734
1915
  template < typename InputIterator, typename AllocatorOrCompare>
1735
1916
  flat_map(InputIterator, InputIterator, AllocatorOrCompare const&) ->
1736
1917
  flat_map< it_based_non_const_first_type_t<InputIterator>
@@ -1747,6 +1928,10 @@ template < typename InputIterator, typename AllocatorOrCompare>
1747
1928
  >::type
1748
1929
  >;
1749
1930
 
1931
+ //! <b>Deduction guide</b>: allows a `flat_map` to be constructed from the iterator
1932
+ //! range <code>[first, last)</code>, deducing the key and mapped types from
1933
+ //! `InputIterator` and taking the comparator and allocator types from the supplied
1934
+ //! arguments.
1750
1935
  template < typename InputIterator, typename Compare, typename Allocator
1751
1936
  , typename = dtl::require_nonallocator_t<Compare>
1752
1937
  , typename = dtl::require_allocator_t<Allocator>>
@@ -1756,11 +1941,18 @@ flat_map(InputIterator, InputIterator, Compare const&, Allocator const&) ->
1756
1941
  , Compare
1757
1942
  , Allocator>;
1758
1943
 
1944
+ //! <b>Deduction guide</b>: allows a `flat_map` to be constructed from an already
1945
+ //! ordered, unique iterator range <code>[first, last)</code>, deducing the key and
1946
+ //! mapped types from `InputIterator` and using the default comparator and allocator.
1759
1947
  template <typename InputIterator>
1760
1948
  flat_map(ordered_unique_range_t, InputIterator, InputIterator) ->
1761
1949
  flat_map< it_based_non_const_first_type_t<InputIterator>
1762
1950
  , it_based_second_type_t<InputIterator>>;
1763
1951
 
1952
+ //! <b>Deduction guide</b>: allows a `flat_map` to be constructed from an already
1953
+ //! ordered, unique iterator range <code>[first, last)</code>, deducing the key and
1954
+ //! mapped types from `InputIterator`. The trailing argument is used as the allocator
1955
+ //! if it is an allocator type, otherwise it is used as the comparator.
1764
1956
  template < typename InputIterator, typename AllocatorOrCompare>
1765
1957
  flat_map(ordered_unique_range_t, InputIterator, InputIterator, AllocatorOrCompare const&) ->
1766
1958
  flat_map< it_based_non_const_first_type_t<InputIterator>
@@ -1777,6 +1969,10 @@ flat_map(ordered_unique_range_t, InputIterator, InputIterator, AllocatorOrCompar
1777
1969
  >::type
1778
1970
  >;
1779
1971
 
1972
+ //! <b>Deduction guide</b>: allows a `flat_map` to be constructed from an already
1973
+ //! ordered, unique iterator range <code>[first, last)</code>, deducing the key and
1974
+ //! mapped types from `InputIterator` and taking the comparator and allocator types
1975
+ //! from the supplied arguments.
1780
1976
  template < typename InputIterator, typename Compare, typename Allocator
1781
1977
  , typename = dtl::require_nonallocator_t<Compare>
1782
1978
  , typename = dtl::require_allocator_t<Allocator>>
@@ -1917,7 +2113,7 @@ class flat_multimap
1917
2113
  typedef std::pair<Key, T> value_type;
1918
2114
  typedef typename BOOST_CONTAINER_IMPDEF(tree_t::sequence_type) sequence_type;
1919
2115
  typedef typename sequence_type::allocator_type allocator_type;
1920
- typedef ::boost::container::allocator_traits<allocator_type> allocator_traits_type;
2116
+ typedef boost::container::allocator_traits<allocator_type> allocator_traits_type;
1921
2117
  typedef typename sequence_type::pointer pointer;
1922
2118
  typedef typename sequence_type::const_pointer const_pointer;
1923
2119
  typedef typename sequence_type::reference reference;
@@ -1936,6 +2132,13 @@ class flat_multimap
1936
2132
  //AllocatorOrContainer::value_type must be std::pair<Key, T>
1937
2133
  BOOST_CONTAINER_STATIC_ASSERT((dtl::is_same<std::pair<Key, T>, value_type>::value));
1938
2134
 
2135
+ #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
2136
+ private:
2137
+ typedef std::pair<iterator, iterator> iterator_iterator_t;
2138
+ typedef std::pair<const_iterator, const_iterator> const_iterator_const_iterator_t;
2139
+ public:
2140
+ #endif
2141
+
1939
2142
  //////////////////////////////////////////////
1940
2143
  //
1941
2144
  // construct/copy/destroy
@@ -1955,7 +2158,7 @@ class flat_multimap
1955
2158
  //!
1956
2159
  //! <b>Complexity</b>: Constant.
1957
2160
  inline explicit flat_multimap(const allocator_type& a)
1958
- : m_flat_tree(dtl::force<const impl_allocator_type>(a))
2161
+ : m_flat_tree(BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
1959
2162
  {}
1960
2163
 
1961
2164
  //! <b>Effects</b>: Constructs an empty flat_multimap using the specified comparison
@@ -1972,7 +2175,7 @@ class flat_multimap
1972
2175
  //! <b>Complexity</b>: Constant.
1973
2176
  inline
1974
2177
  flat_multimap(const Compare& comp, const allocator_type& a)
1975
- : m_flat_tree(comp, dtl::force<const impl_allocator_type>(a))
2178
+ : m_flat_tree(comp, BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
1976
2179
  {}
1977
2180
 
1978
2181
  //! <b>Effects</b>: Constructs an empty flat_multimap
@@ -1994,7 +2197,7 @@ class flat_multimap
1994
2197
  template <class InputIterator>
1995
2198
  inline
1996
2199
  flat_multimap(InputIterator first, InputIterator last, const allocator_type& a)
1997
- : m_flat_tree(false, first, last, dtl::force<const impl_allocator_type>(a))
2200
+ : m_flat_tree(false, first, last, BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
1998
2201
  {}
1999
2202
 
2000
2203
  //! <b>Effects</b>: Constructs an empty flat_multimap using the specified comparison object
@@ -2016,7 +2219,7 @@ class flat_multimap
2016
2219
  template <class InputIterator>
2017
2220
  inline
2018
2221
  flat_multimap(InputIterator first, InputIterator last, const Compare& comp, const allocator_type& a)
2019
- : m_flat_tree(false, first, last, comp, dtl::force<const impl_allocator_type>(a))
2222
+ : m_flat_tree(false, first, last, comp, BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
2020
2223
  {}
2021
2224
 
2022
2225
  //! <b>Effects</b>: Constructs an empty flat_multimap
@@ -2088,8 +2291,8 @@ class flat_multimap
2088
2291
  inline
2089
2292
  flat_multimap(std::initializer_list<value_type> il)
2090
2293
  : m_flat_tree( false
2091
- , dtl::force<impl_initializer_list>(il).begin()
2092
- , dtl::force<impl_initializer_list>(il).end())
2294
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
2295
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end())
2093
2296
  {}
2094
2297
 
2095
2298
  //! <b>Effects</b>: Constructs an empty flat_map using the specified
@@ -2100,9 +2303,9 @@ class flat_multimap
2100
2303
  inline
2101
2304
  flat_multimap(std::initializer_list<value_type> il, const allocator_type& a)
2102
2305
  : m_flat_tree(false
2103
- , dtl::force<impl_initializer_list>(il).begin()
2104
- , dtl::force<impl_initializer_list>(il).end()
2105
- , dtl::force<const impl_allocator_type>(a))
2306
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
2307
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end()
2308
+ , BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
2106
2309
  {}
2107
2310
 
2108
2311
  //! <b>Effects</b>: Constructs an empty flat_map using the specified comparison object and
@@ -2113,8 +2316,8 @@ class flat_multimap
2113
2316
  inline
2114
2317
  flat_multimap(std::initializer_list<value_type> il, const Compare& comp)
2115
2318
  : m_flat_tree(false
2116
- , dtl::force<impl_initializer_list>(il).begin()
2117
- , dtl::force<impl_initializer_list>(il).end(), comp)
2319
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
2320
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end(), comp)
2118
2321
  {}
2119
2322
 
2120
2323
  //! <b>Effects</b>: Constructs an empty flat_map using the specified comparison object and
@@ -2125,9 +2328,9 @@ class flat_multimap
2125
2328
  inline
2126
2329
  flat_multimap(std::initializer_list<value_type> il, const Compare& comp, const allocator_type& a)
2127
2330
  : m_flat_tree( false
2128
- , dtl::force<impl_initializer_list>(il).begin()
2129
- , dtl::force<impl_initializer_list>(il).end()
2130
- , comp, dtl::force<const impl_allocator_type>(a))
2331
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
2332
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end()
2333
+ , comp, BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
2131
2334
  {}
2132
2335
 
2133
2336
  //! <b>Effects</b>: Constructs an empty flat_multimap and
@@ -2142,8 +2345,8 @@ class flat_multimap
2142
2345
  inline
2143
2346
  flat_multimap(ordered_range_t, std::initializer_list<value_type> il)
2144
2347
  : m_flat_tree( ordered_range
2145
- , dtl::force<impl_initializer_list>(il).begin()
2146
- , dtl::force<impl_initializer_list>(il).end())
2348
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
2349
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end())
2147
2350
  {}
2148
2351
 
2149
2352
  //! <b>Effects</b>: Constructs an empty flat_multimap using the specified comparison object and
@@ -2158,8 +2361,8 @@ class flat_multimap
2158
2361
  inline
2159
2362
  flat_multimap(ordered_range_t, std::initializer_list<value_type> il, const Compare& comp)
2160
2363
  : m_flat_tree( ordered_range
2161
- , dtl::force<impl_initializer_list>(il).begin()
2162
- , dtl::force<impl_initializer_list>(il).end(), comp)
2364
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
2365
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end(), comp)
2163
2366
  {}
2164
2367
 
2165
2368
  //! <b>Effects</b>: Constructs an empty flat_multimap using the specified comparison object and
@@ -2174,9 +2377,9 @@ class flat_multimap
2174
2377
  inline
2175
2378
  flat_multimap(ordered_range_t, std::initializer_list<value_type> il, const Compare& comp, const allocator_type& a)
2176
2379
  : m_flat_tree( ordered_range
2177
- , dtl::force<impl_initializer_list>(il).begin()
2178
- , dtl::force<impl_initializer_list>(il).end()
2179
- , comp, dtl::force<const impl_allocator_type>(a))
2380
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
2381
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end()
2382
+ , comp, BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
2180
2383
  {}
2181
2384
  #endif
2182
2385
 
@@ -2203,8 +2406,8 @@ class flat_multimap
2203
2406
  //!
2204
2407
  //! <b>Complexity</b>: Linear in x.size().
2205
2408
  inline
2206
- flat_multimap(const flat_multimap& x, const allocator_type &a)
2207
- : m_flat_tree(x.m_flat_tree, dtl::force<const impl_allocator_type>(a))
2409
+ flat_multimap(const flat_multimap& x, const BOOST_CONTAINER_DOC1ST(allocator_type, typename dtl::type_identity<allocator_type>::type) &a)
2410
+ : m_flat_tree(x.m_flat_tree, BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
2208
2411
  {}
2209
2412
 
2210
2413
  //! <b>Effects</b>: Move constructs a flat_multimap using the specified allocator.
@@ -2212,8 +2415,8 @@ class flat_multimap
2212
2415
  //!
2213
2416
  //! <b>Complexity</b>: Constant if a == x.get_allocator(), linear otherwise.
2214
2417
  inline
2215
- flat_multimap(BOOST_RV_REF(flat_multimap) x, const allocator_type &a)
2216
- : m_flat_tree(boost::move(x.m_flat_tree), dtl::force<const impl_allocator_type>(a))
2418
+ flat_multimap(BOOST_RV_REF(flat_multimap) x, const BOOST_CONTAINER_DOC1ST(allocator_type, typename dtl::type_identity<allocator_type>::type) &a)
2419
+ : m_flat_tree(boost::move(x.m_flat_tree), BOOST_CONTAINER_FORCE(const impl_allocator_type, a))
2217
2420
  {}
2218
2421
 
2219
2422
  //! <b>Effects</b>: Makes *this a copy of x.
@@ -2250,9 +2453,9 @@ class flat_multimap
2250
2453
  //! was passed to the object's constructor.
2251
2454
  //!
2252
2455
  //! <b>Complexity</b>: Constant.
2253
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2456
+ BOOST_CONTAINER_NODISCARD inline
2254
2457
  allocator_type get_allocator() const BOOST_NOEXCEPT_OR_NOTHROW
2255
- { return dtl::force_copy<allocator_type>(m_flat_tree.get_allocator()); }
2458
+ { return BOOST_CONTAINER_FORCECOPY(allocator_type, m_flat_tree.get_allocator()); }
2256
2459
 
2257
2460
  //! <b>Effects</b>: Returns a reference to the internal allocator.
2258
2461
  //!
@@ -2261,9 +2464,9 @@ class flat_multimap
2261
2464
  //! <b>Complexity</b>: Constant.
2262
2465
  //!
2263
2466
  //! <b>Note</b>: Non-standard extension.
2264
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2467
+ BOOST_CONTAINER_NODISCARD inline
2265
2468
  stored_allocator_type &get_stored_allocator() BOOST_NOEXCEPT_OR_NOTHROW
2266
- { return dtl::force<stored_allocator_type>(m_flat_tree.get_stored_allocator()); }
2469
+ { return BOOST_CONTAINER_FORCE(stored_allocator_type, m_flat_tree.get_stored_allocator()); }
2267
2470
 
2268
2471
  //! <b>Effects</b>: Returns a reference to the internal allocator.
2269
2472
  //!
@@ -2272,9 +2475,9 @@ class flat_multimap
2272
2475
  //! <b>Complexity</b>: Constant.
2273
2476
  //!
2274
2477
  //! <b>Note</b>: Non-standard extension.
2275
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2478
+ BOOST_CONTAINER_NODISCARD inline
2276
2479
  const stored_allocator_type &get_stored_allocator() const BOOST_NOEXCEPT_OR_NOTHROW
2277
- { return dtl::force<const stored_allocator_type>(m_flat_tree.get_stored_allocator()); }
2480
+ { return BOOST_CONTAINER_FORCE(const stored_allocator_type, m_flat_tree.get_stored_allocator()); }
2278
2481
 
2279
2482
  //////////////////////////////////////////////
2280
2483
  //
@@ -2287,36 +2490,36 @@ class flat_multimap
2287
2490
  //! <b>Throws</b>: Nothing.
2288
2491
  //!
2289
2492
  //! <b>Complexity</b>: Constant.
2290
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2493
+ BOOST_CONTAINER_NODISCARD inline
2291
2494
  iterator begin() BOOST_NOEXCEPT_OR_NOTHROW
2292
- { return dtl::force_copy<iterator>(m_flat_tree.begin()); }
2495
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.begin()); }
2293
2496
 
2294
2497
  //! <b>Effects</b>: Returns a const_iterator to the first element contained in the container.
2295
2498
  //!
2296
2499
  //! <b>Throws</b>: Nothing.
2297
2500
  //!
2298
2501
  //! <b>Complexity</b>: Constant.
2299
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2502
+ BOOST_CONTAINER_NODISCARD inline
2300
2503
  const_iterator begin() const BOOST_NOEXCEPT_OR_NOTHROW
2301
- { return dtl::force_copy<const_iterator>(m_flat_tree.begin()); }
2504
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.begin()); }
2302
2505
 
2303
2506
  //! <b>Effects</b>: Returns an iterator to the end of the container.
2304
2507
  //!
2305
2508
  //! <b>Throws</b>: Nothing.
2306
2509
  //!
2307
2510
  //! <b>Complexity</b>: Constant.
2308
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2511
+ BOOST_CONTAINER_NODISCARD inline
2309
2512
  iterator end() BOOST_NOEXCEPT_OR_NOTHROW
2310
- { return dtl::force_copy<iterator>(m_flat_tree.end()); }
2513
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.end()); }
2311
2514
 
2312
2515
  //! <b>Effects</b>: Returns a const_iterator to the end of the container.
2313
2516
  //!
2314
2517
  //! <b>Throws</b>: Nothing.
2315
2518
  //!
2316
2519
  //! <b>Complexity</b>: Constant.
2317
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2520
+ BOOST_CONTAINER_NODISCARD inline
2318
2521
  const_iterator end() const BOOST_NOEXCEPT_OR_NOTHROW
2319
- { return dtl::force_copy<const_iterator>(m_flat_tree.end()); }
2522
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.end()); }
2320
2523
 
2321
2524
  //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning
2322
2525
  //! of the reversed container.
@@ -2324,9 +2527,9 @@ class flat_multimap
2324
2527
  //! <b>Throws</b>: Nothing.
2325
2528
  //!
2326
2529
  //! <b>Complexity</b>: Constant.
2327
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2530
+ BOOST_CONTAINER_NODISCARD inline
2328
2531
  reverse_iterator rbegin() BOOST_NOEXCEPT_OR_NOTHROW
2329
- { return dtl::force_copy<reverse_iterator>(m_flat_tree.rbegin()); }
2532
+ { return BOOST_CONTAINER_FORCECOPY(reverse_iterator, m_flat_tree.rbegin()); }
2330
2533
 
2331
2534
  //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
2332
2535
  //! of the reversed container.
@@ -2334,9 +2537,9 @@ class flat_multimap
2334
2537
  //! <b>Throws</b>: Nothing.
2335
2538
  //!
2336
2539
  //! <b>Complexity</b>: Constant.
2337
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2540
+ BOOST_CONTAINER_NODISCARD inline
2338
2541
  const_reverse_iterator rbegin() const BOOST_NOEXCEPT_OR_NOTHROW
2339
- { return dtl::force_copy<const_reverse_iterator>(m_flat_tree.rbegin()); }
2542
+ { return BOOST_CONTAINER_FORCECOPY(const_reverse_iterator, m_flat_tree.rbegin()); }
2340
2543
 
2341
2544
  //! <b>Effects</b>: Returns a reverse_iterator pointing to the end
2342
2545
  //! of the reversed container.
@@ -2344,9 +2547,9 @@ class flat_multimap
2344
2547
  //! <b>Throws</b>: Nothing.
2345
2548
  //!
2346
2549
  //! <b>Complexity</b>: Constant.
2347
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2550
+ BOOST_CONTAINER_NODISCARD inline
2348
2551
  reverse_iterator rend() BOOST_NOEXCEPT_OR_NOTHROW
2349
- { return dtl::force_copy<reverse_iterator>(m_flat_tree.rend()); }
2552
+ { return BOOST_CONTAINER_FORCECOPY(reverse_iterator, m_flat_tree.rend()); }
2350
2553
 
2351
2554
  //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
2352
2555
  //! of the reversed container.
@@ -2354,27 +2557,27 @@ class flat_multimap
2354
2557
  //! <b>Throws</b>: Nothing.
2355
2558
  //!
2356
2559
  //! <b>Complexity</b>: Constant.
2357
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2560
+ BOOST_CONTAINER_NODISCARD inline
2358
2561
  const_reverse_iterator rend() const BOOST_NOEXCEPT_OR_NOTHROW
2359
- { return dtl::force_copy<const_reverse_iterator>(m_flat_tree.rend()); }
2562
+ { return BOOST_CONTAINER_FORCECOPY(const_reverse_iterator, m_flat_tree.rend()); }
2360
2563
 
2361
2564
  //! <b>Effects</b>: Returns a const_iterator to the first element contained in the container.
2362
2565
  //!
2363
2566
  //! <b>Throws</b>: Nothing.
2364
2567
  //!
2365
2568
  //! <b>Complexity</b>: Constant.
2366
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2569
+ BOOST_CONTAINER_NODISCARD inline
2367
2570
  const_iterator cbegin() const BOOST_NOEXCEPT_OR_NOTHROW
2368
- { return dtl::force_copy<const_iterator>(m_flat_tree.cbegin()); }
2571
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.cbegin()); }
2369
2572
 
2370
2573
  //! <b>Effects</b>: Returns a const_iterator to the end of the container.
2371
2574
  //!
2372
2575
  //! <b>Throws</b>: Nothing.
2373
2576
  //!
2374
2577
  //! <b>Complexity</b>: Constant.
2375
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2578
+ BOOST_CONTAINER_NODISCARD inline
2376
2579
  const_iterator cend() const BOOST_NOEXCEPT_OR_NOTHROW
2377
- { return dtl::force_copy<const_iterator>(m_flat_tree.cend()); }
2580
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.cend()); }
2378
2581
 
2379
2582
  //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
2380
2583
  //! of the reversed container.
@@ -2382,9 +2585,9 @@ class flat_multimap
2382
2585
  //! <b>Throws</b>: Nothing.
2383
2586
  //!
2384
2587
  //! <b>Complexity</b>: Constant.
2385
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2588
+ BOOST_CONTAINER_NODISCARD inline
2386
2589
  const_reverse_iterator crbegin() const BOOST_NOEXCEPT_OR_NOTHROW
2387
- { return dtl::force_copy<const_reverse_iterator>(m_flat_tree.crbegin()); }
2590
+ { return BOOST_CONTAINER_FORCECOPY(const_reverse_iterator, m_flat_tree.crbegin()); }
2388
2591
 
2389
2592
  //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
2390
2593
  //! of the reversed container.
@@ -2392,9 +2595,9 @@ class flat_multimap
2392
2595
  //! <b>Throws</b>: Nothing.
2393
2596
  //!
2394
2597
  //! <b>Complexity</b>: Constant.
2395
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2598
+ BOOST_CONTAINER_NODISCARD inline
2396
2599
  const_reverse_iterator crend() const BOOST_NOEXCEPT_OR_NOTHROW
2397
- { return dtl::force_copy<const_reverse_iterator>(m_flat_tree.crend()); }
2600
+ { return BOOST_CONTAINER_FORCECOPY(const_reverse_iterator, m_flat_tree.crend()); }
2398
2601
 
2399
2602
  //////////////////////////////////////////////
2400
2603
  //
@@ -2407,7 +2610,7 @@ class flat_multimap
2407
2610
  //! <b>Throws</b>: Nothing.
2408
2611
  //!
2409
2612
  //! <b>Complexity</b>: Constant.
2410
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2613
+ BOOST_CONTAINER_NODISCARD inline
2411
2614
  bool empty() const BOOST_NOEXCEPT_OR_NOTHROW
2412
2615
  { return m_flat_tree.empty(); }
2413
2616
 
@@ -2416,7 +2619,7 @@ class flat_multimap
2416
2619
  //! <b>Throws</b>: Nothing.
2417
2620
  //!
2418
2621
  //! <b>Complexity</b>: Constant.
2419
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2622
+ BOOST_CONTAINER_NODISCARD inline
2420
2623
  size_type size() const BOOST_NOEXCEPT_OR_NOTHROW
2421
2624
  { return m_flat_tree.size(); }
2422
2625
 
@@ -2425,7 +2628,7 @@ class flat_multimap
2425
2628
  //! <b>Throws</b>: Nothing.
2426
2629
  //!
2427
2630
  //! <b>Complexity</b>: Constant.
2428
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2631
+ BOOST_CONTAINER_NODISCARD inline
2429
2632
  size_type max_size() const BOOST_NOEXCEPT_OR_NOTHROW
2430
2633
  { return m_flat_tree.max_size(); }
2431
2634
 
@@ -2435,7 +2638,7 @@ class flat_multimap
2435
2638
  //! <b>Throws</b>: Nothing.
2436
2639
  //!
2437
2640
  //! <b>Complexity</b>: Constant.
2438
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2641
+ BOOST_CONTAINER_NODISCARD inline
2439
2642
  size_type capacity() const BOOST_NOEXCEPT_OR_NOTHROW
2440
2643
  { return m_flat_tree.capacity(); }
2441
2644
 
@@ -2464,24 +2667,24 @@ class flat_multimap
2464
2667
  { m_flat_tree.shrink_to_fit(); }
2465
2668
 
2466
2669
  //! @copydoc ::boost::container::flat_set::nth(size_type)
2467
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2670
+ BOOST_CONTAINER_NODISCARD inline
2468
2671
  iterator nth(size_type n) BOOST_NOEXCEPT_OR_NOTHROW
2469
- { return dtl::force_copy<iterator>(m_flat_tree.nth(n)); }
2672
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.nth(n)); }
2470
2673
 
2471
2674
  //! @copydoc ::boost::container::flat_set::nth(size_type) const
2472
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2675
+ BOOST_CONTAINER_NODISCARD inline
2473
2676
  const_iterator nth(size_type n) const BOOST_NOEXCEPT_OR_NOTHROW
2474
- { return dtl::force_copy<const_iterator>(m_flat_tree.nth(n)); }
2677
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.nth(n)); }
2475
2678
 
2476
2679
  //! @copydoc ::boost::container::flat_set::index_of(iterator)
2477
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2680
+ BOOST_CONTAINER_NODISCARD inline
2478
2681
  size_type index_of(iterator p) BOOST_NOEXCEPT_OR_NOTHROW
2479
- { return m_flat_tree.index_of(dtl::force_copy<impl_iterator>(p)); }
2682
+ { return m_flat_tree.index_of(BOOST_CONTAINER_FORCECOPY(impl_iterator, p)); }
2480
2683
 
2481
2684
  //! @copydoc ::boost::container::flat_set::index_of(const_iterator) const
2482
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2685
+ BOOST_CONTAINER_NODISCARD inline
2483
2686
  size_type index_of(const_iterator p) const BOOST_NOEXCEPT_OR_NOTHROW
2484
- { return m_flat_tree.index_of(dtl::force_copy<impl_const_iterator>(p)); }
2687
+ { return m_flat_tree.index_of(BOOST_CONTAINER_FORCECOPY(impl_const_iterator, p)); }
2485
2688
 
2486
2689
  #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
2487
2690
 
@@ -2496,7 +2699,7 @@ class flat_multimap
2496
2699
  template <class... Args>
2497
2700
  inline
2498
2701
  iterator emplace(BOOST_FWD_REF(Args)... args)
2499
- { return dtl::force_copy<iterator>(m_flat_tree.emplace_equal(boost::forward<Args>(args)...)); }
2702
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.emplace_equal(boost::forward<Args>(args)...)); }
2500
2703
 
2501
2704
  //! <b>Effects</b>: Inserts an object of type value_type constructed with
2502
2705
  //! std::forward<Args>(args)... in the container.
@@ -2514,8 +2717,8 @@ class flat_multimap
2514
2717
  inline
2515
2718
  iterator emplace_hint(const_iterator hint, BOOST_FWD_REF(Args)... args)
2516
2719
  {
2517
- return dtl::force_copy<iterator>(m_flat_tree.emplace_hint_equal
2518
- (dtl::force_copy<impl_const_iterator>(hint), boost::forward<Args>(args)...));
2720
+ return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.emplace_hint_equal
2721
+ (BOOST_CONTAINER_FORCECOPY(impl_const_iterator, hint), boost::forward<Args>(args)...));
2519
2722
  }
2520
2723
 
2521
2724
  #else // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
@@ -2523,13 +2726,13 @@ class flat_multimap
2523
2726
  #define BOOST_CONTAINER_FLAT_MULTIMAP_EMPLACE_CODE(N) \
2524
2727
  BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
2525
2728
  inline iterator emplace(BOOST_MOVE_UREF##N)\
2526
- { return dtl::force_copy<iterator>(m_flat_tree.emplace_equal(BOOST_MOVE_FWD##N)); }\
2729
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.emplace_equal(BOOST_MOVE_FWD##N)); }\
2527
2730
  \
2528
2731
  BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
2529
2732
  inline iterator emplace_hint(const_iterator hint BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
2530
2733
  {\
2531
- return dtl::force_copy<iterator>(m_flat_tree.emplace_hint_equal\
2532
- (dtl::force_copy<impl_const_iterator>(hint) BOOST_MOVE_I##N BOOST_MOVE_FWD##N));\
2734
+ return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.emplace_hint_equal\
2735
+ (BOOST_CONTAINER_FORCECOPY(impl_const_iterator, hint) BOOST_MOVE_I##N BOOST_MOVE_FWD##N));\
2533
2736
  }\
2534
2737
  //
2535
2738
  BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_FLAT_MULTIMAP_EMPLACE_CODE)
@@ -2546,8 +2749,8 @@ class flat_multimap
2546
2749
  //! <b>Note</b>: If an element is inserted it might invalidate elements.
2547
2750
  inline iterator insert(const value_type& x)
2548
2751
  {
2549
- return dtl::force_copy<iterator>(
2550
- m_flat_tree.insert_equal(dtl::force<const impl_value_type>(x)));
2752
+ return BOOST_CONTAINER_FORCECOPY(iterator,
2753
+ m_flat_tree.insert_equal(BOOST_CONTAINER_FORCE(const impl_value_type, x)));
2551
2754
  }
2552
2755
 
2553
2756
  //! <b>Effects</b>: Inserts a new value constructed from x and returns
@@ -2563,7 +2766,7 @@ class flat_multimap
2563
2766
  , typename dtl::enable_if_c<dtl::is_convertible<Pair BOOST_MOVE_I dtl_pair_t>::value
2564
2767
  BOOST_MOVE_I iterator >::type)
2565
2768
  insert(BOOST_FWD_REF(Pair) x)
2566
- { return dtl::force_copy<iterator>(m_flat_tree.emplace_equal(boost::forward<Pair>(x))); }
2769
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.emplace_equal(boost::forward<Pair>(x))); }
2567
2770
 
2568
2771
  //! <b>Effects</b>: Inserts a copy of x in the container.
2569
2772
  //! p is a hint pointing to where the insert should start to search.
@@ -2578,9 +2781,9 @@ class flat_multimap
2578
2781
  //! <b>Note</b>: If an element is inserted it might invalidate elements.
2579
2782
  inline iterator insert(const_iterator p, const value_type& x)
2580
2783
  {
2581
- return dtl::force_copy<iterator>
2582
- (m_flat_tree.insert_equal( dtl::force_copy<impl_const_iterator>(p)
2583
- , dtl::force<const impl_value_type>(x)));
2784
+ return BOOST_CONTAINER_FORCECOPY(iterator,
2785
+ m_flat_tree.insert_equal( BOOST_CONTAINER_FORCECOPY(impl_const_iterator, p)
2786
+ , BOOST_CONTAINER_FORCE(const impl_value_type, x)));
2584
2787
  }
2585
2788
 
2586
2789
  //! <b>Effects</b>: Inserts a value constructed from x in the container.
@@ -2601,8 +2804,8 @@ class flat_multimap
2601
2804
  BOOST_MOVE_I iterator>::type)
2602
2805
  insert(const_iterator p, BOOST_FWD_REF(Pair) x)
2603
2806
  {
2604
- return dtl::force_copy<iterator>(
2605
- m_flat_tree.emplace_hint_equal(dtl::force_copy<impl_const_iterator>(p), boost::forward<Pair>(x)));
2807
+ return BOOST_CONTAINER_FORCECOPY(iterator,
2808
+ m_flat_tree.emplace_hint_equal(BOOST_CONTAINER_FORCECOPY(impl_const_iterator, p), boost::forward<Pair>(x)));
2606
2809
  }
2607
2810
 
2608
2811
  //! <b>Requires</b>: first, last are not iterators into *this.
@@ -2614,7 +2817,7 @@ class flat_multimap
2614
2817
  //! <b>Note</b>: If an element is inserted it might invalidate elements.
2615
2818
  template <class InputIterator>
2616
2819
  inline void insert(InputIterator first, InputIterator last)
2617
- { m_flat_tree.insert_equal(first, last); }
2820
+ { m_flat_tree.insert_equal_range(first, last); }
2618
2821
 
2619
2822
  //! <b>Requires</b>: first, last are not iterators into *this.
2620
2823
  //!
@@ -2631,7 +2834,7 @@ class flat_multimap
2631
2834
  //! <b>Note</b>: Non-standard extension.
2632
2835
  template <class InputIterator>
2633
2836
  inline void insert(ordered_range_t, InputIterator first, InputIterator last)
2634
- { m_flat_tree.insert_equal(ordered_range, first, last); }
2837
+ { m_flat_tree.insert_equal_range(ordered_range, first, last); }
2635
2838
 
2636
2839
  #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
2637
2840
  //! <b>Effects</b>: inserts each element from the range [il.begin(), il.end()) .
@@ -2641,8 +2844,8 @@ class flat_multimap
2641
2844
  //! <b>Note</b>: If an element is inserted it might invalidate elements.
2642
2845
  inline void insert(std::initializer_list<value_type> il)
2643
2846
  {
2644
- m_flat_tree.insert_equal( dtl::force<impl_initializer_list>(il).begin()
2645
- , dtl::force<impl_initializer_list>(il).end());
2847
+ m_flat_tree.insert_equal_range( BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
2848
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end());
2646
2849
  }
2647
2850
 
2648
2851
  //! <b>Requires</b>: [il.begin(), il.end()) must be ordered according to the predicate.
@@ -2658,9 +2861,9 @@ class flat_multimap
2658
2861
  //! <b>Note</b>: Non-standard extension.
2659
2862
  inline void insert(ordered_range_t, std::initializer_list<value_type> il)
2660
2863
  {
2661
- m_flat_tree.insert_equal( ordered_range
2662
- , dtl::force<impl_initializer_list>(il).begin()
2663
- , dtl::force<impl_initializer_list>(il).end());
2864
+ m_flat_tree.insert_equal_range( ordered_range
2865
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).begin()
2866
+ , BOOST_CONTAINER_FORCE(impl_initializer_list, il).end());
2664
2867
  }
2665
2868
  #endif
2666
2869
 
@@ -2703,8 +2906,8 @@ class flat_multimap
2703
2906
  //! not less than the erased element.
2704
2907
  inline iterator erase(const_iterator p)
2705
2908
  {
2706
- return dtl::force_copy<iterator>(
2707
- m_flat_tree.erase(dtl::force_copy<impl_const_iterator>(p)));
2909
+ return BOOST_CONTAINER_FORCECOPY(iterator,
2910
+ m_flat_tree.erase(BOOST_CONTAINER_FORCECOPY(impl_const_iterator, p)));
2708
2911
  }
2709
2912
 
2710
2913
  //! <b>Effects</b>: Erases all elements in the container with key equivalent to x.
@@ -2743,9 +2946,9 @@ class flat_multimap
2743
2946
  //! linear to the elements with bigger keys.
2744
2947
  inline iterator erase(const_iterator first, const_iterator last)
2745
2948
  {
2746
- return dtl::force_copy<iterator>
2747
- (m_flat_tree.erase( dtl::force_copy<impl_const_iterator>(first)
2748
- , dtl::force_copy<impl_const_iterator>(last)));
2949
+ return BOOST_CONTAINER_FORCECOPY(iterator,
2950
+ m_flat_tree.erase( BOOST_CONTAINER_FORCECOPY(impl_const_iterator, first)
2951
+ , BOOST_CONTAINER_FORCECOPY(impl_const_iterator, last)));
2749
2952
  }
2750
2953
 
2751
2954
  //! <b>Effects</b>: Swaps the contents of *this and x.
@@ -2776,17 +2979,17 @@ class flat_multimap
2776
2979
  //! of which a was constructed.
2777
2980
  //!
2778
2981
  //! <b>Complexity</b>: Constant.
2779
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2982
+ BOOST_CONTAINER_NODISCARD inline
2780
2983
  key_compare key_comp() const
2781
- { return dtl::force_copy<key_compare>(m_flat_tree.key_comp()); }
2984
+ { return BOOST_CONTAINER_FORCECOPY(key_compare, m_flat_tree.key_comp()); }
2782
2985
 
2783
2986
  //! <b>Effects</b>: Returns an object of value_compare constructed out
2784
2987
  //! of the comparison object.
2785
2988
  //!
2786
2989
  //! <b>Complexity</b>: Constant.
2787
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
2990
+ BOOST_CONTAINER_NODISCARD inline
2788
2991
  value_compare value_comp() const
2789
- { return value_compare(dtl::force_copy<key_compare>(m_flat_tree.key_comp())); }
2992
+ { return value_compare(BOOST_CONTAINER_FORCECOPY(key_compare, m_flat_tree.key_comp())); }
2790
2993
 
2791
2994
  //////////////////////////////////////////////
2792
2995
  //
@@ -2798,17 +3001,17 @@ class flat_multimap
2798
3001
  //! equivalent to x, or end() if such an element is not found.
2799
3002
  //!
2800
3003
  //! <b>Complexity</b>: Logarithmic.
2801
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3004
+ BOOST_CONTAINER_NODISCARD inline
2802
3005
  iterator find(const key_type& x)
2803
- { return dtl::force_copy<iterator>(m_flat_tree.find(x)); }
3006
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.find(x)); }
2804
3007
 
2805
3008
  //! <b>Returns</b>: An const_iterator pointing to an element with the key
2806
3009
  //! equivalent to x, or end() if such an element is not found.
2807
3010
  //!
2808
3011
  //! <b>Complexity</b>: Logarithmic.
2809
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3012
+ BOOST_CONTAINER_NODISCARD inline
2810
3013
  const_iterator find(const key_type& x) const
2811
- { return dtl::force_copy<const_iterator>(m_flat_tree.find(x)); }
3014
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.find(x)); }
2812
3015
 
2813
3016
  //! <b>Requires</b>: This overload is available only if
2814
3017
  //! key_compare::is_transparent exists.
@@ -2818,9 +3021,9 @@ class flat_multimap
2818
3021
  //!
2819
3022
  //! <b>Complexity</b>: Logarithmic.
2820
3023
  template<class K>
2821
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3024
+ BOOST_CONTAINER_NODISCARD inline
2822
3025
  iterator find(const K& x)
2823
- { return dtl::force_copy<iterator>(m_flat_tree.find(x)); }
3026
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.find(x)); }
2824
3027
 
2825
3028
  //! <b>Requires</b>: This overload is available only if
2826
3029
  //! key_compare::is_transparent exists.
@@ -2830,14 +3033,14 @@ class flat_multimap
2830
3033
  //!
2831
3034
  //! <b>Complexity</b>: Logarithmic.
2832
3035
  template<class K>
2833
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3036
+ BOOST_CONTAINER_NODISCARD inline
2834
3037
  const_iterator find(const K& x) const
2835
- { return dtl::force_copy<const_iterator>(m_flat_tree.find(x)); }
3038
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.find(x)); }
2836
3039
 
2837
3040
  //! <b>Returns</b>: The number of elements with key equivalent to x.
2838
3041
  //!
2839
3042
  //! <b>Complexity</b>: log(size())+count(k)
2840
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3043
+ BOOST_CONTAINER_NODISCARD inline
2841
3044
  size_type count(const key_type& x) const
2842
3045
  { return m_flat_tree.count(x); }
2843
3046
 
@@ -2848,7 +3051,7 @@ class flat_multimap
2848
3051
  //!
2849
3052
  //! <b>Complexity</b>: log(size())+count(k)
2850
3053
  template<class K>
2851
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3054
+ BOOST_CONTAINER_NODISCARD inline
2852
3055
  size_type count(const K& x) const
2853
3056
  { return m_flat_tree.count(x); }
2854
3057
 
@@ -2856,7 +3059,7 @@ class flat_multimap
2856
3059
  //! equivalent to key in the container, otherwise false.
2857
3060
  //!
2858
3061
  //! <b>Complexity</b>: log(size()).
2859
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3062
+ BOOST_CONTAINER_NODISCARD inline
2860
3063
  bool contains(const key_type& x) const
2861
3064
  { return m_flat_tree.find(x) != m_flat_tree.end(); }
2862
3065
 
@@ -2868,7 +3071,7 @@ class flat_multimap
2868
3071
  //!
2869
3072
  //! <b>Complexity</b>: log(size()).
2870
3073
  template<typename K>
2871
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3074
+ BOOST_CONTAINER_NODISCARD inline
2872
3075
  bool contains(const K& x) const
2873
3076
  { return m_flat_tree.find(x) != m_flat_tree.end(); }
2874
3077
 
@@ -2876,17 +3079,17 @@ class flat_multimap
2876
3079
  //! than x, or end() if such an element is not found.
2877
3080
  //!
2878
3081
  //! <b>Complexity</b>: Logarithmic
2879
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3082
+ BOOST_CONTAINER_NODISCARD inline
2880
3083
  iterator lower_bound(const key_type& x)
2881
- { return dtl::force_copy<iterator>(m_flat_tree.lower_bound(x)); }
3084
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.lower_bound(x)); }
2882
3085
 
2883
3086
  //! <b>Returns</b>: An iterator pointing to the first element with key not less
2884
3087
  //! than x, or end() if such an element is not found.
2885
3088
  //!
2886
3089
  //! <b>Complexity</b>: Logarithmic
2887
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3090
+ BOOST_CONTAINER_NODISCARD inline
2888
3091
  const_iterator lower_bound(const key_type& x) const
2889
- { return dtl::force_copy<const_iterator>(m_flat_tree.lower_bound(x)); }
3092
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.lower_bound(x)); }
2890
3093
 
2891
3094
  //! <b>Requires</b>: This overload is available only if
2892
3095
  //! key_compare::is_transparent exists.
@@ -2896,9 +3099,9 @@ class flat_multimap
2896
3099
  //!
2897
3100
  //! <b>Complexity</b>: Logarithmic
2898
3101
  template<class K>
2899
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3102
+ BOOST_CONTAINER_NODISCARD inline
2900
3103
  iterator lower_bound(const K& x)
2901
- { return dtl::force_copy<iterator>(m_flat_tree.lower_bound(x)); }
3104
+ { return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.lower_bound(x)); }
2902
3105
 
2903
3106
  //! <b>Requires</b>: This overload is available only if
2904
3107
  //! key_compare::is_transparent exists.
@@ -2908,25 +3111,25 @@ class flat_multimap
2908
3111
  //!
2909
3112
  //! <b>Complexity</b>: Logarithmic
2910
3113
  template<class K>
2911
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3114
+ BOOST_CONTAINER_NODISCARD inline
2912
3115
  const_iterator lower_bound(const K& x) const
2913
- { return dtl::force_copy<const_iterator>(m_flat_tree.lower_bound(x)); }
3116
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.lower_bound(x)); }
2914
3117
 
2915
3118
  //! <b>Returns</b>: An iterator pointing to the first element with key greater
2916
3119
  //! than x, or end() if such an element is not found.
2917
3120
  //!
2918
3121
  //! <b>Complexity</b>: Logarithmic
2919
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3122
+ BOOST_CONTAINER_NODISCARD inline
2920
3123
  iterator upper_bound(const key_type& x)
2921
- {return dtl::force_copy<iterator>(m_flat_tree.upper_bound(x)); }
3124
+ {return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.upper_bound(x)); }
2922
3125
 
2923
3126
  //! <b>Returns</b>: A const iterator pointing to the first element with key
2924
3127
  //! greater than x, or end() if such an element is not found.
2925
3128
  //!
2926
3129
  //! <b>Complexity</b>: Logarithmic
2927
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3130
+ BOOST_CONTAINER_NODISCARD inline
2928
3131
  const_iterator upper_bound(const key_type& x) const
2929
- { return dtl::force_copy<const_iterator>(m_flat_tree.upper_bound(x)); }
3132
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.upper_bound(x)); }
2930
3133
 
2931
3134
  //! <b>Requires</b>: This overload is available only if
2932
3135
  //! key_compare::is_transparent exists.
@@ -2936,9 +3139,9 @@ class flat_multimap
2936
3139
  //!
2937
3140
  //! <b>Complexity</b>: Logarithmic
2938
3141
  template<class K>
2939
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3142
+ BOOST_CONTAINER_NODISCARD inline
2940
3143
  iterator upper_bound(const K& x)
2941
- {return dtl::force_copy<iterator>(m_flat_tree.upper_bound(x)); }
3144
+ {return BOOST_CONTAINER_FORCECOPY(iterator, m_flat_tree.upper_bound(x)); }
2942
3145
 
2943
3146
  //! <b>Requires</b>: This overload is available only if
2944
3147
  //! key_compare::is_transparent exists.
@@ -2948,23 +3151,23 @@ class flat_multimap
2948
3151
  //!
2949
3152
  //! <b>Complexity</b>: Logarithmic
2950
3153
  template<class K>
2951
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3154
+ BOOST_CONTAINER_NODISCARD inline
2952
3155
  const_iterator upper_bound(const K& x) const
2953
- { return dtl::force_copy<const_iterator>(m_flat_tree.upper_bound(x)); }
3156
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator, m_flat_tree.upper_bound(x)); }
2954
3157
 
2955
3158
  //! <b>Effects</b>: Equivalent to std::make_pair(this->lower_bound(k), this->upper_bound(k)).
2956
3159
  //!
2957
3160
  //! <b>Complexity</b>: Logarithmic
2958
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3161
+ BOOST_CONTAINER_NODISCARD inline
2959
3162
  std::pair<iterator,iterator> equal_range(const key_type& x)
2960
- { return dtl::force_copy<std::pair<iterator,iterator> >(m_flat_tree.equal_range(x)); }
3163
+ { return BOOST_CONTAINER_FORCECOPY(iterator_iterator_t, m_flat_tree.equal_range(x)); }
2961
3164
 
2962
3165
  //! <b>Effects</b>: Equivalent to std::make_pair(this->lower_bound(k), this->upper_bound(k)).
2963
3166
  //!
2964
3167
  //! <b>Complexity</b>: Logarithmic
2965
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3168
+ BOOST_CONTAINER_NODISCARD inline
2966
3169
  std::pair<const_iterator, const_iterator> equal_range(const key_type& x) const
2967
- { return dtl::force_copy<std::pair<const_iterator,const_iterator> >(m_flat_tree.equal_range(x)); }
3170
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator_const_iterator_t, m_flat_tree.equal_range(x)); }
2968
3171
 
2969
3172
  //! <b>Requires</b>: This overload is available only if
2970
3173
  //! key_compare::is_transparent exists.
@@ -2973,9 +3176,9 @@ class flat_multimap
2973
3176
  //!
2974
3177
  //! <b>Complexity</b>: Logarithmic
2975
3178
  template<class K>
2976
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3179
+ BOOST_CONTAINER_NODISCARD inline
2977
3180
  std::pair<iterator,iterator> equal_range(const K& x)
2978
- { return dtl::force_copy<std::pair<iterator,iterator> >(m_flat_tree.equal_range(x)); }
3181
+ { return BOOST_CONTAINER_FORCECOPY(iterator_iterator_t, m_flat_tree.equal_range(x)); }
2979
3182
 
2980
3183
  //! <b>Requires</b>: This overload is available only if
2981
3184
  //! key_compare::is_transparent exists.
@@ -2984,9 +3187,9 @@ class flat_multimap
2984
3187
  //!
2985
3188
  //! <b>Complexity</b>: Logarithmic
2986
3189
  template<class K>
2987
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3190
+ BOOST_CONTAINER_NODISCARD inline
2988
3191
  std::pair<const_iterator, const_iterator> equal_range(const K& x) const
2989
- { return dtl::force_copy<std::pair<const_iterator,const_iterator> >(m_flat_tree.equal_range(x)); }
3192
+ { return BOOST_CONTAINER_FORCECOPY(const_iterator_const_iterator_t, m_flat_tree.equal_range(x)); }
2990
3193
 
2991
3194
  //! <b>Effects</b>: Extracts the internal sequence container.
2992
3195
  //!
@@ -2995,9 +3198,9 @@ class flat_multimap
2995
3198
  //! <b>Postcondition</b>: this->empty()
2996
3199
  //!
2997
3200
  //! <b>Throws</b>: If secuence_type's move constructor throws
2998
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3201
+ BOOST_CONTAINER_NODISCARD inline
2999
3202
  sequence_type extract_sequence()
3000
- { return boost::move(dtl::force<sequence_type>(m_flat_tree.get_sequence_ref())); }
3203
+ { return boost::move(BOOST_CONTAINER_FORCE(sequence_type, m_flat_tree.get_sequence_ref())); }
3001
3204
 
3002
3205
  //! <b>Effects</b>: Discards the internally hold sequence container and adopts the
3003
3206
  //! one passed externally using the move assignment.
@@ -3006,7 +3209,7 @@ class flat_multimap
3006
3209
  //!
3007
3210
  //! <b>Throws</b>: If the comparison or the move constructor throws
3008
3211
  inline void adopt_sequence(BOOST_RV_REF(sequence_type) seq)
3009
- { this->m_flat_tree.adopt_sequence_equal(boost::move(dtl::force<impl_sequence_type>(seq))); }
3212
+ { this->m_flat_tree.adopt_sequence_equal(boost::move(BOOST_CONTAINER_FORCE(impl_sequence_type, seq))); }
3010
3213
 
3011
3214
  //! <b>Requires</b>: seq shall be ordered according to this->compare().
3012
3215
  //!
@@ -3017,7 +3220,7 @@ class flat_multimap
3017
3220
  //!
3018
3221
  //! <b>Throws</b>: If the move assignment throws
3019
3222
  inline void adopt_sequence(ordered_range_t, BOOST_RV_REF(sequence_type) seq)
3020
- { this->m_flat_tree.adopt_sequence_equal(ordered_range_t(), boost::move(dtl::force<impl_sequence_type>(seq))); }
3223
+ { this->m_flat_tree.adopt_sequence_equal(ordered_range_t(), boost::move(BOOST_CONTAINER_FORCE(impl_sequence_type, seq))); }
3021
3224
 
3022
3225
  //! <b>Effects</b>: Returns a const view of the underlying sequence.
3023
3226
  //!
@@ -3025,47 +3228,47 @@ class flat_multimap
3025
3228
  //!
3026
3229
  //! <b>Throws</b>: Nothing
3027
3230
  inline const sequence_type & sequence() const BOOST_NOEXCEPT
3028
- { return dtl::force<sequence_type>(m_flat_tree.get_sequence_cref()); }
3231
+ { return BOOST_CONTAINER_FORCE(sequence_type, m_flat_tree.get_sequence_cref()); }
3029
3232
 
3030
3233
  //! <b>Effects</b>: Returns true if x and y are equal
3031
3234
  //!
3032
3235
  //! <b>Complexity</b>: Linear to the number of elements in the container.
3033
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3236
+ BOOST_CONTAINER_NODISCARD inline
3034
3237
  friend bool operator==(const flat_multimap& x, const flat_multimap& y)
3035
3238
  { return x.size() == y.size() && ::boost::container::algo_equal(x.begin(), x.end(), y.begin()); }
3036
3239
 
3037
3240
  //! <b>Effects</b>: Returns true if x and y are unequal
3038
3241
  //!
3039
3242
  //! <b>Complexity</b>: Linear to the number of elements in the container.
3040
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3243
+ BOOST_CONTAINER_NODISCARD inline
3041
3244
  friend bool operator!=(const flat_multimap& x, const flat_multimap& y)
3042
3245
  { return !(x == y); }
3043
3246
 
3044
3247
  //! <b>Effects</b>: Returns true if x is less than y
3045
3248
  //!
3046
3249
  //! <b>Complexity</b>: Linear to the number of elements in the container.
3047
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3250
+ BOOST_CONTAINER_NODISCARD inline
3048
3251
  friend bool operator<(const flat_multimap& x, const flat_multimap& y)
3049
3252
  { return ::boost::container::algo_lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); }
3050
3253
 
3051
3254
  //! <b>Effects</b>: Returns true if x is greater than y
3052
3255
  //!
3053
3256
  //! <b>Complexity</b>: Linear to the number of elements in the container.
3054
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3257
+ BOOST_CONTAINER_NODISCARD inline
3055
3258
  friend bool operator>(const flat_multimap& x, const flat_multimap& y)
3056
3259
  { return y < x; }
3057
3260
 
3058
3261
  //! <b>Effects</b>: Returns true if x is equal or less than y
3059
3262
  //!
3060
3263
  //! <b>Complexity</b>: Linear to the number of elements in the container.
3061
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3264
+ BOOST_CONTAINER_NODISCARD inline
3062
3265
  friend bool operator<=(const flat_multimap& x, const flat_multimap& y)
3063
3266
  { return !(y < x); }
3064
3267
 
3065
3268
  //! <b>Effects</b>: Returns true if x is equal or greater than y
3066
3269
  //!
3067
3270
  //! <b>Complexity</b>: Linear to the number of elements in the container.
3068
- BOOST_CONTAINER_ATTRIBUTE_NODISCARD inline
3271
+ BOOST_CONTAINER_NODISCARD inline
3069
3272
  friend bool operator>=(const flat_multimap& x, const flat_multimap& y)
3070
3273
  { return !(x < y); }
3071
3274
 
@@ -3092,11 +3295,18 @@ inline typename flat_multimap<K, M, C, A>::size_type erase_if(flat_multimap<K, M
3092
3295
 
3093
3296
  #ifndef BOOST_CONTAINER_NO_CXX17_CTAD
3094
3297
 
3298
+ //! <b>Deduction guide</b>: allows a `flat_multimap` to be constructed from the
3299
+ //! iterator range <code>[first, last)</code>, deducing the key and mapped types from
3300
+ //! the pair value type of `InputIterator` and using the default comparator and allocator.
3095
3301
  template <typename InputIterator>
3096
3302
  flat_multimap(InputIterator, InputIterator) ->
3097
3303
  flat_multimap< it_based_non_const_first_type_t<InputIterator>
3098
3304
  , it_based_second_type_t<InputIterator>>;
3099
3305
 
3306
+ //! <b>Deduction guide</b>: allows a `flat_multimap` to be constructed from the
3307
+ //! iterator range <code>[first, last)</code>, deducing the key and mapped types from
3308
+ //! `InputIterator`. The trailing argument is used as the allocator if it is an
3309
+ //! allocator type, otherwise it is used as the comparator.
3100
3310
  template < typename InputIterator, typename AllocatorOrCompare>
3101
3311
  flat_multimap(InputIterator, InputIterator, AllocatorOrCompare const&) ->
3102
3312
  flat_multimap< it_based_non_const_first_type_t<InputIterator>
@@ -3113,6 +3323,10 @@ flat_multimap(InputIterator, InputIterator, AllocatorOrCompare const&) ->
3113
3323
  >::type
3114
3324
  >;
3115
3325
 
3326
+ //! <b>Deduction guide</b>: allows a `flat_multimap` to be constructed from the
3327
+ //! iterator range <code>[first, last)</code>, deducing the key and mapped types from
3328
+ //! `InputIterator` and taking the comparator and allocator types from the supplied
3329
+ //! arguments.
3116
3330
  template < typename InputIterator, typename Compare, typename Allocator
3117
3331
  , typename = dtl::require_nonallocator_t<Compare>
3118
3332
  , typename = dtl::require_allocator_t<Allocator>>
@@ -3122,11 +3336,18 @@ flat_multimap(InputIterator, InputIterator, Compare const&, Allocator const&) ->
3122
3336
  , Compare
3123
3337
  , Allocator>;
3124
3338
 
3339
+ //! <b>Deduction guide</b>: allows a `flat_multimap` to be constructed from an already
3340
+ //! ordered iterator range <code>[first, last)</code>, deducing the key and mapped
3341
+ //! types from `InputIterator` and using the default comparator and allocator.
3125
3342
  template <typename InputIterator>
3126
3343
  flat_multimap(ordered_range_t, InputIterator, InputIterator) ->
3127
3344
  flat_multimap< it_based_non_const_first_type_t<InputIterator>
3128
3345
  , it_based_second_type_t<InputIterator>>;
3129
3346
 
3347
+ //! <b>Deduction guide</b>: allows a `flat_multimap` to be constructed from an already
3348
+ //! ordered iterator range <code>[first, last)</code>, deducing the key and mapped
3349
+ //! types from `InputIterator`. The trailing argument is used as the allocator if it
3350
+ //! is an allocator type, otherwise it is used as the comparator.
3130
3351
  template < typename InputIterator, typename AllocatorOrCompare>
3131
3352
  flat_multimap(ordered_range_t, InputIterator, InputIterator, AllocatorOrCompare const&) ->
3132
3353
  flat_multimap< it_based_non_const_first_type_t<InputIterator>
@@ -3143,6 +3364,10 @@ flat_multimap(ordered_range_t, InputIterator, InputIterator, AllocatorOrCompare
3143
3364
  >::type
3144
3365
  >;
3145
3366
 
3367
+ //! <b>Deduction guide</b>: allows a `flat_multimap` to be constructed from an already
3368
+ //! ordered iterator range <code>[first, last)</code>, deducing the key and mapped
3369
+ //! types from `InputIterator` and taking the comparator and allocator types from the
3370
+ //! supplied arguments.
3146
3371
  template < typename InputIterator, typename Compare, typename Allocator
3147
3372
  , typename = dtl::require_nonallocator_t<Compare>
3148
3373
  , typename = dtl::require_allocator_t<Allocator>>