react-native-windows 0.84.0-preview.9 → 0.84.1

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 (954) hide show
  1. package/Common/unicode.cpp +36 -0
  2. package/Common/unicode.h +8 -0
  3. package/Directory.Build.props +2 -17
  4. package/Folly/ThreadNameStub.cpp +4 -6
  5. package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp +5 -0
  6. package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.cpp +91 -23
  7. package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.h +11 -0
  8. package/Microsoft.ReactNative/Fabric/Composition/ParagraphComponentView.cpp +6 -4
  9. package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp +28 -6
  10. package/Microsoft.ReactNative/Fabric/Composition/TextDrawing.cpp +1 -1
  11. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +1 -1
  12. package/Microsoft.ReactNative/Fabric/Composition/TooltipService.cpp +80 -0
  13. package/Microsoft.ReactNative/Fabric/Composition/TooltipService.h +17 -0
  14. package/Microsoft.ReactNative/Fabric/platform/react/renderer/textlayoutmanager/WindowsTextLayoutManager.cpp +1 -1
  15. package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +4 -9
  16. package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj.filters +0 -3
  17. package/Microsoft.ReactNative/Utils/LocalBundleReader.cpp +33 -25
  18. package/Microsoft.ReactNative/Utils/LocalBundleReader.h +5 -3
  19. package/Microsoft.ReactNative/Utils/UwpScriptStore.cpp +2 -2
  20. package/Microsoft.ReactNative/Utils/UwpScriptStore.h +3 -2
  21. package/Microsoft.ReactNative.Managed/Microsoft.ReactNative.Managed.csproj +3 -3
  22. package/Microsoft.ReactNative.Managed.CodeGen/Microsoft.ReactNative.Managed.CodeGen.csproj +10 -10
  23. package/Microsoft.ReactNative.Managed.CodeGen/Properties/PublishProfiles/DeployAsTool-Debug.pubxml +1 -1
  24. package/Microsoft.ReactNative.Managed.CodeGen/Properties/PublishProfiles/DeployAsTool-Release.pubxml +1 -1
  25. package/PropertySheets/CIBuildOptimizations.props +2 -2
  26. package/PropertySheets/Generated/PackageVersion.g.props +3 -3
  27. package/PropertySheets/JSEngine.props +1 -1
  28. package/PropertySheets/NuGet.LockFile.props +10 -1
  29. package/PropertySheets/React.Cpp.props +7 -6
  30. package/PropertySheets/WinUI.props +2 -2
  31. package/ReactCommon/ReactCommon.vcxproj +0 -5
  32. package/Scripts/JustMyXaml.ps1 +8 -8
  33. package/Scripts/NuGetRestoreForceEvaluateAllSolutions.ps1 +61 -6
  34. package/Scripts/Tfs/Layout-Desktop-Headers.ps1 +4 -37
  35. package/Scripts/UnitTest.ps1 +3 -1
  36. package/Scripts/UpdateNightlyDependencies.ps1 +47 -0
  37. package/Scripts/creaternwapp.cmd +5 -8
  38. package/Scripts/creaternwlib.cmd +10 -23
  39. package/Scripts/rnw-dependencies.ps1 +15 -16
  40. package/Shared/DevSupportManager.cpp +55 -48
  41. package/Shared/DevSupportManager.h +0 -1
  42. package/Shared/Modules/IWebSocketModuleContentHandler.h +15 -0
  43. package/Shared/Modules/WebSocketModule.cpp +8 -3
  44. package/Shared/Networking/DefaultBlobResource.cpp +37 -0
  45. package/Shared/Networking/DefaultBlobResource.h +12 -0
  46. package/Shared/Networking/WinRTWebSocketResource.h +5 -1
  47. package/Shared/Shared.vcxitems +2 -0
  48. package/{Folly → external}/.clang-format +0 -1
  49. package/external/External.vcxitems +10 -0
  50. package/external/fast-float/.syncignore +10 -0
  51. package/external/fast-float/LICENSE-APACHE +190 -0
  52. package/external/fast-float/LICENSE-BOOST +23 -0
  53. package/external/fast-float/LICENSE-MIT +27 -0
  54. package/external/fast-float/README.md +545 -0
  55. package/external/fast-float/cgmanifest.json +15 -0
  56. package/external/fast-float/fast-float.vcxitems +14 -0
  57. package/external/fast-float/include/fast_float/ascii_number.h +588 -0
  58. package/external/fast-float/include/fast_float/bigint.h +638 -0
  59. package/external/fast-float/include/fast_float/constexpr_feature_detect.h +46 -0
  60. package/external/fast-float/include/fast_float/decimal_to_binary.h +212 -0
  61. package/external/fast-float/include/fast_float/digit_comparison.h +457 -0
  62. package/external/fast-float/include/fast_float/fast_float.h +59 -0
  63. package/external/fast-float/include/fast_float/fast_table.h +708 -0
  64. package/external/fast-float/include/fast_float/float_common.h +1240 -0
  65. package/external/fast-float/include/fast_float/parse_number.h +399 -0
  66. package/external/fast-float/sync-config.json +8 -0
  67. package/external/fmt/.syncignore +10 -0
  68. package/external/fmt/CONTRIBUTING.md +20 -0
  69. package/external/fmt/LICENSE +27 -0
  70. package/external/fmt/README.md +484 -0
  71. package/external/fmt/doc/ChangeLog-old.md +3290 -0
  72. package/external/fmt/doc/api.md +650 -0
  73. package/external/fmt/doc/fmt.css +61 -0
  74. package/external/fmt/doc/fmt.js +4 -0
  75. package/external/fmt/doc/get-started.md +222 -0
  76. package/external/fmt/doc/index.md +151 -0
  77. package/external/fmt/doc/perf.svg +1 -0
  78. package/external/fmt/doc/python-license.txt +290 -0
  79. package/external/fmt/doc/syntax.md +887 -0
  80. package/external/fmt/fmt.vcxitems +28 -0
  81. package/external/fmt/include/fmt/args.h +228 -0
  82. package/external/fmt/include/fmt/base.h +3077 -0
  83. package/external/fmt/include/fmt/chrono.h +2432 -0
  84. package/external/fmt/include/fmt/color.h +612 -0
  85. package/external/fmt/include/fmt/compile.h +529 -0
  86. package/external/fmt/include/fmt/core.h +5 -0
  87. package/external/fmt/include/fmt/format-inl.h +1928 -0
  88. package/external/fmt/include/fmt/format.h +4427 -0
  89. package/external/fmt/include/fmt/os.h +439 -0
  90. package/external/fmt/include/fmt/ostream.h +211 -0
  91. package/external/fmt/include/fmt/printf.h +656 -0
  92. package/external/fmt/include/fmt/ranges.h +882 -0
  93. package/external/fmt/include/fmt/std.h +699 -0
  94. package/external/fmt/include/fmt/xchar.h +322 -0
  95. package/external/fmt/src/fmt.cc +135 -0
  96. package/external/fmt/src/format.cc +43 -0
  97. package/external/fmt/src/os.cc +403 -0
  98. package/external/fmt/sync-config.json +8 -0
  99. package/external/folly/.syncignore +60 -0
  100. package/external/folly/LICENSE +200 -0
  101. package/external/folly/README.md +263 -0
  102. package/{fmt → external/folly/folly}/.clang-format +0 -1
  103. package/external/folly/folly/AtomicHashArray-inl.h +546 -0
  104. package/external/folly/folly/AtomicHashArray.h +431 -0
  105. package/external/folly/folly/AtomicHashMap-inl.h +653 -0
  106. package/external/folly/folly/AtomicHashMap.h +484 -0
  107. package/external/folly/folly/AtomicIntrusiveLinkedList.h +206 -0
  108. package/external/folly/folly/AtomicLinkedList.h +110 -0
  109. package/external/folly/folly/AtomicUnorderedMap.h +522 -0
  110. package/external/folly/folly/BUCK +1631 -0
  111. package/external/folly/folly/BUILD_MODE.bzl +72 -0
  112. package/external/folly/folly/Benchmark.cpp +986 -0
  113. package/external/folly/folly/Benchmark.h +680 -0
  114. package/external/folly/folly/BenchmarkUtil.h +47 -0
  115. package/external/folly/folly/Bits.h +17 -0
  116. package/external/folly/folly/CMakeLists.txt +110 -0
  117. package/external/folly/folly/CPortability.h +338 -0
  118. package/external/folly/folly/CancellationToken-inl.h +449 -0
  119. package/external/folly/folly/CancellationToken.cpp +250 -0
  120. package/external/folly/folly/CancellationToken.h +365 -0
  121. package/external/folly/folly/Chrono.h +132 -0
  122. package/external/folly/folly/ClockGettimeWrappers.cpp +93 -0
  123. package/external/folly/folly/ClockGettimeWrappers.h +29 -0
  124. package/external/folly/folly/ConcurrentBitSet.h +157 -0
  125. package/external/folly/folly/ConcurrentLazy.h +74 -0
  126. package/external/folly/folly/ConcurrentSkipList-inl.h +341 -0
  127. package/external/folly/folly/ConcurrentSkipList.h +824 -0
  128. package/external/folly/folly/ConstructorCallbackList.h +158 -0
  129. package/external/folly/folly/Conv.h +2026 -0
  130. package/external/folly/folly/CppAttributes.h +170 -0
  131. package/external/folly/folly/CpuId.h +297 -0
  132. package/external/folly/folly/DefaultKeepAliveExecutor.h +172 -0
  133. package/external/folly/folly/Demangle.cpp +255 -0
  134. package/external/folly/folly/Demangle.h +73 -0
  135. package/external/folly/folly/DiscriminatedPtr.h +236 -0
  136. package/external/folly/folly/DynamicConverter.h +17 -0
  137. package/external/folly/folly/Exception.h +150 -0
  138. package/external/folly/folly/ExceptionString.cpp +51 -0
  139. package/external/folly/folly/ExceptionString.h +33 -0
  140. package/external/folly/folly/ExceptionWrapper-inl.h +264 -0
  141. package/external/folly/folly/ExceptionWrapper.cpp +37 -0
  142. package/external/folly/folly/ExceptionWrapper.h +377 -0
  143. package/external/folly/folly/Executor.cpp +111 -0
  144. package/external/folly/folly/Executor.h +351 -0
  145. package/external/folly/folly/Expected.h +1725 -0
  146. package/external/folly/folly/FBString.h +2888 -0
  147. package/external/folly/folly/FBVector.h +17 -0
  148. package/external/folly/folly/File.cpp +180 -0
  149. package/external/folly/folly/File.h +177 -0
  150. package/external/folly/folly/FileUtil.cpp +378 -0
  151. package/external/folly/folly/FileUtil.h +332 -0
  152. package/external/folly/folly/Fingerprint.cpp +135 -0
  153. package/external/folly/folly/Fingerprint.h +289 -0
  154. package/external/folly/folly/FixedString.h +2965 -0
  155. package/external/folly/folly/FollyMemcpy.cpp +30 -0
  156. package/external/folly/folly/FollyMemcpy.h +23 -0
  157. package/external/folly/folly/FollyMemset.cpp +29 -0
  158. package/external/folly/folly/FollyMemset.h +25 -0
  159. package/external/folly/folly/Format-inl.h +1152 -0
  160. package/external/folly/folly/Format.cpp +429 -0
  161. package/external/folly/folly/Format.h +463 -0
  162. package/external/folly/folly/FormatArg.h +285 -0
  163. package/external/folly/folly/FormatTraits.h +65 -0
  164. package/external/folly/folly/Function.h +1159 -0
  165. package/external/folly/folly/GLog.h +85 -0
  166. package/external/folly/folly/GroupVarint.cpp +153 -0
  167. package/external/folly/folly/GroupVarint.h +630 -0
  168. package/external/folly/folly/Hash.h +20 -0
  169. package/external/folly/folly/IPAddress.cpp +490 -0
  170. package/external/folly/folly/IPAddress.h +667 -0
  171. package/external/folly/folly/IPAddressException.h +82 -0
  172. package/external/folly/folly/IPAddressV4.cpp +305 -0
  173. package/external/folly/folly/IPAddressV4.h +495 -0
  174. package/external/folly/folly/IPAddressV6.cpp +541 -0
  175. package/external/folly/folly/IPAddressV6.h +627 -0
  176. package/external/folly/folly/Indestructible.h +164 -0
  177. package/external/folly/folly/IndexedMemPool.h +550 -0
  178. package/external/folly/folly/IntrusiveList.h +17 -0
  179. package/external/folly/folly/Lazy.h +142 -0
  180. package/external/folly/folly/Likely.h +76 -0
  181. package/external/folly/folly/MPMCPipeline.h +280 -0
  182. package/external/folly/folly/MPMCQueue.h +1556 -0
  183. package/external/folly/folly/MacAddress.cpp +188 -0
  184. package/external/folly/folly/MacAddress.h +260 -0
  185. package/external/folly/folly/MapUtil.h +17 -0
  186. package/external/folly/folly/Math.h +258 -0
  187. package/external/folly/folly/MaybeManagedPtr.h +120 -0
  188. package/external/folly/folly/Memory.h +900 -0
  189. package/external/folly/folly/MicroLock.cpp +76 -0
  190. package/external/folly/folly/MicroLock.h +354 -0
  191. package/external/folly/folly/MicroSpinLock.h +17 -0
  192. package/external/folly/folly/MoveWrapper.h +76 -0
  193. package/external/folly/folly/ObserverContainer.h +1026 -0
  194. package/external/folly/folly/Optional.h +743 -0
  195. package/external/folly/folly/Overload.h +325 -0
  196. package/external/folly/folly/PackedSyncPtr.h +147 -0
  197. package/external/folly/folly/Padded.h +464 -0
  198. package/external/folly/folly/Poly-inl.h +230 -0
  199. package/external/folly/folly/Poly.h +1095 -0
  200. package/external/folly/folly/PolyException.h +43 -0
  201. package/external/folly/folly/Portability.h +644 -0
  202. package/external/folly/folly/Preprocessor.h +236 -0
  203. package/external/folly/folly/ProducerConsumerQueue.h +182 -0
  204. package/external/folly/folly/RWSpinLock.h +17 -0
  205. package/external/folly/folly/Random-inl.h +86 -0
  206. package/external/folly/folly/Random.cpp +184 -0
  207. package/external/folly/folly/Random.h +434 -0
  208. package/external/folly/folly/Range.h +1772 -0
  209. package/external/folly/folly/Replaceable.h +636 -0
  210. package/external/folly/folly/ScopeGuard.cpp +29 -0
  211. package/external/folly/folly/ScopeGuard.h +420 -0
  212. package/external/folly/folly/SharedMutex.cpp +81 -0
  213. package/external/folly/folly/SharedMutex.h +1751 -0
  214. package/external/folly/folly/Singleton-inl.h +332 -0
  215. package/external/folly/folly/Singleton.cpp +512 -0
  216. package/external/folly/folly/Singleton.h +891 -0
  217. package/external/folly/folly/SingletonThreadLocal.cpp +53 -0
  218. package/external/folly/folly/SingletonThreadLocal.h +263 -0
  219. package/external/folly/folly/SocketAddress.cpp +786 -0
  220. package/external/folly/folly/SocketAddress.h +768 -0
  221. package/external/folly/folly/SpinLock.h +55 -0
  222. package/external/folly/folly/String-inl.h +668 -0
  223. package/external/folly/folly/String.cpp +777 -0
  224. package/external/folly/folly/String.h +767 -0
  225. package/external/folly/folly/Subprocess.cpp +1142 -0
  226. package/external/folly/folly/Subprocess.h +1055 -0
  227. package/external/folly/folly/Synchronized.h +1833 -0
  228. package/external/folly/folly/SynchronizedPtr.h +106 -0
  229. package/external/folly/folly/ThreadCachedInt.h +175 -0
  230. package/external/folly/folly/ThreadLocal.h +478 -0
  231. package/external/folly/folly/TimeoutQueue.cpp +78 -0
  232. package/external/folly/folly/TimeoutQueue.h +123 -0
  233. package/external/folly/folly/TokenBucket.h +673 -0
  234. package/external/folly/folly/Traits.h +1442 -0
  235. package/external/folly/folly/Try-inl.h +372 -0
  236. package/external/folly/folly/Try.cpp +23 -0
  237. package/external/folly/folly/Try.h +728 -0
  238. package/external/folly/folly/UTF8String.h +56 -0
  239. package/external/folly/folly/Unicode.cpp +201 -0
  240. package/external/folly/folly/Unicode.h +94 -0
  241. package/external/folly/folly/Unit.h +65 -0
  242. package/external/folly/folly/Uri-inl.h +101 -0
  243. package/external/folly/folly/Uri.cpp +190 -0
  244. package/external/folly/folly/Uri.h +142 -0
  245. package/external/folly/folly/Utility.h +932 -0
  246. package/external/folly/folly/VERSION +1 -0
  247. package/external/folly/folly/Varint.h +230 -0
  248. package/external/folly/folly/VirtualExecutor.h +17 -0
  249. package/external/folly/folly/algorithm/simd/BUCK +47 -0
  250. package/external/folly/folly/algorithm/simd/Contains.cpp +42 -0
  251. package/external/folly/folly/algorithm/simd/Contains.h +116 -0
  252. package/external/folly/folly/algorithm/simd/FindFixed.h +301 -0
  253. package/external/folly/folly/algorithm/simd/Ignore.h +52 -0
  254. package/external/folly/folly/algorithm/simd/Movemask.h +207 -0
  255. package/external/folly/folly/algorithm/simd/detail/BUCK +70 -0
  256. package/external/folly/folly/algorithm/simd/detail/ContainsImpl.h +91 -0
  257. package/external/folly/folly/algorithm/simd/detail/SimdAnyOf.h +83 -0
  258. package/external/folly/folly/algorithm/simd/detail/SimdForEach.h +209 -0
  259. package/external/folly/folly/algorithm/simd/detail/SimdPlatform.h +445 -0
  260. package/external/folly/folly/algorithm/simd/detail/Traits.h +125 -0
  261. package/external/folly/folly/algorithm/simd/detail/UnrollUtils.h +126 -0
  262. package/external/folly/folly/base64.h +264 -0
  263. package/external/folly/folly/chrono/BUCK +29 -0
  264. package/external/folly/folly/chrono/Clock.h +65 -0
  265. package/external/folly/folly/chrono/Conv.h +712 -0
  266. package/external/folly/folly/chrono/test/BUCK +26 -0
  267. package/external/folly/folly/chrono/test/ClockTest.cpp +68 -0
  268. package/external/folly/folly/chrono/test/ConvTest.cpp +652 -0
  269. package/external/folly/folly/concurrency/AtomicSharedPtr.h +387 -0
  270. package/external/folly/folly/concurrency/BUCK +170 -0
  271. package/external/folly/folly/concurrency/CacheLocality.h +460 -0
  272. package/external/folly/folly/concurrency/ConcurrentHashMap.h +822 -0
  273. package/external/folly/folly/concurrency/CoreCachedSharedPtr.h +232 -0
  274. package/external/folly/folly/concurrency/DeadlockDetector.cpp +27 -0
  275. package/external/folly/folly/concurrency/DeadlockDetector.h +44 -0
  276. package/external/folly/folly/concurrency/DynamicBoundedQueue.h +751 -0
  277. package/external/folly/folly/concurrency/PriorityUnboundedQueueSet.h +207 -0
  278. package/external/folly/folly/concurrency/ProcessLocalUniqueId.cpp +46 -0
  279. package/external/folly/folly/concurrency/ProcessLocalUniqueId.h +38 -0
  280. package/external/folly/folly/concurrency/SingletonRelaxedCounter.h +325 -0
  281. package/external/folly/folly/concurrency/ThreadCachedSynchronized.h +227 -0
  282. package/external/folly/folly/concurrency/UnboundedQueue.h +891 -0
  283. package/external/folly/folly/concurrency/container/BUCK +77 -0
  284. package/external/folly/folly/concurrency/container/FlatCombiningPriorityQueue.h +426 -0
  285. package/external/folly/folly/concurrency/container/LockFreeRingBuffer.h +306 -0
  286. package/external/folly/folly/concurrency/container/RelaxedConcurrentPriorityQueue.h +1212 -0
  287. package/external/folly/folly/concurrency/container/SingleWriterFixedHashMap.h +322 -0
  288. package/external/folly/folly/concurrency/container/atomic_grow_array.h +564 -0
  289. package/external/folly/folly/concurrency/container/test/BUCK +75 -0
  290. package/external/folly/folly/concurrency/container/test/FlatCombiningPriorityQueueTest.cpp +570 -0
  291. package/external/folly/folly/concurrency/container/test/LockFreeRingBufferTest.cpp +276 -0
  292. package/external/folly/folly/concurrency/container/test/RelaxedConcurrentPriorityQueueTest.cpp +1570 -0
  293. package/external/folly/folly/concurrency/container/test/SingleWriterFixedHashMapTest.cpp +401 -0
  294. package/external/folly/folly/concurrency/container/test/atomic_grow_array_test.cpp +187 -0
  295. package/external/folly/folly/concurrency/detail/AtomicSharedPtr-detail.h +212 -0
  296. package/external/folly/folly/concurrency/detail/ConcurrentHashMap-detail.h +1911 -0
  297. package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.cpp +43 -0
  298. package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.h +190 -0
  299. package/external/folly/folly/concurrency/memory/BUCK +53 -0
  300. package/external/folly/folly/concurrency/memory/PrimaryPtr.h +338 -0
  301. package/external/folly/folly/concurrency/memory/ReadMostlySharedPtr.h +511 -0
  302. package/external/folly/folly/concurrency/memory/TLRefCount.h +228 -0
  303. package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrBenchmark.cpp +56 -0
  304. package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrTest.cpp +454 -0
  305. package/external/folly/folly/concurrency/memory/test/BUCK +95 -0
  306. package/external/folly/folly/concurrency/memory/test/PrimaryPtrTest.cpp +303 -0
  307. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrBenchmark.cpp +138 -0
  308. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrStressTest.cpp +75 -0
  309. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrTest.cpp +378 -0
  310. package/external/folly/folly/concurrency/memory/test/RefCountBenchmark.cpp +90 -0
  311. package/external/folly/folly/concurrency/memory/test/RefCountTest.cpp +168 -0
  312. package/external/folly/folly/concurrency/test/AtomicSharedPtrCounted.h +156 -0
  313. package/external/folly/folly/concurrency/test/AtomicSharedPtrPerformance.cpp +255 -0
  314. package/external/folly/folly/concurrency/test/AtomicSharedPtrTest.cpp +257 -0
  315. package/external/folly/folly/concurrency/test/BUCK +229 -0
  316. package/external/folly/folly/concurrency/test/CacheLocalityBenchmark.cpp +392 -0
  317. package/external/folly/folly/concurrency/test/CacheLocalityTest.cpp +1229 -0
  318. package/external/folly/folly/concurrency/test/ConcurrentHashMapBench.cpp +260 -0
  319. package/external/folly/folly/concurrency/test/ConcurrentHashMapTest.cpp +1242 -0
  320. package/external/folly/folly/concurrency/test/CoreCachedSharedPtrTest.cpp +408 -0
  321. package/external/folly/folly/concurrency/test/DynamicBoundedQueueTest.cpp +984 -0
  322. package/external/folly/folly/concurrency/test/PriorityUnboundedQueueSetTest.cpp +73 -0
  323. package/external/folly/folly/concurrency/test/ProcessLocalUniqueIdTest.cpp +66 -0
  324. package/external/folly/folly/concurrency/test/SingletonRelaxedCounterBench.cpp +101 -0
  325. package/external/folly/folly/concurrency/test/SingletonRelaxedCounterTest.cpp +185 -0
  326. package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedBench.cpp +76 -0
  327. package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedTest.cpp +93 -0
  328. package/external/folly/folly/concurrency/test/UnboundedQueueTest.cpp +1302 -0
  329. package/external/folly/folly/container/Access.h +57 -0
  330. package/external/folly/folly/container/Array.h +87 -0
  331. package/external/folly/folly/container/BUCK +353 -0
  332. package/external/folly/folly/container/BitIterator.h +203 -0
  333. package/external/folly/folly/container/Enumerate.h +162 -0
  334. package/external/folly/folly/container/EvictingCacheMap.h +730 -0
  335. package/external/folly/folly/container/F14.md +300 -0
  336. package/external/folly/folly/container/F14Map-fwd.h +113 -0
  337. package/external/folly/folly/container/F14Map.h +2108 -0
  338. package/external/folly/folly/container/F14Set-fwd.h +95 -0
  339. package/external/folly/folly/container/F14Set.h +1603 -0
  340. package/external/folly/folly/container/FBVector.h +1711 -0
  341. package/external/folly/folly/container/Foreach-inl.h +316 -0
  342. package/external/folly/folly/container/Foreach.h +209 -0
  343. package/external/folly/folly/container/HeterogeneousAccess-fwd.h +33 -0
  344. package/external/folly/folly/container/HeterogeneousAccess.h +171 -0
  345. package/external/folly/folly/container/IntrusiveHeap.h +268 -0
  346. package/external/folly/folly/container/IntrusiveList.h +131 -0
  347. package/external/folly/folly/container/Iterator.h +843 -0
  348. package/external/folly/folly/container/MapUtil.h +376 -0
  349. package/external/folly/folly/container/Merge.h +90 -0
  350. package/external/folly/folly/container/RegexMatchCache.cpp +521 -0
  351. package/external/folly/folly/container/RegexMatchCache.h +699 -0
  352. package/external/folly/folly/container/Reserve.h +109 -0
  353. package/external/folly/folly/container/SparseByteSet.h +123 -0
  354. package/external/folly/folly/container/View.h +81 -0
  355. package/external/folly/folly/container/WeightedEvictingCacheMap.h +651 -0
  356. package/external/folly/folly/container/detail/BUCK +115 -0
  357. package/external/folly/folly/container/detail/BitIteratorDetail.h +87 -0
  358. package/external/folly/folly/container/detail/F14Defaults.h +34 -0
  359. package/external/folly/folly/container/detail/F14IntrinsicsAvailability.h +67 -0
  360. package/external/folly/folly/container/detail/F14MapFallback.h +717 -0
  361. package/external/folly/folly/container/detail/F14Mask.h +235 -0
  362. package/external/folly/folly/container/detail/F14Policy.h +1523 -0
  363. package/external/folly/folly/container/detail/F14SetFallback.h +528 -0
  364. package/external/folly/folly/container/detail/F14Table.cpp +71 -0
  365. package/external/folly/folly/container/detail/F14Table.h +2680 -0
  366. package/external/folly/folly/container/detail/Util.h +303 -0
  367. package/external/folly/folly/container/detail/tape_detail.h +135 -0
  368. package/external/folly/folly/container/detail/test/BUCK +14 -0
  369. package/external/folly/folly/container/detail/test/F14DetailTest.cpp +47 -0
  370. package/external/folly/folly/container/heap_vector_types.h +1683 -0
  371. package/external/folly/folly/container/range_traits.h +81 -0
  372. package/external/folly/folly/container/small_vector.h +1476 -0
  373. package/external/folly/folly/container/sorted_vector_types.h +1652 -0
  374. package/external/folly/folly/container/span.h +408 -0
  375. package/external/folly/folly/container/tape.h +608 -0
  376. package/external/folly/folly/container/test/.clang-tidy +12 -0
  377. package/external/folly/folly/container/test/AccessTest.cpp +138 -0
  378. package/external/folly/folly/container/test/ArrayTest.cpp +84 -0
  379. package/external/folly/folly/container/test/BUCK +568 -0
  380. package/external/folly/folly/container/test/BitIteratorBench.cpp +112 -0
  381. package/external/folly/folly/container/test/BitIteratorTest.cpp +109 -0
  382. package/external/folly/folly/container/test/EnumerateTest.cpp +294 -0
  383. package/external/folly/folly/container/test/EvictingCacheMapBench.cpp +80 -0
  384. package/external/folly/folly/container/test/EvictingCacheMapTest.cpp +842 -0
  385. package/external/folly/folly/container/test/F14AsanSupportTest.cpp +143 -0
  386. package/external/folly/folly/container/test/F14FwdTest.cpp +37 -0
  387. package/external/folly/folly/container/test/F14InterprocessTest.cpp +404 -0
  388. package/external/folly/folly/container/test/F14MapTest.cpp +2543 -0
  389. package/external/folly/folly/container/test/F14PolicyTest.cpp +49 -0
  390. package/external/folly/folly/container/test/F14SetTest.cpp +1738 -0
  391. package/external/folly/folly/container/test/F14SmallOverheads.cpp +215 -0
  392. package/external/folly/folly/container/test/F14TestUtil.h +117 -0
  393. package/external/folly/folly/container/test/FBVectorBenchmark.cpp +380 -0
  394. package/external/folly/folly/container/test/FBVectorBenchmarks.cpp.h +100 -0
  395. package/external/folly/folly/container/test/FBVectorTest.cpp +326 -0
  396. package/external/folly/folly/container/test/FBVectorTests.cpp.h +304 -0
  397. package/external/folly/folly/container/test/ForeachBenchmark.cpp +388 -0
  398. package/external/folly/folly/container/test/ForeachTest.cpp +338 -0
  399. package/external/folly/folly/container/test/HashMapsBench.cpp +458 -0
  400. package/external/folly/folly/container/test/HeterogeneousAccessTest.cpp +242 -0
  401. package/external/folly/folly/container/test/IntrusiveHeapTest.cpp +262 -0
  402. package/external/folly/folly/container/test/IteratorTest.cpp +989 -0
  403. package/external/folly/folly/container/test/MapUtilTest.cpp +365 -0
  404. package/external/folly/folly/container/test/MergeTest.cpp +66 -0
  405. package/external/folly/folly/container/test/RegexMatchCacheTest.cpp +634 -0
  406. package/external/folly/folly/container/test/ReserveTest.cpp +173 -0
  407. package/external/folly/folly/container/test/SparseByteSetBenchmark.cpp +153 -0
  408. package/external/folly/folly/container/test/SparseByteSetTest.cpp +117 -0
  409. package/external/folly/folly/container/test/TrackingTypes.h +584 -0
  410. package/external/folly/folly/container/test/UtilTest.cpp +609 -0
  411. package/external/folly/folly/container/test/WeightedEvictingCacheMapTest.cpp +800 -0
  412. package/external/folly/folly/container/test/heap_vector_types_test.cpp +1774 -0
  413. package/external/folly/folly/container/test/range_traits_test.cpp +59 -0
  414. package/external/folly/folly/container/test/small_vector_test.cpp +1571 -0
  415. package/external/folly/folly/container/test/sorted_vector_test.cpp +1589 -0
  416. package/external/folly/folly/container/test/span_test.cpp +520 -0
  417. package/external/folly/folly/container/test/tape_bench.cpp +200 -0
  418. package/external/folly/folly/container/test/tape_test.cpp +590 -0
  419. package/external/folly/folly/defs.bzl +238 -0
  420. package/external/folly/folly/detail/AsyncTrace.cpp +36 -0
  421. package/external/folly/folly/detail/AsyncTrace.h +44 -0
  422. package/external/folly/folly/detail/AtomicHashUtils.h +42 -0
  423. package/external/folly/folly/detail/AtomicUnorderedMapUtils.h +80 -0
  424. package/external/folly/folly/detail/BUCK +406 -0
  425. package/external/folly/folly/detail/DiscriminatedPtrDetail.h +172 -0
  426. package/external/folly/folly/detail/FileUtilDetail.cpp +63 -0
  427. package/external/folly/folly/detail/FileUtilDetail.h +85 -0
  428. package/external/folly/folly/detail/FileUtilVectorDetail.h +81 -0
  429. package/external/folly/folly/detail/FingerprintPolynomial.h +132 -0
  430. package/external/folly/folly/detail/Futex-inl.h +123 -0
  431. package/external/folly/folly/detail/Futex.cpp +273 -0
  432. package/external/folly/folly/detail/Futex.h +109 -0
  433. package/external/folly/folly/detail/GroupVarintDetail.h +101 -0
  434. package/external/folly/folly/detail/IPAddress.cpp +37 -0
  435. package/external/folly/folly/detail/IPAddress.h +57 -0
  436. package/external/folly/folly/detail/IPAddressSource.h +278 -0
  437. package/external/folly/folly/detail/Iterators.h +156 -0
  438. package/external/folly/folly/detail/MPMCPipelineDetail.h +122 -0
  439. package/external/folly/folly/detail/MemoryIdler.cpp +233 -0
  440. package/external/folly/folly/detail/MemoryIdler.h +216 -0
  441. package/external/folly/folly/detail/PerfScoped.cpp +112 -0
  442. package/external/folly/folly/detail/PerfScoped.h +70 -0
  443. package/external/folly/folly/detail/PolyDetail.h +921 -0
  444. package/external/folly/folly/detail/RangeCommon.cpp +55 -0
  445. package/external/folly/folly/detail/RangeCommon.h +93 -0
  446. package/external/folly/folly/detail/RangeSse42.cpp +198 -0
  447. package/external/folly/folly/detail/RangeSse42.h +30 -0
  448. package/external/folly/folly/detail/SimpleSimdStringUtils.cpp +31 -0
  449. package/external/folly/folly/detail/SimpleSimdStringUtils.h +27 -0
  450. package/external/folly/folly/detail/SimpleSimdStringUtilsImpl.h +63 -0
  451. package/external/folly/folly/detail/Singleton.h +34 -0
  452. package/external/folly/folly/detail/SlowFingerprint.h +90 -0
  453. package/external/folly/folly/detail/SocketFastOpen.cpp +175 -0
  454. package/external/folly/folly/detail/SocketFastOpen.h +89 -0
  455. package/external/folly/folly/detail/SplitStringSimd.cpp +84 -0
  456. package/external/folly/folly/detail/SplitStringSimd.h +151 -0
  457. package/external/folly/folly/detail/SplitStringSimdImpl.h +149 -0
  458. package/external/folly/folly/detail/Sse.cpp +35 -0
  459. package/external/folly/folly/detail/Sse.h +45 -0
  460. package/external/folly/folly/detail/StaticSingletonManager.cpp +119 -0
  461. package/external/folly/folly/detail/StaticSingletonManager.h +298 -0
  462. package/external/folly/folly/detail/ThreadLocalDetail.cpp +492 -0
  463. package/external/folly/folly/detail/ThreadLocalDetail.h +800 -0
  464. package/external/folly/folly/detail/TrapOnAvx512.cpp +41 -0
  465. package/external/folly/folly/detail/TrapOnAvx512.h +21 -0
  466. package/external/folly/folly/detail/TurnSequencer.h +295 -0
  467. package/external/folly/folly/detail/TypeList.h +551 -0
  468. package/external/folly/folly/detail/UniqueInstance.cpp +136 -0
  469. package/external/folly/folly/detail/UniqueInstance.h +68 -0
  470. package/external/folly/folly/detail/base64_detail/BUCK +102 -0
  471. package/external/folly/folly/detail/base64_detail/Base64Api.cpp +40 -0
  472. package/external/folly/folly/detail/base64_detail/Base64Api.h +101 -0
  473. package/external/folly/folly/detail/base64_detail/Base64Common.h +80 -0
  474. package/external/folly/folly/detail/base64_detail/Base64Constants.h +79 -0
  475. package/external/folly/folly/detail/base64_detail/Base64HiddenConstants.h +129 -0
  476. package/external/folly/folly/detail/base64_detail/Base64SWAR.cpp +161 -0
  477. package/external/folly/folly/detail/base64_detail/Base64SWAR.h +32 -0
  478. package/external/folly/folly/detail/base64_detail/Base64Scalar.h +262 -0
  479. package/external/folly/folly/detail/base64_detail/Base64Simd.h +102 -0
  480. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.cpp +42 -0
  481. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.h +33 -0
  482. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2_Platform.h +167 -0
  483. package/external/folly/folly/detail/base64_detail/README.md +392 -0
  484. package/external/folly/folly/detail/base64_detail/tests/BUCK +36 -0
  485. package/external/folly/folly/detail/base64_detail/tests/Base64AgainstScalarTest.cpp +141 -0
  486. package/external/folly/folly/detail/base64_detail/tests/Base64PlatformTest.cpp +273 -0
  487. package/external/folly/folly/detail/base64_detail/tests/Base64SpecialCasesTest.cpp +555 -0
  488. package/external/folly/folly/detail/test/AsyncTraceTest.cpp +43 -0
  489. package/external/folly/folly/detail/test/BUCK +118 -0
  490. package/external/folly/folly/detail/test/FileUtilDetailTest.cpp +56 -0
  491. package/external/folly/folly/detail/test/PerfScopedTest.cpp +107 -0
  492. package/external/folly/folly/detail/test/SimpleSimdStringUtilsTest.cpp +92 -0
  493. package/external/folly/folly/detail/test/SplitStringSimdTest.cpp +242 -0
  494. package/external/folly/folly/detail/test/StaticSingletonManagerTest.cpp +121 -0
  495. package/external/folly/folly/detail/test/ThreadLocalBenchmark.cpp +116 -0
  496. package/external/folly/folly/detail/test/ThreadLocalDetailTest.cpp +194 -0
  497. package/external/folly/folly/detail/test/TrapOnAvx512TestNegative.cpp +29 -0
  498. package/external/folly/folly/detail/test/UniqueInstanceTest.cpp +60 -0
  499. package/external/folly/folly/detail/thread_local_globals.cpp +69 -0
  500. package/external/folly/folly/detail/thread_local_globals.h +36 -0
  501. package/external/folly/folly/docs/AtomicHashMap.md +134 -0
  502. package/external/folly/folly/docs/Benchmark.md +310 -0
  503. package/external/folly/folly/docs/Conv.md +291 -0
  504. package/external/folly/folly/docs/Dynamic.md +220 -0
  505. package/external/folly/folly/docs/DynamicConverter.md +71 -0
  506. package/external/folly/folly/docs/Executors.md +63 -0
  507. package/external/folly/folly/docs/FBString.md +46 -0
  508. package/external/folly/folly/docs/FBVector.md +200 -0
  509. package/external/folly/folly/docs/Fbvector--graphical_solutions.png +0 -0
  510. package/external/folly/folly/docs/Format.md +177 -0
  511. package/external/folly/folly/docs/Function.md +92 -0
  512. package/external/folly/folly/docs/Futures.md +263 -0
  513. package/external/folly/folly/docs/GroupVarint.md +46 -0
  514. package/external/folly/folly/docs/Histogram.md +104 -0
  515. package/external/folly/folly/docs/MapUtils.md +80 -0
  516. package/external/folly/folly/docs/Overview.md +263 -0
  517. package/external/folly/folly/docs/PackedSyncPtr.md +77 -0
  518. package/external/folly/folly/docs/Poly.md +500 -0
  519. package/external/folly/folly/docs/ProducerConsumerQueue.md +82 -0
  520. package/external/folly/folly/docs/Rcu.md +218 -0
  521. package/external/folly/folly/docs/SmallLocks.md +24 -0
  522. package/external/folly/folly/docs/Synchronized.md +793 -0
  523. package/external/folly/folly/docs/ThreadCachedInt.md +98 -0
  524. package/external/folly/folly/docs/ThreadLocal.md +105 -0
  525. package/external/folly/folly/docs/Traits.md +161 -0
  526. package/external/folly/folly/docs/small_vector.md +64 -0
  527. package/external/folly/folly/docs/style.css +23 -0
  528. package/external/folly/folly/dynamic-inl.h +17 -0
  529. package/external/folly/folly/dynamic.h +17 -0
  530. package/external/folly/folly/folly_extended_library.bzl +28 -0
  531. package/external/folly/folly/functional/ApplyTuple.h +204 -0
  532. package/external/folly/folly/functional/BUCK +57 -0
  533. package/external/folly/folly/functional/Invoke.h +880 -0
  534. package/external/folly/folly/functional/Partial.h +130 -0
  535. package/external/folly/folly/functional/protocol.h +203 -0
  536. package/external/folly/folly/functional/test/ApplyTupleTest.cpp +549 -0
  537. package/external/folly/folly/functional/test/BUCK +57 -0
  538. package/external/folly/folly/functional/test/InvokeTest.cpp +483 -0
  539. package/external/folly/folly/functional/test/PartialTest.cpp +141 -0
  540. package/external/folly/folly/functional/test/protocol_test.cpp +177 -0
  541. package/external/folly/folly/functional/test/traits_test.cpp +551 -0
  542. package/external/folly/folly/functional/traits.h +675 -0
  543. package/external/folly/folly/hash/BUCK +86 -0
  544. package/external/folly/folly/hash/Checksum.cpp +275 -0
  545. package/external/folly/folly/hash/Checksum.h +94 -0
  546. package/external/folly/folly/hash/FarmHash.h +46 -0
  547. package/external/folly/folly/hash/Hash.h +1045 -0
  548. package/external/folly/folly/hash/MurmurHash.h +86 -0
  549. package/external/folly/folly/hash/SpookyHashV1.cpp +391 -0
  550. package/external/folly/folly/hash/SpookyHashV1.h +307 -0
  551. package/external/folly/folly/hash/SpookyHashV2.cpp +392 -0
  552. package/external/folly/folly/hash/SpookyHashV2.h +339 -0
  553. package/external/folly/folly/hash/detail/BUCK +26 -0
  554. package/external/folly/folly/hash/detail/ChecksumDetail.cpp +296 -0
  555. package/external/folly/folly/hash/detail/ChecksumDetail.h +137 -0
  556. package/external/folly/folly/hash/detail/Crc32CombineDetail.cpp +191 -0
  557. package/external/folly/folly/hash/detail/Crc32cDetail.cpp +303 -0
  558. package/external/folly/folly/hash/test/BUCK +132 -0
  559. package/external/folly/folly/hash/test/ChecksumBenchmark.cpp +91 -0
  560. package/external/folly/folly/hash/test/ChecksumTest.cpp +587 -0
  561. package/external/folly/folly/hash/test/FarmHashTest.cpp +41 -0
  562. package/external/folly/folly/hash/test/HashBenchmark.cpp +238 -0
  563. package/external/folly/folly/hash/test/HashTest.cpp +997 -0
  564. package/external/folly/folly/hash/test/MurmurHashTest.cpp +76 -0
  565. package/external/folly/folly/hash/test/SpookyHashV1Test.cpp +559 -0
  566. package/external/folly/folly/hash/test/SpookyHashV2Test.cpp +549 -0
  567. package/external/folly/folly/hash/test/traits_test.cpp +69 -0
  568. package/external/folly/folly/hash/traits.h +115 -0
  569. package/external/folly/folly/json/BUCK +155 -0
  570. package/external/folly/folly/json/DynamicConverter.h +464 -0
  571. package/external/folly/folly/json/DynamicParser-inl.h +316 -0
  572. package/external/folly/folly/json/DynamicParser.cpp +198 -0
  573. package/external/folly/folly/json/DynamicParser.h +394 -0
  574. package/external/folly/folly/json/JSONSchema.cpp +1030 -0
  575. package/external/folly/folly/json/JSONSchema.h +73 -0
  576. package/external/folly/folly/json/JsonMockUtil.h +73 -0
  577. package/external/folly/folly/json/JsonTestUtil.cpp +167 -0
  578. package/external/folly/folly/json/JsonTestUtil.h +88 -0
  579. package/external/folly/folly/json/bser/BUCK +24 -0
  580. package/external/folly/folly/json/bser/Bser.h +107 -0
  581. package/external/folly/folly/json/bser/Dump.cpp +253 -0
  582. package/external/folly/folly/json/bser/Load.cpp +246 -0
  583. package/external/folly/folly/json/bser/test/BUCK +14 -0
  584. package/external/folly/folly/json/bser/test/BserTest.cpp +149 -0
  585. package/external/folly/folly/json/dynamic.cpp +552 -0
  586. package/external/folly/folly/json/dynamic.h +1346 -0
  587. package/external/folly/folly/json/json.h +238 -0
  588. package/external/folly/folly/json/json_patch.cpp +325 -0
  589. package/external/folly/folly/json/json_patch.h +126 -0
  590. package/external/folly/folly/json/json_pointer.cpp +114 -0
  591. package/external/folly/folly/json/json_pointer.h +87 -0
  592. package/external/folly/folly/json/test/BUCK +147 -0
  593. package/external/folly/folly/json/test/DynamicBenchmark.cpp +146 -0
  594. package/external/folly/folly/json/test/DynamicConverterTest.cpp +518 -0
  595. package/external/folly/folly/json/test/DynamicOtherTest.cpp +344 -0
  596. package/external/folly/folly/json/test/DynamicParserTest.cpp +443 -0
  597. package/external/folly/folly/json/test/DynamicTest.cpp +1647 -0
  598. package/external/folly/folly/json/test/JSONSchemaTest.cpp +450 -0
  599. package/external/folly/folly/json/test/JsonBenchmark.cpp +264 -0
  600. package/external/folly/folly/json/test/JsonOtherTest.cpp +51 -0
  601. package/external/folly/folly/json/test/JsonTest.cpp +1153 -0
  602. package/external/folly/folly/json/test/JsonTestUtilTest.cpp +97 -0
  603. package/external/folly/folly/json/test/json_patch_test.cpp +361 -0
  604. package/external/folly/folly/json/test/json_pointer_test.cpp +58 -0
  605. package/external/folly/folly/json/tool/BUCK +13 -0
  606. package/external/folly/folly/json/tool/JSONSchemaTester.cpp +58 -0
  607. package/external/folly/folly/json.h +17 -0
  608. package/external/folly/folly/json_patch.h +17 -0
  609. package/external/folly/folly/json_pointer.h +17 -0
  610. package/external/folly/folly/lang/Access.h +29 -0
  611. package/external/folly/folly/lang/Align.h +240 -0
  612. package/external/folly/folly/lang/Aligned.h +92 -0
  613. package/external/folly/folly/lang/Assume.h +82 -0
  614. package/external/folly/folly/lang/BUCK +287 -0
  615. package/external/folly/folly/lang/Badge.h +108 -0
  616. package/external/folly/folly/lang/Bits.h +570 -0
  617. package/external/folly/folly/lang/BitsClass.h +312 -0
  618. package/external/folly/folly/lang/Builtin.h +74 -0
  619. package/external/folly/folly/lang/CArray.h +34 -0
  620. package/external/folly/folly/lang/CString.cpp +86 -0
  621. package/external/folly/folly/lang/CString.h +55 -0
  622. package/external/folly/folly/lang/Cast.h +51 -0
  623. package/external/folly/folly/lang/CheckedMath.h +253 -0
  624. package/external/folly/folly/lang/CustomizationPoint.h +58 -0
  625. package/external/folly/folly/lang/Exception.cpp +822 -0
  626. package/external/folly/folly/lang/Exception.h +716 -0
  627. package/external/folly/folly/lang/Extern.h +55 -0
  628. package/external/folly/folly/lang/Hint-inl.h +144 -0
  629. package/external/folly/folly/lang/Hint.h +238 -0
  630. package/external/folly/folly/lang/Keep.h +98 -0
  631. package/external/folly/folly/lang/New.h +124 -0
  632. package/external/folly/folly/lang/Ordering.h +140 -0
  633. package/external/folly/folly/lang/Pretty.h +159 -0
  634. package/external/folly/folly/lang/PropagateConst.h +413 -0
  635. package/external/folly/folly/lang/RValueReferenceWrapper.h +152 -0
  636. package/external/folly/folly/lang/SafeAssert.cpp +589 -0
  637. package/external/folly/folly/lang/StaticConst.h +33 -0
  638. package/external/folly/folly/lang/Thunk.h +100 -0
  639. package/external/folly/folly/lang/TypeInfo.h +58 -0
  640. package/external/folly/folly/lang/UncaughtExceptions.cpp +17 -0
  641. package/external/folly/folly/lang/UncaughtExceptions.h +19 -0
  642. package/external/folly/folly/lang/test/AlignTest.cpp +87 -0
  643. package/external/folly/folly/lang/test/AlignedTest.cpp +130 -0
  644. package/external/folly/folly/lang/test/BUCK +258 -0
  645. package/external/folly/folly/lang/test/BadgeTest.cpp +89 -0
  646. package/external/folly/folly/lang/test/BitsBenchmark.cpp +164 -0
  647. package/external/folly/folly/lang/test/BitsClassBenchmark.cpp +122 -0
  648. package/external/folly/folly/lang/test/BitsClassTest.cpp +379 -0
  649. package/external/folly/folly/lang/test/BitsTest.cpp +577 -0
  650. package/external/folly/folly/lang/test/CStringTest.cpp +60 -0
  651. package/external/folly/folly/lang/test/CastTest.cpp +47 -0
  652. package/external/folly/folly/lang/test/CheckedMathTest.cpp +394 -0
  653. package/external/folly/folly/lang/test/ExceptionBench.cpp +427 -0
  654. package/external/folly/folly/lang/test/ExceptionTest.cpp +413 -0
  655. package/external/folly/folly/lang/test/ExternTest.cpp +39 -0
  656. package/external/folly/folly/lang/test/HintTest.cpp +100 -0
  657. package/external/folly/folly/lang/test/NewTest.cpp +38 -0
  658. package/external/folly/folly/lang/test/OrderingTest.cpp +105 -0
  659. package/external/folly/folly/lang/test/PrettyTest.cpp +44 -0
  660. package/external/folly/folly/lang/test/PropagateConstTest.cpp +356 -0
  661. package/external/folly/folly/lang/test/RValueReferenceWrapperTest.cpp +85 -0
  662. package/external/folly/folly/lang/test/SafeAssertTest.cpp +75 -0
  663. package/external/folly/folly/lang/test/ThunkTest.cpp +105 -0
  664. package/external/folly/folly/lang/test/ToAsciiBench.cpp +466 -0
  665. package/external/folly/folly/lang/test/ToAsciiTest.cpp +266 -0
  666. package/external/folly/folly/lang/test/TypeInfoTest.cpp +56 -0
  667. package/external/folly/folly/memcpy.S +292 -0
  668. package/external/folly/folly/memcpy_select_aarch64.cpp +145 -0
  669. package/external/folly/folly/memory/Arena-inl.h +83 -0
  670. package/external/folly/folly/memory/Arena.h +325 -0
  671. package/external/folly/folly/memory/BUCK +191 -0
  672. package/external/folly/folly/memory/JemallocHugePageAllocator.cpp +449 -0
  673. package/external/folly/folly/memory/JemallocHugePageAllocator.h +105 -0
  674. package/external/folly/folly/memory/JemallocHugePageAllocatorTest.cpp +341 -0
  675. package/external/folly/folly/memory/JemallocNodumpAllocator.cpp +176 -0
  676. package/external/folly/folly/memory/JemallocNodumpAllocator.h +119 -0
  677. package/external/folly/folly/memory/JemallocNodumpAllocatorTest.cpp +61 -0
  678. package/external/folly/folly/memory/MallctlHelper.cpp +37 -0
  679. package/external/folly/folly/memory/MallctlHelper.h +167 -0
  680. package/external/folly/folly/memory/Malloc.h +551 -0
  681. package/external/folly/folly/memory/MemoryResource.h +57 -0
  682. package/external/folly/folly/memory/ReentrantAllocator.cpp +162 -0
  683. package/external/folly/folly/memory/ReentrantAllocator.h +261 -0
  684. package/external/folly/folly/memory/SanitizeAddress.cpp +75 -0
  685. package/external/folly/folly/memory/SanitizeAddress.h +117 -0
  686. package/external/folly/folly/memory/SanitizeLeak.cpp +119 -0
  687. package/external/folly/folly/memory/SanitizeLeak.h +108 -0
  688. package/external/folly/folly/memory/ThreadCachedArena.cpp +53 -0
  689. package/external/folly/folly/memory/ThreadCachedArena.h +90 -0
  690. package/external/folly/folly/memory/UninitializedMemoryHacks.h +426 -0
  691. package/external/folly/folly/memory/detail/BUCK +10 -0
  692. package/external/folly/folly/memory/detail/MallocImpl.cpp +52 -0
  693. package/external/folly/folly/memory/detail/MallocImpl.h +97 -0
  694. package/external/folly/folly/memory/not_null-inl.h +522 -0
  695. package/external/folly/folly/memory/not_null.h +449 -0
  696. package/external/folly/folly/memory/test/ArenaTest.cpp +354 -0
  697. package/external/folly/folly/memory/test/BUCK +146 -0
  698. package/external/folly/folly/memory/test/MallctlHelperTest.cpp +169 -0
  699. package/external/folly/folly/memory/test/MallocBenchmark.cpp +91 -0
  700. package/external/folly/folly/memory/test/MallocTest.cpp +78 -0
  701. package/external/folly/folly/memory/test/MemoryResourceTest.cpp +31 -0
  702. package/external/folly/folly/memory/test/ReentrantAllocatorTest.cpp +144 -0
  703. package/external/folly/folly/memory/test/SanitizeAddressTest.cpp +67 -0
  704. package/external/folly/folly/memory/test/SanitizeLeakTest.cpp +139 -0
  705. package/external/folly/folly/memory/test/ThreadCachedArenaTest.cpp +276 -0
  706. package/external/folly/folly/memory/test/UninitializedMemoryHacksODR.cpp +21 -0
  707. package/external/folly/folly/memory/test/UninitializedMemoryHacksTest.cpp +327 -0
  708. package/external/folly/folly/memory/test/not_null_test.cpp +608 -0
  709. package/external/folly/folly/memset.S +245 -0
  710. package/external/folly/folly/memset_select_aarch64.cpp +72 -0
  711. package/external/folly/folly/portability/Asm.h +50 -0
  712. package/external/folly/folly/portability/Atomic.h +31 -0
  713. package/external/folly/folly/portability/BUCK +456 -0
  714. package/external/folly/folly/portability/Builtins.cpp +31 -0
  715. package/external/folly/folly/portability/Builtins.h +161 -0
  716. package/external/folly/folly/portability/Config.h +43 -0
  717. package/external/folly/folly/portability/Constexpr.h +145 -0
  718. package/external/folly/folly/portability/Dirent.cpp +140 -0
  719. package/external/folly/folly/portability/Dirent.h +41 -0
  720. package/external/folly/folly/portability/Event.h +44 -0
  721. package/external/folly/folly/portability/Fcntl.cpp +120 -0
  722. package/external/folly/folly/portability/Fcntl.h +67 -0
  723. package/external/folly/folly/portability/Filesystem.cpp +67 -0
  724. package/external/folly/folly/portability/Filesystem.h +114 -0
  725. package/external/folly/folly/portability/FmtCompile.h +40 -0
  726. package/external/folly/folly/portability/GFlags.h +139 -0
  727. package/external/folly/folly/portability/GMock.h +35 -0
  728. package/external/folly/folly/portability/GTest.h +35 -0
  729. package/external/folly/folly/portability/IOVec.h +34 -0
  730. package/external/folly/folly/portability/Libgen.cpp +59 -0
  731. package/external/folly/folly/portability/Libgen.h +29 -0
  732. package/external/folly/folly/portability/Libunwind.h +21 -0
  733. package/external/folly/folly/portability/Malloc.cpp +31 -0
  734. package/external/folly/folly/portability/Malloc.h +53 -0
  735. package/external/folly/folly/portability/Math.h +90 -0
  736. package/external/folly/folly/portability/Memory.h +26 -0
  737. package/external/folly/folly/portability/OpenSSL.cpp +17 -0
  738. package/external/folly/folly/portability/OpenSSL.h +102 -0
  739. package/external/folly/folly/portability/PThread.cpp +697 -0
  740. package/external/folly/folly/portability/PThread.h +148 -0
  741. package/external/folly/folly/portability/README.md +21 -0
  742. package/external/folly/folly/portability/Sched.cpp +41 -0
  743. package/external/folly/folly/portability/Sched.h +45 -0
  744. package/external/folly/folly/portability/Sockets.cpp +245 -0
  745. package/external/folly/folly/portability/Sockets.h +155 -0
  746. package/external/folly/folly/portability/SourceLocation.h +49 -0
  747. package/external/folly/folly/portability/Stdio.cpp +77 -0
  748. package/external/folly/folly/portability/Stdio.h +32 -0
  749. package/external/folly/folly/portability/Stdlib.cpp +172 -0
  750. package/external/folly/folly/portability/Stdlib.h +64 -0
  751. package/external/folly/folly/portability/String.cpp +53 -0
  752. package/external/folly/folly/portability/String.h +39 -0
  753. package/external/folly/folly/portability/SysFile.cpp +46 -0
  754. package/external/folly/folly/portability/SysFile.h +27 -0
  755. package/external/folly/folly/portability/SysMembarrier.cpp +104 -0
  756. package/external/folly/folly/portability/SysMembarrier.h +26 -0
  757. package/external/folly/folly/portability/SysMman.cpp +242 -0
  758. package/external/folly/folly/portability/SysMman.h +68 -0
  759. package/external/folly/folly/portability/SysResource.cpp +108 -0
  760. package/external/folly/folly/portability/SysResource.h +71 -0
  761. package/external/folly/folly/portability/SysStat.cpp +66 -0
  762. package/external/folly/folly/portability/SysStat.h +52 -0
  763. package/external/folly/folly/portability/SysSyscall.h +73 -0
  764. package/external/folly/folly/portability/SysTime.cpp +62 -0
  765. package/external/folly/folly/portability/SysTime.h +50 -0
  766. package/external/folly/folly/portability/SysTypes.h +44 -0
  767. package/external/folly/folly/portability/SysUio.cpp +179 -0
  768. package/external/folly/folly/portability/SysUio.h +51 -0
  769. package/external/folly/folly/portability/Syslog.h +39 -0
  770. package/external/folly/folly/portability/Time.cpp +357 -0
  771. package/external/folly/folly/portability/Time.h +74 -0
  772. package/external/folly/folly/portability/Unistd.h +111 -0
  773. package/external/folly/folly/portability/Windows.h +108 -0
  774. package/external/folly/folly/portability/openat2.c +30 -0
  775. package/external/folly/folly/portability/openat2.h +39 -0
  776. package/external/folly/folly/portability/test/BUCK +59 -0
  777. package/external/folly/folly/portability/test/ConstexprTest.cpp +102 -0
  778. package/external/folly/folly/portability/test/FilesystemTest.cpp +35 -0
  779. package/external/folly/folly/portability/test/LibgenTest.cpp +35 -0
  780. package/external/folly/folly/portability/test/OpenSSLPortabilityTest.cpp +108 -0
  781. package/external/folly/folly/portability/test/PThreadTest.cpp +80 -0
  782. package/external/folly/folly/portability/test/TimeTest.cpp +90 -0
  783. package/external/folly/folly/small_vector.h +17 -0
  784. package/external/folly/folly/somerge_defs.bzl +399 -0
  785. package/external/folly/folly/sorted_vector_types.h +17 -0
  786. package/external/folly/folly/stop_watch.h +317 -0
  787. package/external/folly/folly/synchronization/AsymmetricThreadFence.cpp +91 -0
  788. package/external/folly/folly/synchronization/AsymmetricThreadFence.h +60 -0
  789. package/external/folly/folly/synchronization/AtomicNotification-inl.h +146 -0
  790. package/external/folly/folly/synchronization/AtomicNotification.cpp +34 -0
  791. package/external/folly/folly/synchronization/AtomicNotification.h +117 -0
  792. package/external/folly/folly/synchronization/AtomicRef.h +181 -0
  793. package/external/folly/folly/synchronization/AtomicStruct.h +150 -0
  794. package/external/folly/folly/synchronization/AtomicUtil-inl.h +482 -0
  795. package/external/folly/folly/synchronization/AtomicUtil.h +179 -0
  796. package/external/folly/folly/synchronization/BUCK +418 -0
  797. package/external/folly/folly/synchronization/Baton.h +419 -0
  798. package/external/folly/folly/synchronization/CallOnce.h +263 -0
  799. package/external/folly/folly/synchronization/DelayedInit.h +179 -0
  800. package/external/folly/folly/synchronization/DistributedMutex-inl.h +1744 -0
  801. package/external/folly/folly/synchronization/DistributedMutex.cpp +27 -0
  802. package/external/folly/folly/synchronization/DistributedMutex.h +342 -0
  803. package/external/folly/folly/synchronization/EventCount.h +200 -0
  804. package/external/folly/folly/synchronization/FlatCombining.h +629 -0
  805. package/external/folly/folly/synchronization/Hazptr-fwd.h +217 -0
  806. package/external/folly/folly/synchronization/Hazptr.cpp +36 -0
  807. package/external/folly/folly/synchronization/Hazptr.h +209 -0
  808. package/external/folly/folly/synchronization/HazptrDomain.cpp +68 -0
  809. package/external/folly/folly/synchronization/HazptrDomain.h +832 -0
  810. package/external/folly/folly/synchronization/HazptrHolder.h +431 -0
  811. package/external/folly/folly/synchronization/HazptrObj.h +533 -0
  812. package/external/folly/folly/synchronization/HazptrObjLinked.h +315 -0
  813. package/external/folly/folly/synchronization/HazptrRec.h +68 -0
  814. package/external/folly/folly/synchronization/HazptrThrLocal.h +180 -0
  815. package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.cpp +46 -0
  816. package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.h +25 -0
  817. package/external/folly/folly/synchronization/Latch.h +160 -0
  818. package/external/folly/folly/synchronization/LifoSem.h +767 -0
  819. package/external/folly/folly/synchronization/Lock.h +887 -0
  820. package/external/folly/folly/synchronization/MicroSpinLock.h +154 -0
  821. package/external/folly/folly/synchronization/NativeSemaphore.h +187 -0
  822. package/external/folly/folly/synchronization/ParkingLot.cpp +37 -0
  823. package/external/folly/folly/synchronization/ParkingLot.h +330 -0
  824. package/external/folly/folly/synchronization/PicoSpinLock.h +167 -0
  825. package/external/folly/folly/synchronization/RWSpinLock.h +549 -0
  826. package/external/folly/folly/synchronization/Rcu.cpp +26 -0
  827. package/external/folly/folly/synchronization/Rcu.h +553 -0
  828. package/external/folly/folly/synchronization/RelaxedAtomic.h +336 -0
  829. package/external/folly/folly/synchronization/SanitizeThread.cpp +141 -0
  830. package/external/folly/folly/synchronization/SanitizeThread.h +166 -0
  831. package/external/folly/folly/synchronization/SaturatingSemaphore.h +324 -0
  832. package/external/folly/folly/synchronization/SmallLocks.h +36 -0
  833. package/external/folly/folly/synchronization/ThrottledLifoSem.h +362 -0
  834. package/external/folly/folly/synchronization/WaitOptions.cpp +25 -0
  835. package/external/folly/folly/synchronization/WaitOptions.h +75 -0
  836. package/external/folly/folly/synchronization/detail/AtomicUtils.h +59 -0
  837. package/external/folly/folly/synchronization/detail/BUCK +104 -0
  838. package/external/folly/folly/synchronization/detail/Hardware.cpp +192 -0
  839. package/external/folly/folly/synchronization/detail/Hardware.h +75 -0
  840. package/external/folly/folly/synchronization/detail/HazptrUtils.h +339 -0
  841. package/external/folly/folly/synchronization/detail/InlineFunctionRef.h +229 -0
  842. package/external/folly/folly/synchronization/detail/Sleeper.cpp +27 -0
  843. package/external/folly/folly/synchronization/detail/Sleeper.h +62 -0
  844. package/external/folly/folly/synchronization/detail/Spin.h +96 -0
  845. package/external/folly/folly/synchronization/detail/ThreadCachedLists.h +174 -0
  846. package/external/folly/folly/synchronization/detail/ThreadCachedReaders.h +189 -0
  847. package/external/folly/folly/synchronization/detail/ThreadCachedTag.h +26 -0
  848. package/external/folly/folly/synchronization/detail/test/BUCK +28 -0
  849. package/external/folly/folly/synchronization/detail/test/HardwareTest.cpp +74 -0
  850. package/external/folly/folly/synchronization/detail/test/InlineFunctionRefTest.cpp +286 -0
  851. package/external/folly/folly/synchronization/example/BUCK +27 -0
  852. package/external/folly/folly/synchronization/example/HazptrLockFreeLIFO.h +88 -0
  853. package/external/folly/folly/synchronization/example/HazptrSWMRSet.h +133 -0
  854. package/external/folly/folly/synchronization/example/HazptrWideCAS.h +62 -0
  855. package/external/folly/folly/synchronization/test/AtomicNotificationTest.cpp +236 -0
  856. package/external/folly/folly/synchronization/test/AtomicRefTest.cpp +170 -0
  857. package/external/folly/folly/synchronization/test/AtomicStructTest.cpp +65 -0
  858. package/external/folly/folly/synchronization/test/AtomicUtilBench.cpp +457 -0
  859. package/external/folly/folly/synchronization/test/AtomicUtilTest.cpp +650 -0
  860. package/external/folly/folly/synchronization/test/BUCK +495 -0
  861. package/external/folly/folly/synchronization/test/Barrier.h +52 -0
  862. package/external/folly/folly/synchronization/test/BarrierTest.cpp +56 -0
  863. package/external/folly/folly/synchronization/test/BatonBenchmark.cpp +77 -0
  864. package/external/folly/folly/synchronization/test/BatonTest.cpp +164 -0
  865. package/external/folly/folly/synchronization/test/BatonTestHelpers.h +118 -0
  866. package/external/folly/folly/synchronization/test/CallOnceBenchmark.cpp +72 -0
  867. package/external/folly/folly/synchronization/test/CallOnceTest.cpp +153 -0
  868. package/external/folly/folly/synchronization/test/DelayedInitTest.cpp +281 -0
  869. package/external/folly/folly/synchronization/test/DistributedMutexTest.cpp +2074 -0
  870. package/external/folly/folly/synchronization/test/EventCountTest.cpp +124 -0
  871. package/external/folly/folly/synchronization/test/FlatCombiningBenchmark.cpp +1789 -0
  872. package/external/folly/folly/synchronization/test/FlatCombiningExamples.h +222 -0
  873. package/external/folly/folly/synchronization/test/FlatCombiningTest.cpp +121 -0
  874. package/external/folly/folly/synchronization/test/FlatCombiningTestHelpers.h +227 -0
  875. package/external/folly/folly/synchronization/test/HazptrTest.cpp +1689 -0
  876. package/external/folly/folly/synchronization/test/LatchTest.cpp +224 -0
  877. package/external/folly/folly/synchronization/test/LifoSemBench.cpp +185 -0
  878. package/external/folly/folly/synchronization/test/LifoSemTests.cpp +353 -0
  879. package/external/folly/folly/synchronization/test/LockTest.cpp +1239 -0
  880. package/external/folly/folly/synchronization/test/NativeSemaphoreTest.cpp +37 -0
  881. package/external/folly/folly/synchronization/test/ParkingLotBenchmark.cpp +239 -0
  882. package/external/folly/folly/synchronization/test/ParkingLotTest.cpp +170 -0
  883. package/external/folly/folly/synchronization/test/RWSpinLockTest.cpp +235 -0
  884. package/external/folly/folly/synchronization/test/RcuBench.cpp +66 -0
  885. package/external/folly/folly/synchronization/test/RcuTest.cpp +330 -0
  886. package/external/folly/folly/synchronization/test/RelaxedAtomicTest.cpp +389 -0
  887. package/external/folly/folly/synchronization/test/SaturatingSemaphoreTest.cpp +166 -0
  888. package/external/folly/folly/synchronization/test/Semaphore.h +242 -0
  889. package/external/folly/folly/synchronization/test/SemaphoreTest.cpp +271 -0
  890. package/external/folly/folly/synchronization/test/SmallLocksBenchmark.cpp +1296 -0
  891. package/external/folly/folly/synchronization/test/SmallLocksTest.cpp +510 -0
  892. package/external/folly/folly/synchronization/test/ThreadCachedEpochBench.h +67 -0
  893. package/external/folly/folly/synchronization/test/ThreadCachedReadersBench.cpp +42 -0
  894. package/external/folly/folly/synchronization/test/ThreadCachedReadersTest.cpp +52 -0
  895. package/external/folly/folly/synchronization/test/ThrottledLifoSemTest.cpp +243 -0
  896. package/external/folly/folly/system/AtFork.cpp +205 -0
  897. package/external/folly/folly/system/AtFork.h +116 -0
  898. package/external/folly/folly/system/AuxVector.h +198 -0
  899. package/external/folly/folly/system/BUCK +144 -0
  900. package/external/folly/folly/system/EnvUtil.cpp +93 -0
  901. package/external/folly/folly/system/EnvUtil.h +113 -0
  902. package/external/folly/folly/system/HardwareConcurrency.cpp +39 -0
  903. package/external/folly/folly/system/HardwareConcurrency.h +23 -0
  904. package/external/folly/folly/system/MemoryMapping.cpp +477 -0
  905. package/external/folly/folly/system/MemoryMapping.h +287 -0
  906. package/external/folly/folly/system/Pid.cpp +87 -0
  907. package/external/folly/folly/system/Pid.h +34 -0
  908. package/external/folly/folly/system/Shell.cpp +33 -0
  909. package/external/folly/folly/system/Shell.h +93 -0
  910. package/external/folly/folly/system/ThreadId.cpp +89 -0
  911. package/external/folly/folly/system/ThreadId.h +62 -0
  912. package/external/folly/folly/system/ThreadName.cpp +330 -0
  913. package/external/folly/folly/system/ThreadName.h +72 -0
  914. package/external/folly/folly/system/test/AtForkTest.cpp +309 -0
  915. package/external/folly/folly/system/test/AuxVectorTest.cpp +55 -0
  916. package/external/folly/folly/system/test/BUCK +120 -0
  917. package/external/folly/folly/system/test/EnvUtilSubprocess.cpp +26 -0
  918. package/external/folly/folly/system/test/EnvUtilTest.cpp +197 -0
  919. package/external/folly/folly/system/test/MemoryMappingTest.cpp +179 -0
  920. package/external/folly/folly/system/test/PidTest.cpp +46 -0
  921. package/external/folly/folly/system/test/ShellTest.cpp +66 -0
  922. package/external/folly/folly/system/test/ThreadIdTest.cpp +114 -0
  923. package/external/folly/folly/system/test/ThreadNameTest.cpp +85 -0
  924. package/external/folly/folly.vcxitems +164 -0
  925. package/external/folly/static/logo.svg +1 -0
  926. package/external/folly/sync-config.json +8 -0
  927. package/just-task.js +13 -2
  928. package/package.json +7 -7
  929. package/template/cpp-lib/proj/MyLib.sln +0 -33
  930. package/template/cs-lib/proj/MyLib.sln +0 -33
  931. package/templates/cpp-app/windows/MyApp/MyApp.vcxproj +1 -1
  932. package/templates/cpp-app/windows/MyApp.sln +0 -33
  933. package/templates/cpp-lib/example/metro.config.js +30 -4
  934. package/templates/cpp-lib/windows/MyLib/MyLib.vcxproj +1 -1
  935. package/templates/cpp-lib/windows/MyLib.sln +0 -33
  936. package/Folly/Folly.vcxproj +0 -378
  937. package/Folly/Folly.vcxproj.filters +0 -558
  938. package/fmt/fmt.vcxproj +0 -153
  939. package/fmt/fmt.vcxproj.filters +0 -59
  940. package/fmt/pch.cpp +0 -4
  941. package/fmt/pch.h +0 -2
  942. /package/{fmt → external/fmt}/cgmanifest.json +0 -0
  943. /package/{Folly → external/folly}/Folly.natvis +0 -0
  944. /package/{Folly → external/folly}/cgmanifest.json +0 -0
  945. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/ConstexprMath.h +0 -0
  946. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/Conv.cpp +0 -0
  947. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/chrono/Hardware.h +0 -0
  948. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/concurrency/CacheLocality.cpp +0 -0
  949. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/json/dynamic-inl.h +0 -0
  950. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/json/json.cpp +0 -0
  951. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/SafeAssert.h +0 -0
  952. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/ToAscii.cpp +0 -0
  953. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/ToAscii.h +0 -0
  954. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/portability/Unistd.cpp +0 -0
@@ -0,0 +1,1711 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ /*
18
+ * Nicholas Ormrod (njormrod)
19
+ * Andrei Alexandrescu (aalexandre)
20
+ *
21
+ * FBVector is Facebook's drop-in implementation of std::vector. It has special
22
+ * optimizations for use with relocatable types and jemalloc.
23
+ */
24
+
25
+ #pragma once
26
+
27
+ //=============================================================================
28
+ // headers
29
+
30
+ #include <algorithm>
31
+ #include <cassert>
32
+ #include <iterator>
33
+ #include <memory>
34
+ #include <stdexcept>
35
+ #include <type_traits>
36
+ #include <utility>
37
+
38
+ #include <folly/FormatTraits.h>
39
+ #include <folly/Likely.h>
40
+ #include <folly/ScopeGuard.h>
41
+ #include <folly/Traits.h>
42
+ #include <folly/lang/CheckedMath.h>
43
+ #include <folly/lang/Exception.h>
44
+ #include <folly/lang/Hint.h>
45
+ #include <folly/memory/Malloc.h>
46
+
47
+ //=============================================================================
48
+ // forward declaration
49
+
50
+ namespace folly {
51
+ template <class T, class Allocator = std::allocator<T>>
52
+ class fbvector;
53
+ } // namespace folly
54
+
55
+ //=============================================================================
56
+ // unrolling
57
+
58
+ #define FOLLY_FBV_UNROLL_PTR(first, last, OP) \
59
+ do { \
60
+ for (; (last) - (first) >= 4; (first) += 4) { \
61
+ OP(((first) + 0)); \
62
+ OP(((first) + 1)); \
63
+ OP(((first) + 2)); \
64
+ OP(((first) + 3)); \
65
+ } \
66
+ for (; (first) != (last); ++(first)) \
67
+ OP((first)); \
68
+ } while (0)
69
+
70
+ //=============================================================================
71
+ ///////////////////////////////////////////////////////////////////////////////
72
+ // //
73
+ // fbvector class //
74
+ // //
75
+ ///////////////////////////////////////////////////////////////////////////////
76
+
77
+ namespace folly {
78
+
79
+ namespace detail {
80
+ inline void* thunk_return_nullptr() {
81
+ return nullptr;
82
+ }
83
+ } // namespace detail
84
+
85
+ template <class T, class Allocator>
86
+ class fbvector {
87
+ //===========================================================================
88
+ //---------------------------------------------------------------------------
89
+ // implementation
90
+ private:
91
+ typedef std::allocator_traits<Allocator> A;
92
+
93
+ struct Impl : public Allocator {
94
+ // typedefs
95
+ typedef typename A::pointer pointer;
96
+ typedef typename A::size_type size_type;
97
+
98
+ // data
99
+ pointer b_, e_, z_;
100
+
101
+ // constructors
102
+ Impl() : Allocator(), b_(nullptr), e_(nullptr), z_(nullptr) {}
103
+ /* implicit */ Impl(const Allocator& alloc)
104
+ : Allocator(alloc), b_(nullptr), e_(nullptr), z_(nullptr) {}
105
+ /* implicit */ Impl(Allocator&& alloc)
106
+ : Allocator(std::move(alloc)), b_(nullptr), e_(nullptr), z_(nullptr) {}
107
+
108
+ /* implicit */ Impl(size_type n, const Allocator& alloc = Allocator())
109
+ : Allocator(alloc) {
110
+ init(n);
111
+ }
112
+
113
+ Impl(Impl&& other) noexcept
114
+ : Allocator(std::move(other)),
115
+ b_(other.b_),
116
+ e_(other.e_),
117
+ z_(other.z_) {
118
+ other.b_ = other.e_ = other.z_ = nullptr;
119
+ }
120
+
121
+ // destructor
122
+ ~Impl() { destroy(); }
123
+
124
+ // allocation
125
+ // note that 'allocate' and 'deallocate' are inherited from Allocator
126
+ T* D_allocate(size_type n) {
127
+ if (usingStdAllocator) {
128
+ return static_cast<T*>(checkedMalloc(n * sizeof(T)));
129
+ } else {
130
+ return std::allocator_traits<Allocator>::allocate(*this, n);
131
+ }
132
+ }
133
+
134
+ void D_deallocate(T* p, size_type n) noexcept {
135
+ if (usingStdAllocator) {
136
+ free(p);
137
+ } else {
138
+ std::allocator_traits<Allocator>::deallocate(*this, p, n);
139
+ }
140
+ }
141
+
142
+ // helpers
143
+ void swapData(Impl& other) {
144
+ std::swap(b_, other.b_);
145
+ std::swap(e_, other.e_);
146
+ std::swap(z_, other.z_);
147
+ }
148
+
149
+ // data ops
150
+ inline void destroy() noexcept {
151
+ if (b_) {
152
+ // THIS DISPATCH CODE IS DUPLICATED IN fbvector::D_destroy_range_a.
153
+ // It has been inlined here for speed. It calls the static fbvector
154
+ // methods to perform the actual destruction.
155
+ if (usingStdAllocator) {
156
+ S_destroy_range(b_, e_);
157
+ } else {
158
+ S_destroy_range_a(*this, b_, e_);
159
+ }
160
+
161
+ D_deallocate(b_, size_type(z_ - b_));
162
+ }
163
+ }
164
+
165
+ void init(size_type n) {
166
+ if (FOLLY_UNLIKELY(n == 0)) {
167
+ b_ = e_ = z_ = nullptr;
168
+ } else {
169
+ size_type sz = folly::goodMallocSize(n * sizeof(T)) / sizeof(T);
170
+ b_ = D_allocate(sz);
171
+ e_ = b_;
172
+ z_ = b_ + sz;
173
+ }
174
+ }
175
+
176
+ void set(pointer newB, size_type newSize, size_type newCap) {
177
+ z_ = newB + newCap;
178
+ e_ = newB + newSize;
179
+ b_ = newB;
180
+ }
181
+
182
+ void reset(size_type newCap) {
183
+ destroy();
184
+ auto rollback = makeGuard([&] { init(0); });
185
+ init(newCap);
186
+ rollback.dismiss();
187
+ }
188
+ void reset() { // same as reset(0)
189
+ destroy();
190
+ b_ = e_ = z_ = nullptr;
191
+ }
192
+ } impl_;
193
+
194
+ static void swap(Impl& a, Impl& b) {
195
+ using std::swap;
196
+ if (!usingStdAllocator) {
197
+ swap(static_cast<Allocator&>(a), static_cast<Allocator&>(b));
198
+ }
199
+ a.swapData(b);
200
+ }
201
+
202
+ //===========================================================================
203
+ //---------------------------------------------------------------------------
204
+ // types and constants
205
+ public:
206
+ typedef T value_type;
207
+ typedef value_type& reference;
208
+ typedef const value_type& const_reference;
209
+ typedef T* iterator;
210
+ typedef const T* const_iterator;
211
+ typedef size_t size_type;
212
+ typedef typename std::make_signed<size_type>::type difference_type;
213
+ typedef Allocator allocator_type;
214
+ typedef typename A::pointer pointer;
215
+ typedef typename A::const_pointer const_pointer;
216
+ typedef std::reverse_iterator<iterator> reverse_iterator;
217
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
218
+
219
+ private:
220
+ static constexpr bool should_pass_by_value =
221
+ std::is_trivially_copyable<T>::value &&
222
+ sizeof(T) <= 16; // don't force large structures to be passed by value
223
+ typedef typename std::conditional<should_pass_by_value, T, const T&>::type VT;
224
+ typedef typename std::conditional<should_pass_by_value, T, T&&>::type MT;
225
+
226
+ static constexpr bool usingStdAllocator =
227
+ std::is_same<Allocator, std::allocator<T>>::value;
228
+ typedef std::bool_constant<
229
+ usingStdAllocator || A::propagate_on_container_move_assignment::value>
230
+ moveIsSwap;
231
+
232
+ //===========================================================================
233
+ //---------------------------------------------------------------------------
234
+ // allocator helpers
235
+
236
+ //---------------------------------------------------------------------------
237
+ // allocate
238
+
239
+ T* M_allocate(size_type n) { return impl_.D_allocate(n); }
240
+
241
+ //---------------------------------------------------------------------------
242
+ // deallocate
243
+
244
+ void M_deallocate(T* p, size_type n) noexcept { impl_.D_deallocate(p, n); }
245
+
246
+ //---------------------------------------------------------------------------
247
+ // construct
248
+
249
+ // GCC is very sensitive to the exact way that construct is called. For
250
+ // that reason there are several different specializations of construct.
251
+
252
+ template <typename U, typename... Args>
253
+ void M_construct(U* p, Args&&... args) {
254
+ if (usingStdAllocator) {
255
+ new (p) U(std::forward<Args>(args)...);
256
+ } else {
257
+ std::allocator_traits<Allocator>::construct(
258
+ impl_, p, std::forward<Args>(args)...);
259
+ }
260
+ }
261
+
262
+ template <typename U, typename... Args>
263
+ static void S_construct(U* p, Args&&... args) {
264
+ new (p) U(std::forward<Args>(args)...);
265
+ }
266
+
267
+ template <typename U, typename... Args>
268
+ static void S_construct_a(Allocator& a, U* p, Args&&... args) {
269
+ std::allocator_traits<Allocator>::construct(
270
+ a, p, std::forward<Args>(args)...);
271
+ }
272
+
273
+ // scalar optimization
274
+ // TODO we can expand this optimization to: default copyable and assignable
275
+ template <
276
+ typename U,
277
+ typename Enable = typename std::enable_if<std::is_scalar<U>::value>::type>
278
+ void M_construct(U* p, U arg) {
279
+ if (usingStdAllocator) {
280
+ *p = arg;
281
+ } else {
282
+ std::allocator_traits<Allocator>::construct(impl_, p, arg);
283
+ }
284
+ }
285
+
286
+ template <
287
+ typename U,
288
+ typename Enable = typename std::enable_if<std::is_scalar<U>::value>::type>
289
+ static void S_construct(U* p, U arg) {
290
+ *p = arg;
291
+ }
292
+
293
+ template <
294
+ typename U,
295
+ typename Enable = typename std::enable_if<std::is_scalar<U>::value>::type>
296
+ static void S_construct_a(Allocator& a, U* p, U arg) {
297
+ std::allocator_traits<Allocator>::construct(a, p, arg);
298
+ }
299
+
300
+ // const& optimization
301
+ template <
302
+ typename U,
303
+ typename Enable =
304
+ typename std::enable_if<!std::is_scalar<U>::value>::type>
305
+ void M_construct(U* p, const U& value) {
306
+ if (usingStdAllocator) {
307
+ new (p) U(value);
308
+ } else {
309
+ std::allocator_traits<Allocator>::construct(impl_, p, value);
310
+ }
311
+ }
312
+
313
+ template <
314
+ typename U,
315
+ typename Enable =
316
+ typename std::enable_if<!std::is_scalar<U>::value>::type>
317
+ static void S_construct(U* p, const U& value) {
318
+ new (p) U(value);
319
+ }
320
+
321
+ template <
322
+ typename U,
323
+ typename Enable =
324
+ typename std::enable_if<!std::is_scalar<U>::value>::type>
325
+ static void S_construct_a(Allocator& a, U* p, const U& value) {
326
+ std::allocator_traits<Allocator>::construct(a, p, value);
327
+ }
328
+
329
+ //---------------------------------------------------------------------------
330
+ // destroy
331
+
332
+ void M_destroy(T* p) noexcept {
333
+ if (usingStdAllocator) {
334
+ if (!std::is_trivially_destructible<T>::value) {
335
+ p->~T();
336
+ }
337
+ } else {
338
+ std::allocator_traits<Allocator>::destroy(impl_, p);
339
+ }
340
+ }
341
+
342
+ //===========================================================================
343
+ //---------------------------------------------------------------------------
344
+ // algorithmic helpers
345
+ private:
346
+ //---------------------------------------------------------------------------
347
+ // destroy_range
348
+
349
+ // wrappers
350
+ void M_destroy_range_e(T* pos) noexcept {
351
+ D_destroy_range_a(pos, impl_.e_);
352
+ impl_.e_ = pos;
353
+ }
354
+
355
+ // dispatch
356
+ // THIS DISPATCH CODE IS DUPLICATED IN IMPL. SEE IMPL FOR DETAILS.
357
+ void D_destroy_range_a(T* first, T* last) noexcept {
358
+ if (usingStdAllocator) {
359
+ S_destroy_range(first, last);
360
+ } else {
361
+ S_destroy_range_a(impl_, first, last);
362
+ }
363
+ }
364
+
365
+ // allocator
366
+ static void S_destroy_range_a(Allocator& a, T* first, T* last) noexcept {
367
+ for (; first != last; ++first) {
368
+ std::allocator_traits<Allocator>::destroy(a, first);
369
+ }
370
+ }
371
+
372
+ // optimized
373
+ static void S_destroy_range(T* first, T* last) noexcept {
374
+ if (!std::is_trivially_destructible<T>::value) {
375
+ #define FOLLY_FBV_OP(p) (p)->~T()
376
+ // EXPERIMENTAL DATA on fbvector<vector<int>> (where each vector<int> has
377
+ // size 0), were vector<int> to be relocatable.
378
+ // The unrolled version seems to work faster for small to medium sized
379
+ // fbvectors. It gets a 10% speedup on fbvectors of size 1024, 64, and
380
+ // 16.
381
+ // The simple loop version seems to work faster for large fbvectors. The
382
+ // unrolled version is about 6% slower on fbvectors on size 16384.
383
+ // The two methods seem tied for very large fbvectors. The unrolled
384
+ // version is about 0.5% slower on size 262144.
385
+
386
+ // for (; first != last; ++first) first->~T();
387
+ FOLLY_FBV_UNROLL_PTR(first, last, FOLLY_FBV_OP);
388
+ #undef FOLLY_FBV_OP
389
+ }
390
+ }
391
+
392
+ //---------------------------------------------------------------------------
393
+ // uninitialized_fill_n
394
+
395
+ // wrappers
396
+ void M_uninitialized_fill_n_e(size_type sz) {
397
+ D_uninitialized_fill_n_a(impl_.e_, sz);
398
+ impl_.e_ += sz;
399
+ }
400
+
401
+ void M_uninitialized_fill_n_e(size_type sz, VT value) {
402
+ D_uninitialized_fill_n_a(impl_.e_, sz, value);
403
+ impl_.e_ += sz;
404
+ }
405
+
406
+ // dispatch
407
+ void D_uninitialized_fill_n_a(T* dest, size_type sz) {
408
+ if (usingStdAllocator) {
409
+ S_uninitialized_fill_n(dest, sz);
410
+ } else {
411
+ S_uninitialized_fill_n_a(impl_, dest, sz);
412
+ }
413
+ }
414
+
415
+ void D_uninitialized_fill_n_a(T* dest, size_type sz, VT value) {
416
+ if (usingStdAllocator) {
417
+ S_uninitialized_fill_n(dest, sz, value);
418
+ } else {
419
+ S_uninitialized_fill_n_a(impl_, dest, sz, value);
420
+ }
421
+ }
422
+
423
+ // allocator
424
+ template <typename... Args>
425
+ static void S_uninitialized_fill_n_a(
426
+ Allocator& a, T* dest, size_type sz, Args&&... args) {
427
+ auto b = dest;
428
+ T* e = nullptr;
429
+ if (!folly::checked_add(&e, dest, sz)) {
430
+ throw_exception<std::length_error>("FBVector exceeded max size.");
431
+ }
432
+ auto rollback = makeGuard([&] { S_destroy_range_a(a, dest, b); });
433
+ for (; b != e; ++b) {
434
+ std::allocator_traits<Allocator>::construct(
435
+ a, b, std::forward<Args>(args)...);
436
+ }
437
+ rollback.dismiss();
438
+ }
439
+
440
+ // optimized
441
+ static void S_uninitialized_fill_n(T* dest, size_type n) {
442
+ if (folly::IsZeroInitializable<T>::value) {
443
+ if (FOLLY_LIKELY(n != 0)) {
444
+ T* sz = nullptr;
445
+ if (!folly::checked_add(&sz, dest, n)) {
446
+ throw_exception<std::length_error>("FBVector exceeded max size.");
447
+ }
448
+ std::memset((void*)dest, 0, sizeof(T) * n);
449
+ }
450
+ } else {
451
+ auto b = dest;
452
+ T* e = nullptr;
453
+ if (!folly::checked_add(&e, dest, n)) {
454
+ throw_exception<std::length_error>("FBVector exceeded max size.");
455
+ }
456
+ auto rollback = makeGuard([&] {
457
+ --b;
458
+ for (; b >= dest; --b) {
459
+ b->~T();
460
+ }
461
+ });
462
+ for (; b != e; ++b) {
463
+ S_construct(b);
464
+ }
465
+ rollback.dismiss();
466
+ }
467
+ }
468
+
469
+ static void S_uninitialized_fill_n(T* dest, size_type n, const T& value) {
470
+ auto b = dest;
471
+ T* e = nullptr;
472
+ if (!folly::checked_add(&e, dest, n)) {
473
+ throw_exception<std::length_error>("FBVector exceeded max size.");
474
+ }
475
+ auto rollback = makeGuard([&] { S_destroy_range(dest, b); });
476
+ for (; b != e; ++b) {
477
+ S_construct(b, value);
478
+ }
479
+ rollback.dismiss();
480
+ }
481
+
482
+ //---------------------------------------------------------------------------
483
+ // uninitialized_copy
484
+
485
+ // it is possible to add an optimization for the case where
486
+ // It = move(T*) and IsRelocatable<T> and Is0Initializeable<T>
487
+
488
+ // wrappers
489
+ template <typename It>
490
+ void M_uninitialized_copy_e(It first, It last) {
491
+ D_uninitialized_copy_a(impl_.e_, first, last);
492
+ impl_.e_ += std::distance(first, last);
493
+ }
494
+
495
+ template <typename It>
496
+ void M_uninitialized_move_e(It first, It last) {
497
+ D_uninitialized_move_a(impl_.e_, first, last);
498
+ impl_.e_ += std::distance(first, last);
499
+ }
500
+
501
+ // dispatch
502
+ template <typename It>
503
+ void D_uninitialized_copy_a(T* dest, It first, It last) {
504
+ if (usingStdAllocator) {
505
+ if (std::is_trivially_copyable<T>::value) {
506
+ S_uninitialized_copy_bits(dest, first, last);
507
+ } else {
508
+ S_uninitialized_copy(dest, first, last);
509
+ }
510
+ } else {
511
+ S_uninitialized_copy_a(impl_, dest, first, last);
512
+ }
513
+ }
514
+
515
+ template <typename It>
516
+ void D_uninitialized_move_a(T* dest, It first, It last) {
517
+ D_uninitialized_copy_a(
518
+ dest, std::make_move_iterator(first), std::make_move_iterator(last));
519
+ }
520
+
521
+ // allocator
522
+ template <typename It>
523
+ static void S_uninitialized_copy_a(Allocator& a, T* dest, It first, It last) {
524
+ auto b = dest;
525
+ auto rollback = makeGuard([&] { S_destroy_range_a(a, dest, b); });
526
+ for (; first != last; ++first, ++b) {
527
+ std::allocator_traits<Allocator>::construct(a, b, *first);
528
+ }
529
+ rollback.dismiss();
530
+ }
531
+
532
+ // optimized
533
+ template <typename It>
534
+ static void S_uninitialized_copy(T* dest, It first, It last) {
535
+ auto b = dest;
536
+ auto rollback = makeGuard([&] { S_destroy_range(dest, b); });
537
+ for (; first != last; ++first, ++b) {
538
+ S_construct(b, *first);
539
+ }
540
+ rollback.dismiss();
541
+ }
542
+
543
+ static void S_uninitialized_copy_bits(
544
+ T* dest, const T* first, const T* last) {
545
+ if (last != first) {
546
+ std::memcpy((void*)dest, (void*)first, (last - first) * sizeof(T));
547
+ }
548
+ }
549
+
550
+ static void S_uninitialized_copy_bits(
551
+ T* dest, std::move_iterator<T*> first, std::move_iterator<T*> last) {
552
+ T* bFirst = first.base();
553
+ T* bLast = last.base();
554
+ if (bLast != bFirst) {
555
+ std::memcpy((void*)dest, (void*)bFirst, (bLast - bFirst) * sizeof(T));
556
+ }
557
+ }
558
+
559
+ template <typename It>
560
+ static void S_uninitialized_copy_bits(T* dest, It first, It last) {
561
+ S_uninitialized_copy(dest, first, last);
562
+ }
563
+
564
+ //---------------------------------------------------------------------------
565
+ // copy_n
566
+
567
+ // This function is "unsafe": it assumes that the iterator can be advanced at
568
+ // least n times. However, as a private function, that unsafety is managed
569
+ // wholly by fbvector itself.
570
+
571
+ template <typename It>
572
+ static It S_copy_n(T* dest, It first, size_type n) {
573
+ auto e = dest + n;
574
+ for (; dest != e; ++dest, ++first) {
575
+ *dest = *first;
576
+ }
577
+ return first;
578
+ }
579
+
580
+ static const T* S_copy_n(T* dest, const T* first, size_type n) {
581
+ if (std::is_trivially_copyable<T>::value) {
582
+ std::memcpy((void*)dest, (void*)first, n * sizeof(T));
583
+ return first + n;
584
+ } else {
585
+ return S_copy_n<const T*>(dest, first, n);
586
+ }
587
+ }
588
+
589
+ static std::move_iterator<T*> S_copy_n(
590
+ T* dest, std::move_iterator<T*> mIt, size_type n) {
591
+ if (std::is_trivially_copyable<T>::value) {
592
+ T* first = mIt.base();
593
+ std::memcpy((void*)dest, (void*)first, n * sizeof(T));
594
+ return std::make_move_iterator(first + n);
595
+ } else {
596
+ return S_copy_n<std::move_iterator<T*>>(dest, mIt, n);
597
+ }
598
+ }
599
+
600
+ //===========================================================================
601
+ //---------------------------------------------------------------------------
602
+ // relocation helpers
603
+ private:
604
+ // Relocation is divided into three parts:
605
+ //
606
+ // 1: relocate_move
607
+ // Performs the actual movement of data from point a to point b.
608
+ //
609
+ // 2: relocate_done
610
+ // Destroys the old data.
611
+ //
612
+ // 3: relocate_undo
613
+ // Destoys the new data and restores the old data.
614
+ //
615
+ // The three steps are used because there may be an exception after part 1
616
+ // has completed. If that is the case, then relocate_undo can nullify the
617
+ // initial move. Otherwise, relocate_done performs the last bit of tidying
618
+ // up.
619
+ //
620
+ // The relocation trio may use either memcpy, move, or copy. It is decided
621
+ // by the following case statement:
622
+ //
623
+ // IsRelocatable && usingStdAllocator -> memcpy
624
+ // has_nothrow_move && usingStdAllocator -> move
625
+ // cannot copy -> move
626
+ // default -> copy
627
+ //
628
+ // If the class is non-copyable then it must be movable. However, if the
629
+ // move constructor is not noexcept, i.e. an error could be thrown, then
630
+ // relocate_undo will be unable to restore the old data, for fear of a
631
+ // second exception being thrown. This is a known and unavoidable
632
+ // deficiency. In lieu of a strong exception guarantee, relocate_undo does
633
+ // the next best thing: it provides a weak exception guarantee by
634
+ // destroying the new data, but leaving the old data in an indeterminate
635
+ // state. Note that that indeterminate state will be valid, since the
636
+ // old data has not been destroyed; it has merely been the source of a
637
+ // move, which is required to leave the source in a valid state.
638
+
639
+ // wrappers
640
+ void M_relocate(T* newB) {
641
+ relocate_move(newB, impl_.b_, impl_.e_);
642
+ relocate_done(newB, impl_.b_, impl_.e_);
643
+ }
644
+
645
+ // dispatch type trait
646
+ typedef std::bool_constant<
647
+ folly::IsRelocatable<T>::value && usingStdAllocator>
648
+ relocate_use_memcpy;
649
+
650
+ typedef std::bool_constant<
651
+ (std::is_nothrow_move_constructible<T>::value && usingStdAllocator) ||
652
+ !std::is_copy_constructible<T>::value>
653
+ relocate_use_move;
654
+
655
+ // move
656
+ void relocate_move(T* dest, T* first, T* last) {
657
+ relocate_move_or_memcpy(dest, first, last, relocate_use_memcpy());
658
+ }
659
+
660
+ void relocate_move_or_memcpy(T* dest, T* first, T* last, std::true_type) {
661
+ if (first != nullptr) {
662
+ std::memcpy((void*)dest, (void*)first, (last - first) * sizeof(T));
663
+ }
664
+ }
665
+
666
+ void relocate_move_or_memcpy(T* dest, T* first, T* last, std::false_type) {
667
+ relocate_move_or_copy(dest, first, last, relocate_use_move());
668
+ }
669
+
670
+ void relocate_move_or_copy(T* dest, T* first, T* last, std::true_type) {
671
+ D_uninitialized_move_a(dest, first, last);
672
+ }
673
+
674
+ void relocate_move_or_copy(T* dest, T* first, T* last, std::false_type) {
675
+ D_uninitialized_copy_a(dest, first, last);
676
+ }
677
+
678
+ // done
679
+ void relocate_done(T* /*dest*/, T* first, T* last) noexcept {
680
+ if (folly::IsRelocatable<T>::value && usingStdAllocator) {
681
+ // used memcpy; data has been relocated, do not call destructor
682
+ } else {
683
+ D_destroy_range_a(first, last);
684
+ }
685
+ }
686
+
687
+ // undo
688
+ void relocate_undo(T* dest, T* first, T* last) noexcept {
689
+ if (folly::IsRelocatable<T>::value && usingStdAllocator) {
690
+ // used memcpy, old data is still valid, nothing to do
691
+ } else if (
692
+ std::is_nothrow_move_constructible<T>::value && usingStdAllocator) {
693
+ // noexcept move everything back, aka relocate_move
694
+ relocate_move(first, dest, dest + (last - first));
695
+ } else if (!std::is_copy_constructible<T>::value) {
696
+ // weak guarantee
697
+ D_destroy_range_a(dest, dest + (last - first));
698
+ } else {
699
+ // used copy, old data is still valid
700
+ D_destroy_range_a(dest, dest + (last - first));
701
+ }
702
+ }
703
+
704
+ //===========================================================================
705
+ //---------------------------------------------------------------------------
706
+ // construct/copy/destroy
707
+ public:
708
+ fbvector() = default;
709
+
710
+ explicit fbvector(const Allocator& a) : impl_(a) {}
711
+
712
+ explicit fbvector(size_type n, const Allocator& a = Allocator())
713
+ : impl_(n, a) {
714
+ M_uninitialized_fill_n_e(n);
715
+ }
716
+
717
+ fbvector(size_type n, VT value, const Allocator& a = Allocator())
718
+ : impl_(n, a) {
719
+ M_uninitialized_fill_n_e(n, value);
720
+ }
721
+
722
+ template <
723
+ class It,
724
+ class Category = typename std::iterator_traits<It>::iterator_category>
725
+ fbvector(It first, It last, const Allocator& a = Allocator())
726
+ : fbvector(first, last, a, Category()) {}
727
+
728
+ fbvector(const fbvector& other)
729
+ : impl_(
730
+ other.size(),
731
+ A::select_on_container_copy_construction(other.impl_)) {
732
+ M_uninitialized_copy_e(other.begin(), other.end());
733
+ }
734
+
735
+ fbvector(fbvector&& other) noexcept : impl_(std::move(other.impl_)) {}
736
+
737
+ fbvector(const fbvector& other, const Allocator& a)
738
+ : fbvector(other.begin(), other.end(), a) {}
739
+
740
+ /* may throw */ fbvector(fbvector&& other, const Allocator& a) : impl_(a) {
741
+ if (impl_ == other.impl_) {
742
+ impl_.swapData(other.impl_);
743
+ } else {
744
+ impl_.init(other.size());
745
+ M_uninitialized_move_e(other.begin(), other.end());
746
+ }
747
+ }
748
+
749
+ fbvector(std::initializer_list<T> il, const Allocator& a = Allocator())
750
+ : fbvector(il.begin(), il.end(), a) {}
751
+
752
+ ~fbvector() = default; // the cleanup occurs in impl_
753
+
754
+ fbvector& operator=(const fbvector& other) {
755
+ if (FOLLY_UNLIKELY(this == &other)) {
756
+ return *this;
757
+ }
758
+
759
+ if (!usingStdAllocator &&
760
+ A::propagate_on_container_copy_assignment::value) {
761
+ if (impl_ != other.impl_) {
762
+ // can't use other's different allocator to clean up self
763
+ impl_.reset();
764
+ }
765
+ (Allocator&)impl_ = (Allocator&)other.impl_;
766
+ }
767
+
768
+ assign(other.begin(), other.end());
769
+ return *this;
770
+ }
771
+
772
+ fbvector& operator=(fbvector&& other) {
773
+ if (FOLLY_UNLIKELY(this == &other)) {
774
+ return *this;
775
+ }
776
+ moveFrom(std::move(other), moveIsSwap());
777
+ return *this;
778
+ }
779
+
780
+ fbvector& operator=(std::initializer_list<T> il) {
781
+ assign(il.begin(), il.end());
782
+ return *this;
783
+ }
784
+
785
+ template <
786
+ class It,
787
+ class Category = typename std::iterator_traits<It>::iterator_category>
788
+ void assign(It first, It last) {
789
+ assign(first, last, Category());
790
+ }
791
+
792
+ void assign(size_type n, VT value) {
793
+ if (n > capacity()) {
794
+ // Not enough space. Do not reserve in place, since we will
795
+ // discard the old values anyways.
796
+ if (dataIsInternalAndNotVT(value)) {
797
+ T copy(std::move(value));
798
+ impl_.reset(n);
799
+ M_uninitialized_fill_n_e(n, copy);
800
+ } else {
801
+ impl_.reset(n);
802
+ M_uninitialized_fill_n_e(n, value);
803
+ }
804
+ } else if (n <= size()) {
805
+ auto newE = impl_.b_ + n;
806
+ std::fill(impl_.b_, newE, value);
807
+ M_destroy_range_e(newE);
808
+ } else {
809
+ std::fill(impl_.b_, impl_.e_, value);
810
+ M_uninitialized_fill_n_e(n - size(), value);
811
+ }
812
+ }
813
+
814
+ void assign(std::initializer_list<T> il) { assign(il.begin(), il.end()); }
815
+
816
+ allocator_type get_allocator() const noexcept { return impl_; }
817
+
818
+ private:
819
+ // contract dispatch for iterator types fbvector(It first, It last)
820
+ template <class ForwardIterator>
821
+ fbvector(
822
+ ForwardIterator first,
823
+ ForwardIterator last,
824
+ const Allocator& a,
825
+ std::forward_iterator_tag)
826
+ : impl_(size_type(std::distance(first, last)), a) {
827
+ M_uninitialized_copy_e(first, last);
828
+ }
829
+
830
+ template <class InputIterator>
831
+ fbvector(
832
+ InputIterator first,
833
+ InputIterator last,
834
+ const Allocator& a,
835
+ std::input_iterator_tag)
836
+ : impl_(a) {
837
+ for (; first != last; ++first) {
838
+ emplace_back(*first);
839
+ }
840
+ }
841
+
842
+ // contract dispatch for allocator movement in operator=(fbvector&&)
843
+ void moveFrom(fbvector&& other, std::true_type) { swap(impl_, other.impl_); }
844
+ void moveFrom(fbvector&& other, std::false_type) {
845
+ if (impl_ == other.impl_) {
846
+ impl_.swapData(other.impl_);
847
+ } else {
848
+ impl_.reset(other.size());
849
+ M_uninitialized_move_e(other.begin(), other.end());
850
+ }
851
+ }
852
+
853
+ // contract dispatch for iterator types in assign(It first, It last)
854
+ template <class ForwardIterator>
855
+ void assign(
856
+ ForwardIterator first, ForwardIterator last, std::forward_iterator_tag) {
857
+ const auto newSize = size_type(std::distance(first, last));
858
+ if (newSize > capacity()) {
859
+ impl_.reset(newSize);
860
+ M_uninitialized_copy_e(first, last);
861
+ } else if (newSize <= size()) {
862
+ auto newEnd = std::copy(first, last, impl_.b_);
863
+ M_destroy_range_e(newEnd);
864
+ } else {
865
+ auto mid = S_copy_n(impl_.b_, first, size());
866
+ M_uninitialized_copy_e<decltype(last)>(mid, last);
867
+ }
868
+ }
869
+
870
+ template <class InputIterator>
871
+ void assign(
872
+ InputIterator first, InputIterator last, std::input_iterator_tag) {
873
+ auto p = impl_.b_;
874
+ for (; first != last && p != impl_.e_; ++first, ++p) {
875
+ *p = *first;
876
+ }
877
+ if (p != impl_.e_) {
878
+ M_destroy_range_e(p);
879
+ } else {
880
+ for (; first != last; ++first) {
881
+ emplace_back(*first);
882
+ }
883
+ }
884
+ }
885
+
886
+ // contract dispatch for aliasing under VT optimization
887
+ bool dataIsInternalAndNotVT(const T& t) {
888
+ if (should_pass_by_value) {
889
+ return false;
890
+ }
891
+ return dataIsInternal(t);
892
+ }
893
+ bool dataIsInternal(const T& t) {
894
+ return FOLLY_UNLIKELY(
895
+ impl_.b_ <= std::addressof(t) && std::addressof(t) < impl_.e_);
896
+ }
897
+
898
+ //===========================================================================
899
+ //---------------------------------------------------------------------------
900
+ // iterators
901
+ public:
902
+ iterator begin() noexcept { return impl_.b_; }
903
+ const_iterator begin() const noexcept { return impl_.b_; }
904
+ iterator end() noexcept { return impl_.e_; }
905
+ const_iterator end() const noexcept { return impl_.e_; }
906
+ reverse_iterator rbegin() noexcept { return reverse_iterator(end()); }
907
+ const_reverse_iterator rbegin() const noexcept {
908
+ return const_reverse_iterator(end());
909
+ }
910
+ reverse_iterator rend() noexcept { return reverse_iterator(begin()); }
911
+ const_reverse_iterator rend() const noexcept {
912
+ return const_reverse_iterator(begin());
913
+ }
914
+
915
+ const_iterator cbegin() const noexcept { return impl_.b_; }
916
+ const_iterator cend() const noexcept { return impl_.e_; }
917
+ const_reverse_iterator crbegin() const noexcept {
918
+ return const_reverse_iterator(end());
919
+ }
920
+ const_reverse_iterator crend() const noexcept {
921
+ return const_reverse_iterator(begin());
922
+ }
923
+
924
+ //===========================================================================
925
+ //---------------------------------------------------------------------------
926
+ // capacity
927
+ public:
928
+ size_type size() const noexcept { return size_type(impl_.e_ - impl_.b_); }
929
+
930
+ size_type max_size() const noexcept {
931
+ // good luck gettin' there
932
+ return ~size_type(0);
933
+ }
934
+
935
+ void resize(size_type n) {
936
+ if (n <= size()) {
937
+ M_destroy_range_e(impl_.b_ + n);
938
+ } else {
939
+ reserve(n);
940
+ M_uninitialized_fill_n_e(n - size());
941
+ }
942
+ }
943
+
944
+ void resize(size_type n, VT t) {
945
+ if (n <= size()) {
946
+ M_destroy_range_e(impl_.b_ + n);
947
+ } else if (dataIsInternalAndNotVT(t) && n > capacity()) {
948
+ T copy(t);
949
+ reserve(n);
950
+ M_uninitialized_fill_n_e(n - size(), copy);
951
+ } else {
952
+ reserve(n);
953
+ M_uninitialized_fill_n_e(n - size(), t);
954
+ }
955
+ }
956
+
957
+ size_type capacity() const noexcept { return size_type(impl_.z_ - impl_.b_); }
958
+
959
+ bool empty() const noexcept { return impl_.b_ == impl_.e_; }
960
+
961
+ void reserve(size_type n) {
962
+ if (n <= capacity()) {
963
+ return;
964
+ }
965
+ if (impl_.b_ && reserve_in_place(n)) {
966
+ return;
967
+ }
968
+
969
+ auto newCap = folly::goodMallocSize(n * sizeof(T)) / sizeof(T);
970
+ auto newB = M_allocate(newCap);
971
+ {
972
+ auto rollback = makeGuard([&] { M_deallocate(newB, newCap); });
973
+ M_relocate(newB);
974
+ rollback.dismiss();
975
+ }
976
+ if (impl_.b_) {
977
+ M_deallocate(impl_.b_, size_type(impl_.z_ - impl_.b_));
978
+ }
979
+ impl_.z_ = newB + newCap;
980
+ impl_.e_ = newB + (impl_.e_ - impl_.b_);
981
+ impl_.b_ = newB;
982
+ }
983
+
984
+ void shrink_to_fit() noexcept {
985
+ if (empty()) {
986
+ impl_.reset();
987
+ return;
988
+ }
989
+
990
+ auto const newCapacityBytes = folly::goodMallocSize(size() * sizeof(T));
991
+ auto const newCap = newCapacityBytes / sizeof(T);
992
+ auto const oldCap = capacity();
993
+
994
+ if (newCap >= oldCap) {
995
+ return;
996
+ }
997
+
998
+ void* p = impl_.b_;
999
+ // xallocx() will shrink to precisely newCapacityBytes (which was generated
1000
+ // by goodMallocSize()) if it successfully shrinks in place.
1001
+ if ((usingJEMalloc() && usingStdAllocator) &&
1002
+ newCapacityBytes >= folly::jemallocMinInPlaceExpandable &&
1003
+ xallocx(p, newCapacityBytes, 0, 0) == newCapacityBytes) {
1004
+ impl_.z_ += newCap - oldCap;
1005
+ } else {
1006
+ T* newB = static_cast<T*>(catch_exception(
1007
+ [&] { return M_allocate(newCap); }, //
1008
+ &detail::thunk_return_nullptr));
1009
+ if (!newB) {
1010
+ return;
1011
+ }
1012
+ if (!catch_exception(
1013
+ [&] { return M_relocate(newB), true; },
1014
+ [&] { return M_deallocate(newB, newCap), false; })) {
1015
+ return;
1016
+ }
1017
+ if (impl_.b_) {
1018
+ M_deallocate(impl_.b_, size_type(impl_.z_ - impl_.b_));
1019
+ }
1020
+ impl_.z_ = newB + newCap;
1021
+ impl_.e_ = newB + (impl_.e_ - impl_.b_);
1022
+ impl_.b_ = newB;
1023
+ }
1024
+ }
1025
+
1026
+ private:
1027
+ bool reserve_in_place(size_type n) {
1028
+ if (!usingStdAllocator || !usingJEMalloc()) {
1029
+ return false;
1030
+ }
1031
+
1032
+ // jemalloc can never grow in place blocks smaller than 4096 bytes.
1033
+ if ((impl_.z_ - impl_.b_) * sizeof(T) <
1034
+ folly::jemallocMinInPlaceExpandable) {
1035
+ return false;
1036
+ }
1037
+
1038
+ auto const newCapacityBytes = folly::goodMallocSize(n * sizeof(T));
1039
+ void* p = impl_.b_;
1040
+ if (xallocx(p, newCapacityBytes, 0, 0) == newCapacityBytes) {
1041
+ impl_.z_ = impl_.b_ + newCapacityBytes / sizeof(T);
1042
+ return true;
1043
+ }
1044
+ return false;
1045
+ }
1046
+
1047
+ //===========================================================================
1048
+ //---------------------------------------------------------------------------
1049
+ // element access
1050
+ public:
1051
+ reference operator[](size_type n) {
1052
+ assert(n < size());
1053
+ return impl_.b_[n];
1054
+ }
1055
+ const_reference operator[](size_type n) const {
1056
+ assert(n < size());
1057
+ return impl_.b_[n];
1058
+ }
1059
+ const_reference at(size_type n) const {
1060
+ if (FOLLY_UNLIKELY(n >= size())) {
1061
+ throw_exception<std::out_of_range>(
1062
+ "fbvector: index is greater than size.");
1063
+ }
1064
+ return (*this)[n];
1065
+ }
1066
+ reference at(size_type n) {
1067
+ auto const& cThis = *this;
1068
+ return const_cast<reference>(cThis.at(n));
1069
+ }
1070
+ reference front() {
1071
+ assert(!empty());
1072
+ return *impl_.b_;
1073
+ }
1074
+ const_reference front() const {
1075
+ assert(!empty());
1076
+ return *impl_.b_;
1077
+ }
1078
+ reference back() {
1079
+ assert(!empty());
1080
+ return impl_.e_[-1];
1081
+ }
1082
+ const_reference back() const {
1083
+ assert(!empty());
1084
+ return impl_.e_[-1];
1085
+ }
1086
+
1087
+ //===========================================================================
1088
+ //---------------------------------------------------------------------------
1089
+ // data access
1090
+ public:
1091
+ T* data() noexcept { return impl_.b_; }
1092
+ const T* data() const noexcept { return impl_.b_; }
1093
+
1094
+ //===========================================================================
1095
+ //---------------------------------------------------------------------------
1096
+ // modifiers (common)
1097
+ public:
1098
+ template <class... Args>
1099
+ reference emplace_back(Args&&... args) {
1100
+ if (impl_.e_ != impl_.z_) {
1101
+ M_construct(impl_.e_, std::forward<Args>(args)...);
1102
+ ++impl_.e_;
1103
+ } else {
1104
+ emplace_back_aux(std::forward<Args>(args)...);
1105
+ }
1106
+ return back();
1107
+ }
1108
+
1109
+ void push_back(const T& value) {
1110
+ if (impl_.e_ != impl_.z_) {
1111
+ M_construct(impl_.e_, value);
1112
+ ++impl_.e_;
1113
+ } else {
1114
+ emplace_back_aux(value);
1115
+ }
1116
+ }
1117
+
1118
+ void push_back(T&& value) {
1119
+ if (impl_.e_ != impl_.z_) {
1120
+ M_construct(impl_.e_, std::move(value));
1121
+ ++impl_.e_;
1122
+ } else {
1123
+ emplace_back_aux(std::move(value));
1124
+ }
1125
+ }
1126
+
1127
+ void pop_back() {
1128
+ assert(!empty());
1129
+ --impl_.e_;
1130
+ M_destroy(impl_.e_);
1131
+ }
1132
+
1133
+ void swap(fbvector& other) noexcept {
1134
+ if (!usingStdAllocator && A::propagate_on_container_swap::value) {
1135
+ swap(impl_, other.impl_);
1136
+ } else {
1137
+ impl_.swapData(other.impl_);
1138
+ }
1139
+ }
1140
+
1141
+ void clear() noexcept { M_destroy_range_e(impl_.b_); }
1142
+
1143
+ private:
1144
+ // std::vector implements a similar function with a different growth
1145
+ // strategy: empty() ? 1 : capacity() * 2.
1146
+ //
1147
+ // fbvector grows differently on two counts:
1148
+ //
1149
+ // (1) initial size
1150
+ // Instead of growing to size 1 from empty, fbvector allocates at least
1151
+ // 64 bytes. You may still use reserve to reserve a lesser amount of
1152
+ // memory.
1153
+ // (2) 1.5x
1154
+ // For medium-sized vectors, the growth strategy is 1.5x. See the docs
1155
+ // for details.
1156
+ // This does not apply to very small or very large fbvectors. This is a
1157
+ // heuristic.
1158
+ // A nice addition to fbvector would be the capability of having a user-
1159
+ // defined growth strategy, probably as part of the allocator.
1160
+ //
1161
+
1162
+ size_type computePushBackCapacity() const {
1163
+ if (capacity() == 0) {
1164
+ return std::max(64 / sizeof(T), size_type(1));
1165
+ }
1166
+ if (capacity() < folly::jemallocMinInPlaceExpandable / sizeof(T)) {
1167
+ return capacity() * 2;
1168
+ }
1169
+ if (capacity() > 4096 * 32 / sizeof(T)) {
1170
+ return capacity() * 2;
1171
+ }
1172
+ return (capacity() * 3 + 1) / 2;
1173
+ }
1174
+
1175
+ template <class... Args>
1176
+ void emplace_back_aux(Args&&... args) {
1177
+ size_type byte_sz =
1178
+ folly::goodMallocSize(computePushBackCapacity() * sizeof(T));
1179
+ if (usingStdAllocator && usingJEMalloc() &&
1180
+ ((impl_.z_ - impl_.b_) * sizeof(T) >=
1181
+ folly::jemallocMinInPlaceExpandable)) {
1182
+ // Try to reserve in place.
1183
+ // Ask xallocx to allocate in place at least size()+1 and at most sz
1184
+ // space.
1185
+ // xallocx will allocate as much as possible within that range, which
1186
+ // is the best possible outcome: if sz space is available, take it all,
1187
+ // otherwise take as much as possible. If nothing is available, then
1188
+ // fail.
1189
+ // In this fashion, we never relocate if there is a possibility of
1190
+ // expanding in place, and we never reallocate by less than the desired
1191
+ // amount unless we cannot expand further. Hence we will not reallocate
1192
+ // sub-optimally twice in a row (modulo the blocking memory being freed).
1193
+ size_type lower = folly::goodMallocSize(sizeof(T) + size() * sizeof(T));
1194
+ size_type upper = byte_sz;
1195
+ size_type extra = upper - lower;
1196
+
1197
+ void* p = impl_.b_;
1198
+ size_t actual;
1199
+
1200
+ if ((actual = xallocx(p, lower, extra, 0)) >= lower) {
1201
+ impl_.z_ = impl_.b_ + actual / sizeof(T);
1202
+ M_construct(impl_.e_, std::forward<Args>(args)...);
1203
+ ++impl_.e_;
1204
+ return;
1205
+ }
1206
+ }
1207
+
1208
+ // Reallocation failed. Perform a manual relocation.
1209
+ size_type sz = byte_sz / sizeof(T);
1210
+ auto newB = M_allocate(sz);
1211
+ auto newE = newB + size();
1212
+ {
1213
+ auto rollback1 = makeGuard([&] { M_deallocate(newB, sz); });
1214
+ if (folly::IsRelocatable<T>::value && usingStdAllocator) {
1215
+ // For linear memory access, relocate before construction.
1216
+ // By the test condition, relocate is noexcept.
1217
+ // Note that there is no cleanup to do if M_construct throws - that's
1218
+ // one of the beauties of relocation.
1219
+ // Benchmarks for this code have high variance, and seem to be close.
1220
+ relocate_move(newB, impl_.b_, impl_.e_);
1221
+ M_construct(newE, std::forward<Args>(args)...);
1222
+ ++newE;
1223
+ } else {
1224
+ M_construct(newE, std::forward<Args>(args)...);
1225
+ ++newE;
1226
+ auto rollback2 = makeGuard([&] { M_destroy(newE - 1); });
1227
+ M_relocate(newB);
1228
+ rollback2.dismiss();
1229
+ }
1230
+ rollback1.dismiss();
1231
+ }
1232
+ if (impl_.b_) {
1233
+ M_deallocate(impl_.b_, size());
1234
+ }
1235
+ impl_.b_ = newB;
1236
+ impl_.e_ = newE;
1237
+ impl_.z_ = newB + sz;
1238
+ }
1239
+
1240
+ //===========================================================================
1241
+ //---------------------------------------------------------------------------
1242
+ // modifiers (erase)
1243
+ public:
1244
+ iterator erase(const_iterator position) {
1245
+ return erase(position, position + 1);
1246
+ }
1247
+
1248
+ iterator erase(const_iterator first, const_iterator last) {
1249
+ assert(isValid(first) && isValid(last));
1250
+ assert(first <= last);
1251
+ if (first != last) {
1252
+ if (last == end()) {
1253
+ M_destroy_range_e((iterator)first);
1254
+ } else {
1255
+ if (folly::IsRelocatable<T>::value && usingStdAllocator) {
1256
+ D_destroy_range_a((iterator)first, (iterator)last);
1257
+ if (last - first >= cend() - last) {
1258
+ std::memcpy((void*)first, (void*)last, (cend() - last) * sizeof(T));
1259
+ } else {
1260
+ std::memmove(
1261
+ (void*)first, (void*)last, (cend() - last) * sizeof(T));
1262
+ }
1263
+ impl_.e_ -= (last - first);
1264
+ } else {
1265
+ std::copy(
1266
+ std::make_move_iterator((iterator)last),
1267
+ std::make_move_iterator(end()),
1268
+ (iterator)first);
1269
+ auto newEnd = impl_.e_ - std::distance(first, last);
1270
+ M_destroy_range_e(newEnd);
1271
+ }
1272
+ }
1273
+ }
1274
+ return (iterator)first;
1275
+ }
1276
+
1277
+ //===========================================================================
1278
+ //---------------------------------------------------------------------------
1279
+ // modifiers (insert)
1280
+ private: // we have the private section first because it defines some macros
1281
+ bool isValid(const_iterator it) { return cbegin() <= it && it <= cend(); }
1282
+
1283
+ size_type computeInsertCapacity(size_type n) {
1284
+ size_type nc = std::max(computePushBackCapacity(), size() + n);
1285
+ size_type ac = folly::goodMallocSize(nc * sizeof(T)) / sizeof(T);
1286
+ return ac;
1287
+ }
1288
+
1289
+ //---------------------------------------------------------------------------
1290
+ //
1291
+ // make_window takes an fbvector, and creates an uninitialized gap (a
1292
+ // window) at the given position, of the given size. The fbvector must
1293
+ // have enough capacity.
1294
+ //
1295
+ // Explanation by picture.
1296
+ //
1297
+ // 123456789______
1298
+ // ^
1299
+ // make_window here of size 3
1300
+ //
1301
+ // 1234___56789___
1302
+ //
1303
+ // If something goes wrong and the window must be destroyed, use
1304
+ // undo_window to provide a weak exception guarantee. It destroys
1305
+ // the right ledge.
1306
+ //
1307
+ // 1234___________
1308
+ //
1309
+ //---------------------------------------------------------------------------
1310
+ //
1311
+ // wrap_frame takes an inverse window and relocates an fbvector around it.
1312
+ // The fbvector must have at least as many elements as the left ledge.
1313
+ //
1314
+ // Explanation by picture.
1315
+ //
1316
+ // START
1317
+ // fbvector: inverse window:
1318
+ // 123456789______ _____abcde_______
1319
+ // [idx][ n ]
1320
+ //
1321
+ // RESULT
1322
+ // _______________ 12345abcde6789___
1323
+ //
1324
+ //---------------------------------------------------------------------------
1325
+ //
1326
+ // insert_use_fresh_memory returns true iff the fbvector should use a fresh
1327
+ // block of memory for the insertion. If the fbvector does not have enough
1328
+ // spare capacity, then it must return true. Otherwise either true or false
1329
+ // may be returned.
1330
+ //
1331
+ //---------------------------------------------------------------------------
1332
+ //
1333
+ // These three functions, make_window, wrap_frame, and
1334
+ // insert_use_fresh_memory, can be combined into a uniform interface.
1335
+ // Since that interface involves a lot of case-work, it is built into
1336
+ // some macros: FOLLY_FBVECTOR_INSERT_(PRE|START|TRY|END)
1337
+ // Macros are used in an attempt to let GCC perform better optimizations,
1338
+ // especially control flow optimization.
1339
+ //
1340
+
1341
+ //---------------------------------------------------------------------------
1342
+ // window
1343
+
1344
+ void make_window(iterator position, size_type n) {
1345
+ // The result is guaranteed to be non-negative, so use an unsigned type:
1346
+ size_type tail = size_type(std::distance(position, impl_.e_));
1347
+
1348
+ if (tail <= n) {
1349
+ relocate_move(position + n, position, impl_.e_);
1350
+ relocate_done(position + n, position, impl_.e_);
1351
+ impl_.e_ += n;
1352
+ } else {
1353
+ if (folly::IsRelocatable<T>::value && usingStdAllocator) {
1354
+ compiler_may_unsafely_assume(position != nullptr);
1355
+ std::memmove((void*)(position + n), (void*)position, tail * sizeof(T));
1356
+ impl_.e_ += n;
1357
+ } else {
1358
+ D_uninitialized_move_a(impl_.e_, impl_.e_ - n, impl_.e_);
1359
+ {
1360
+ auto rollback = makeGuard([&] {
1361
+ D_destroy_range_a(impl_.e_ - n, impl_.e_ + n);
1362
+ impl_.e_ -= n;
1363
+ });
1364
+ std::copy_backward(
1365
+ std::make_move_iterator(position),
1366
+ std::make_move_iterator(impl_.e_ - n),
1367
+ impl_.e_);
1368
+ rollback.dismiss();
1369
+ }
1370
+ impl_.e_ += n;
1371
+ D_destroy_range_a(position, position + n);
1372
+ }
1373
+ }
1374
+ }
1375
+
1376
+ void undo_window(iterator position, size_type n) noexcept {
1377
+ D_destroy_range_a(position + n, impl_.e_);
1378
+ impl_.e_ = position;
1379
+ }
1380
+
1381
+ //---------------------------------------------------------------------------
1382
+ // frame
1383
+
1384
+ void wrap_frame(T* ledge, size_type idx, size_type n) {
1385
+ assert(size() >= idx);
1386
+ assert(n != 0);
1387
+
1388
+ relocate_move(ledge, impl_.b_, impl_.b_ + idx);
1389
+ {
1390
+ auto rollback = makeGuard([&] { //
1391
+ relocate_undo(ledge, impl_.b_, impl_.b_ + idx);
1392
+ });
1393
+ relocate_move(ledge + idx + n, impl_.b_ + idx, impl_.e_);
1394
+ rollback.dismiss();
1395
+ }
1396
+ relocate_done(ledge, impl_.b_, impl_.b_ + idx);
1397
+ relocate_done(ledge + idx + n, impl_.b_ + idx, impl_.e_);
1398
+ }
1399
+
1400
+ //---------------------------------------------------------------------------
1401
+ // use fresh?
1402
+
1403
+ bool insert_use_fresh(bool at_end, size_type n) {
1404
+ if (at_end) {
1405
+ if (size() + n <= capacity()) {
1406
+ return false;
1407
+ }
1408
+ if (reserve_in_place(size() + n)) {
1409
+ return false;
1410
+ }
1411
+ return true;
1412
+ }
1413
+
1414
+ if (size() + n > capacity()) {
1415
+ return true;
1416
+ }
1417
+
1418
+ return false;
1419
+ }
1420
+
1421
+ //---------------------------------------------------------------------------
1422
+ // interface
1423
+
1424
+ template <
1425
+ typename IsInternalFunc,
1426
+ typename InsertInternalFunc,
1427
+ typename ConstructFunc,
1428
+ typename DestroyFunc>
1429
+ iterator do_real_insert(
1430
+ const_iterator cpos,
1431
+ size_type n,
1432
+ IsInternalFunc&& isInternalFunc,
1433
+ InsertInternalFunc&& insertInternalFunc,
1434
+ ConstructFunc&& constructFunc,
1435
+ DestroyFunc&& destroyFunc) {
1436
+ if (n == 0) {
1437
+ return iterator(cpos);
1438
+ }
1439
+ bool at_end = cpos == cend();
1440
+ bool fresh = insert_use_fresh(at_end, n);
1441
+ if (!at_end) {
1442
+ if (!fresh && isInternalFunc()) {
1443
+ // check for internal data (technically not required by the standard)
1444
+ return insertInternalFunc();
1445
+ }
1446
+ assert(isValid(cpos));
1447
+ }
1448
+ T* position = const_cast<T*>(cpos);
1449
+ size_type idx = size_type(std::distance(impl_.b_, position));
1450
+ T* b;
1451
+ size_type newCap; /* intentionally uninitialized */
1452
+
1453
+ if (fresh) {
1454
+ newCap = computeInsertCapacity(n);
1455
+ b = M_allocate(newCap);
1456
+ } else {
1457
+ if (!at_end) {
1458
+ make_window(position, n);
1459
+ } else {
1460
+ impl_.e_ += n;
1461
+ }
1462
+ b = impl_.b_;
1463
+ }
1464
+
1465
+ T* start = b + idx;
1466
+ {
1467
+ auto rollback = makeGuard([&] {
1468
+ if (fresh) {
1469
+ M_deallocate(b, newCap);
1470
+ } else {
1471
+ if (!at_end) {
1472
+ undo_window(position, n);
1473
+ } else {
1474
+ impl_.e_ -= n;
1475
+ }
1476
+ }
1477
+ });
1478
+ // construct the inserted elements
1479
+ constructFunc(start);
1480
+ rollback.dismiss();
1481
+ }
1482
+
1483
+ if (fresh) {
1484
+ {
1485
+ auto rollback = makeGuard([&] {
1486
+ // delete the inserted elements (exception has been thrown)
1487
+ destroyFunc(start);
1488
+ M_deallocate(b, newCap);
1489
+ });
1490
+ wrap_frame(b, idx, n);
1491
+ rollback.dismiss();
1492
+ }
1493
+ if (impl_.b_) {
1494
+ M_deallocate(impl_.b_, capacity());
1495
+ }
1496
+ impl_.set(b, size() + n, newCap);
1497
+ return impl_.b_ + idx;
1498
+ } else {
1499
+ return position;
1500
+ }
1501
+ }
1502
+
1503
+ public:
1504
+ template <class... Args>
1505
+ iterator emplace(const_iterator cpos, Args&&... args) {
1506
+ return do_real_insert(
1507
+ cpos,
1508
+ 1,
1509
+ [&] { return false; },
1510
+ [&] { return iterator{}; },
1511
+ [&](iterator start) {
1512
+ M_construct(start, std::forward<Args>(args)...);
1513
+ },
1514
+ [&](iterator start) { M_destroy(start); });
1515
+ }
1516
+
1517
+ iterator insert(const_iterator cpos, const T& value) {
1518
+ return do_real_insert(
1519
+ cpos,
1520
+ 1,
1521
+ [&] { return dataIsInternal(value); },
1522
+ [&] { return insert(cpos, T(value)); },
1523
+ [&](iterator start) { M_construct(start, value); },
1524
+ [&](iterator start) { M_destroy(start); });
1525
+ }
1526
+
1527
+ iterator insert(const_iterator cpos, T&& value) {
1528
+ return do_real_insert(
1529
+ cpos,
1530
+ 1,
1531
+ [&] { return dataIsInternal(value); },
1532
+ [&] { return insert(cpos, T(std::move(value))); },
1533
+ [&](iterator start) { M_construct(start, std::move(value)); },
1534
+ [&](iterator start) { M_destroy(start); });
1535
+ }
1536
+
1537
+ iterator insert(const_iterator cpos, size_type n, VT value) {
1538
+ return do_real_insert(
1539
+ cpos,
1540
+ n,
1541
+ [&] { return dataIsInternalAndNotVT(value); },
1542
+ [&] { return insert(cpos, n, T(value)); },
1543
+ [&](iterator start) { D_uninitialized_fill_n_a(start, n, value); },
1544
+ [&](iterator start) { D_destroy_range_a(start, start + n); });
1545
+ }
1546
+
1547
+ template <
1548
+ class It,
1549
+ class Category = typename std::iterator_traits<It>::iterator_category>
1550
+ iterator insert(const_iterator cpos, It first, It last) {
1551
+ return insert(cpos, first, last, Category());
1552
+ }
1553
+
1554
+ iterator insert(const_iterator cpos, std::initializer_list<T> il) {
1555
+ return insert(cpos, il.begin(), il.end());
1556
+ }
1557
+
1558
+ //---------------------------------------------------------------------------
1559
+ // insert dispatch for iterator types
1560
+ private:
1561
+ template <class FIt>
1562
+ iterator insert(
1563
+ const_iterator cpos, FIt first, FIt last, std::forward_iterator_tag) {
1564
+ size_type n = size_type(std::distance(first, last));
1565
+ return do_real_insert(
1566
+ cpos,
1567
+ n,
1568
+ [&] { return false; },
1569
+ [&] { return iterator{}; },
1570
+ [&](iterator start) { D_uninitialized_copy_a(start, first, last); },
1571
+ [&](iterator start) { D_destroy_range_a(start, start + n); });
1572
+ }
1573
+
1574
+ template <class IIt>
1575
+ iterator insert(
1576
+ const_iterator cpos, IIt first, IIt last, std::input_iterator_tag) {
1577
+ T* position = const_cast<T*>(cpos);
1578
+ assert(isValid(position));
1579
+ size_type idx = std::distance(begin(), position);
1580
+
1581
+ fbvector storage(
1582
+ std::make_move_iterator(position),
1583
+ std::make_move_iterator(end()),
1584
+ A::select_on_container_copy_construction(impl_));
1585
+ M_destroy_range_e(position);
1586
+ for (; first != last; ++first) {
1587
+ emplace_back(*first);
1588
+ }
1589
+ insert(
1590
+ cend(),
1591
+ std::make_move_iterator(storage.begin()),
1592
+ std::make_move_iterator(storage.end()));
1593
+ return impl_.b_ + idx;
1594
+ }
1595
+
1596
+ //===========================================================================
1597
+ //---------------------------------------------------------------------------
1598
+ // lexicographical functions
1599
+ public:
1600
+ bool operator==(const fbvector& other) const {
1601
+ return size() == other.size() && std::equal(begin(), end(), other.begin());
1602
+ }
1603
+
1604
+ bool operator!=(const fbvector& other) const { return !(*this == other); }
1605
+
1606
+ bool operator<(const fbvector& other) const {
1607
+ return std::lexicographical_compare(
1608
+ begin(), end(), other.begin(), other.end());
1609
+ }
1610
+
1611
+ bool operator>(const fbvector& other) const { return other < *this; }
1612
+
1613
+ bool operator<=(const fbvector& other) const { return !(*this > other); }
1614
+
1615
+ bool operator>=(const fbvector& other) const { return !(*this < other); }
1616
+
1617
+ //===========================================================================
1618
+ //---------------------------------------------------------------------------
1619
+ // friends
1620
+ private:
1621
+ template <class _T, class _A>
1622
+ friend _T* relinquish(fbvector<_T, _A>&);
1623
+
1624
+ template <class _T, class _A>
1625
+ friend void attach(fbvector<_T, _A>&, _T* data, size_t sz, size_t cap);
1626
+
1627
+ }; // class fbvector
1628
+
1629
+ //=============================================================================
1630
+ //-----------------------------------------------------------------------------
1631
+ // specialized functions
1632
+
1633
+ template <class T, class A>
1634
+ void swap(fbvector<T, A>& lhs, fbvector<T, A>& rhs) noexcept {
1635
+ lhs.swap(rhs);
1636
+ }
1637
+
1638
+ //=============================================================================
1639
+ //-----------------------------------------------------------------------------
1640
+ // other
1641
+
1642
+ namespace detail {
1643
+
1644
+ // Format support.
1645
+ template <class T, class A>
1646
+ struct IndexableTraits<fbvector<T, A>>
1647
+ : public IndexableTraitsSeq<fbvector<T, A>> {};
1648
+
1649
+ } // namespace detail
1650
+
1651
+ template <class T, class A>
1652
+ void compactResize(fbvector<T, A>* v, size_t sz) {
1653
+ v->resize(sz);
1654
+ v->shrink_to_fit();
1655
+ }
1656
+
1657
+ // DANGER
1658
+ //
1659
+ // relinquish and attach are not a members function specifically so that it is
1660
+ // awkward to call them. It is very easy to shoot yourself in the foot with
1661
+ // these functions.
1662
+ //
1663
+ // If you call relinquish, then it is your responsibility to free the data
1664
+ // and the storage, both of which may have been generated in a non-standard
1665
+ // way through the fbvector's allocator.
1666
+ //
1667
+ // If you call attach, it is your responsibility to ensure that the fbvector
1668
+ // is fresh (size and capacity both zero), and that the supplied data is
1669
+ // capable of being manipulated by the allocator.
1670
+ // It is acceptable to supply a stack pointer IF:
1671
+ // (1) The vector's data does not outlive the stack pointer. This includes
1672
+ // extension of the data's life through a move operation.
1673
+ // (2) The pointer has enough capacity that the vector will never be
1674
+ // relocated.
1675
+ // (3) Insert is not called on the vector; these functions have leeway to
1676
+ // relocate the vector even if there is enough capacity.
1677
+ // (4) A stack pointer is compatible with the fbvector's allocator.
1678
+ //
1679
+
1680
+ template <class T, class A>
1681
+ T* relinquish(fbvector<T, A>& v) {
1682
+ T* ret = v.data();
1683
+ v.impl_.b_ = v.impl_.e_ = v.impl_.z_ = nullptr;
1684
+ return ret;
1685
+ }
1686
+
1687
+ template <class T, class A>
1688
+ void attach(fbvector<T, A>& v, T* data, size_t sz, size_t cap) {
1689
+ assert(v.data() == nullptr);
1690
+ v.impl_.b_ = data;
1691
+ v.impl_.e_ = data + sz;
1692
+ v.impl_.z_ = data + cap;
1693
+ }
1694
+
1695
+ template <
1696
+ class InputIt,
1697
+ class Allocator =
1698
+ std::allocator<typename std::iterator_traits<InputIt>::value_type>>
1699
+ fbvector(InputIt, InputIt, Allocator = Allocator())
1700
+ -> fbvector<typename std::iterator_traits<InputIt>::value_type, Allocator>;
1701
+
1702
+ template <class T, class A, class U>
1703
+ void erase(fbvector<T, A>& v, U value) {
1704
+ v.erase(std::remove(v.begin(), v.end(), value), v.end());
1705
+ }
1706
+
1707
+ template <class T, class A, class Predicate>
1708
+ void erase_if(fbvector<T, A>& v, Predicate predicate) {
1709
+ v.erase(std::remove_if(v.begin(), v.end(), std::ref(predicate)), v.end());
1710
+ }
1711
+ } // namespace folly