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,1683 @@
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
+ * This header defines two new containers, heap_vector_set and heap_vector_map
19
+ * classes. These containers are designed to be a drop-in replacement of
20
+ * sorted_vector_set and sorted_vector_map. Similarly to sorted_vector_map/set,
21
+ * heap_vector_map/set models AssociativeContainers. Below, we list important
22
+ * differences from std::set and std::map (also documented in
23
+ * folly/sorted_vector_types.h):
24
+ *
25
+ * - insert() and erase() invalidate iterators and references.
26
+ * - erase(iterator) returns an iterator pointing to the next valid element.
27
+ * - insert() and erase() are O(N)
28
+ * - our iterators model RandomAccessIterator
29
+ * - heap_vector_map::value_type is pair<K,V>, not pair<const K,V>.
30
+ * (This is basically because we want to store the value_type in
31
+ * std::vector<>, which requires it to be Assignable.)
32
+ * - insert() single key variants, emplace(), and emplace_hint() only provide
33
+ * the strong exception guarantee (unchanged when exception is thrown) when
34
+ * std::is_nothrow_move_constructible<value_type>::value is true.
35
+ *
36
+ * heap_vector_map/set have exactly the same size as sorted_vector_map/set.
37
+ * These containers utilizes a vector container (e.g. std::vector) to store the
38
+ * values. Heap containers (similarly to sorted containers) have no additional
39
+ * memory overhead. They lay out the data in an optimal way w.r.t locality (see
40
+ * https://algorithmica.org/en/eytzinger), called eytzinger or heap order. For
41
+ * example in a sorted_vector_set, the underlying vector contains:
42
+ * index 0 1 2 3 4 5 6 7 8 9
43
+ * vector[index] 0, 10, 20, 30, 40, 50, 60, 70, 80, 90
44
+ * while in a heap_vector_set, the underlying vector contains:
45
+ * index 0 1 2 3 4 5 6 7 8 9
46
+ * vector[index] 60, 30, 80, 10, 50, 70, 90, 0, 20, 40
47
+ * Lookup elements in sorted vector containers relies on binary search,
48
+ * std::lower_bound. While in heap containers, lookup operation has two
49
+ * benefits:
50
+ *
51
+ * 1. Cache locality, the container is traversed sequentially instead of binary
52
+ * search that jumps around the sorted vector.
53
+ * 2. The branches in a binary search are mispredicted resulting in hardware
54
+ * penalty while using heap lookup search the branch can be avoided by using
55
+ * cmov instruction. We observerd look up operations are up to 2X faster than
56
+ * sorted_vector_map.
57
+ *
58
+ * However, Insertion/deletion operations are much slower. If insertions and
59
+ * deletions are rare operations for your use case then heap containers might
60
+ * be the right choice for you. Also, to minimize impact of insertions while
61
+ * creating heap containers, we recommend not to insert element by element
62
+ * instead first collect elements in a vector, then construct the heap map from
63
+ * it.
64
+ *
65
+ * Another substantial trade off, inorder traversal of heap container elements
66
+ * is slower than sorted vector containers. This is expected as heap map needs
67
+ * to jump around to access map elements in order. A remedy is to use underlying
68
+ * vector iterators. This works only when the order is irrelevant. For example,
69
+ * using heap container iterator:
70
+ * for (auto& e: HeapSet)
71
+ * std::cout << e << ", ";
72
+ * Prints: 0, 10, 20, 30, 40, 50, 60, 70, 80, 90
73
+ * and using underlying vector container iterator:
74
+ * for (auto& e : HeapSet.iterate())
75
+ * std::cout << e << ", ";
76
+ * Prints: 60, 30, 80, 10, 50, 70, 90, 0, 20, 40
77
+ * The latter loop is the fastest traversal.
78
+ *
79
+ * Finally The main benefit of heap containers is a compact representation
80
+ * that achieves fast random lookup. Use this map when lookup is the
81
+ * dominant operation and at the same time saving memory is important.
82
+ */
83
+
84
+ #pragma once
85
+
86
+ #include <algorithm>
87
+ #include <cassert>
88
+ #include <functional>
89
+ #include <initializer_list>
90
+ #include <iterator>
91
+ #include <memory>
92
+ #include <stdexcept>
93
+ #include <type_traits>
94
+ #include <utility>
95
+ #include <vector>
96
+
97
+ #include <folly/Range.h>
98
+ #include <folly/ScopeGuard.h>
99
+ #include <folly/Traits.h>
100
+ #include <folly/Utility.h>
101
+ #include <folly/container/Iterator.h>
102
+ #include <folly/functional/Invoke.h>
103
+ #include <folly/lang/Exception.h>
104
+ #include <folly/memory/MemoryResource.h>
105
+ #include <folly/portability/Builtins.h>
106
+ #include <folly/small_vector.h>
107
+
108
+ namespace folly {
109
+ template <
110
+ typename Key,
111
+ typename Value,
112
+ typename Compare,
113
+ typename Allocator,
114
+ typename GrowthPolicy,
115
+ typename Container>
116
+ class heap_vector_map;
117
+
118
+ namespace detail {
119
+
120
+ namespace heap_vector_detail {
121
+
122
+ /*
123
+ * Heap Containers Helper Functions
124
+ * ---------------------------------
125
+ * Terminology:
126
+ * - offset means the index at which element is stored in the container vector,
127
+ * following the heap order.
128
+ * - index means the element rank following the container compare order.
129
+ *
130
+ * Introduction:
131
+ * Heap order can be constructed from a sorted input vector using below
132
+ * naive algorithm.
133
+ *
134
+ * heapify(input, output, index = 0, offset = 1) {
135
+ * if (offset <= size) {
136
+ * index = heapify(input, output, i, 2 * offset);
137
+ * output[offset - 1] = input[index++];
138
+ * index = heapify(input, output, i, 2 * offset + 1);
139
+ * }
140
+ * return index;
141
+ * }
142
+ *
143
+ * Helper functions below implement efficient algorithms to:
144
+ * - Find offsets of the smallest/greatest elements.
145
+ * - Given an offset, calculate the offset where next/previous element is
146
+ * stored if it exists.
147
+ * - Given a start and an end offsets, calculate distance between their
148
+ * corresponding indexes.
149
+ * - Fast inplace heapification.
150
+ * - Insert a new element while preserving heap order.
151
+ * - Delete an element and preserve heap order.
152
+ * - find lower/upper bound of a key following container compare order.
153
+ */
154
+
155
+ // Returns the offset of the smallest element in the heap container.
156
+ // The samllest element is stored at:
157
+ // vector[2^n - 1] where 2^n <= size < 2^(n+1).
158
+ // firstOffset returns 2^n - 1 if size > 0, 0 otherwise
159
+ template <typename size_type>
160
+ size_type firstOffset(size_type size) {
161
+ if (size) {
162
+ return (1
163
+ << (CHAR_BIT * sizeof(unsigned long) -
164
+ __builtin_clzl((unsigned long)size) - 1)) -
165
+ 1;
166
+ } else {
167
+ return 0;
168
+ }
169
+ }
170
+
171
+ // Returns the offset of greatest element in heap container.
172
+ // the greatest element is storted at:
173
+ // vector[2^n - 2] if 2^n - 1 <= size < 2^(n+1)
174
+ // lastOffset returns 2^n - 2 if size > 0, 0 otherwise
175
+ template <typename size_type>
176
+ size_type lastOffset(size_type size) {
177
+ if (size) {
178
+ return ((size & (size + 1)) == 0 ? size : firstOffset(size)) - 1;
179
+ }
180
+ return 0;
181
+ }
182
+
183
+ // Returns the offset of the next element. It is calculated based on the
184
+ // size of the map.
185
+ // To simplify implementation, offset must be 1-based
186
+ // return value is also 1-based.
187
+ template <typename size_type>
188
+ size_type next(size_type offset, size_type size) {
189
+ auto next = (2 * offset);
190
+ if (next >= size) {
191
+ return offset >> __builtin_ffsl((unsigned long)~offset);
192
+ } else {
193
+ next += 1;
194
+ for (auto n = 2 * next; n <= size; n *= 2) {
195
+ next = n;
196
+ }
197
+ return next;
198
+ }
199
+ }
200
+
201
+ // Returns the offset of the previous element. It is calculated based on
202
+ // the size of the map.
203
+ // To simplify implementation, offset must be 1-based
204
+ // return value is also 1-based.
205
+ template <typename size_type>
206
+ size_type prev(size_type offset, size_type size) {
207
+ auto prev = 2 * offset;
208
+ if (prev <= size) {
209
+ for (auto p = 2 * prev + 1; p <= size; p = 2 * p + 1) {
210
+ if (2 * p >= size) {
211
+ return p;
212
+ }
213
+ }
214
+ return prev;
215
+ }
216
+ return offset >> __builtin_ffsl((unsigned long)offset);
217
+ }
218
+
219
+ // To avoid scanning all offsets, skip offsets that cannot be within the
220
+ // range of offset1 and offset2.
221
+ // Note We could compute least common ancestor of offset1 and offset2
222
+ // to further minimize scanning. However it is not profitable when container
223
+ // is relatively small.
224
+ template <typename size_type>
225
+ size_type getStartOffsetToScan(size_type offset1, size_type offset2) {
226
+ while ((offset1 & (offset1 - 1)) != 0) {
227
+ offset1 >>= 1;
228
+ }
229
+ if (offset1 > 1) {
230
+ while ((offset2 & (offset2 - 1)) != 0) {
231
+ offset2 >>= 1;
232
+ }
233
+ offset1 = std::min(offset1, offset2);
234
+ }
235
+ return offset1;
236
+ }
237
+
238
+ // Given a start and end offsets, returns the distance between
239
+ // their corresponding indexes.
240
+ template <typename Container, typename size_type>
241
+ typename Container::difference_type distance(
242
+ Container& cont, size_type start, size_type end) {
243
+ using difference_type = typename Container::difference_type;
244
+ difference_type dist = 0;
245
+ size_type size = cont.size();
246
+ // To simplify logic base start and end from one.
247
+ start++;
248
+ end++;
249
+ std::function<bool(size_type, size_type)> calculateDistance =
250
+ [&](size_type offset, size_type lb) {
251
+ if (offset > size)
252
+ return false;
253
+ for (; offset <= size; offset <<= 1)
254
+ ;
255
+ offset >>= 1;
256
+ for (; offset > lb; offset >>= 1) {
257
+ if (offset == start) {
258
+ if (dist) {
259
+ dist *= -1;
260
+ return true;
261
+ }
262
+ dist = 1;
263
+ } else if (offset == end) {
264
+ if (dist) {
265
+ return true;
266
+ }
267
+ dist = 1;
268
+ } else if (dist) {
269
+ dist++;
270
+ }
271
+ if (calculateDistance(2 * offset + 1, offset)) {
272
+ return true;
273
+ }
274
+ }
275
+ return false;
276
+ };
277
+ auto offset = getStartOffsetToScan(start, end);
278
+ calculateDistance(offset, size_type(0));
279
+ // Handle start == end()
280
+ if (start > size) {
281
+ dist *= -1;
282
+ }
283
+
284
+ return dist;
285
+ }
286
+
287
+ // Returns the offset for each index in heap container
288
+ // for example if size = 7 then
289
+ // index 0 1 2 3 4 5 6
290
+ // offsets = { 3, 1, 4, 0, 5, 2, 6 }
291
+ // The smallest element (index = 0) of heap container is stored at cont[3] and
292
+ // so on.
293
+ template <typename size_type, typename Offsets>
294
+ void getOffsets(size_type size, Offsets& offsets) {
295
+ size_type i = 0;
296
+ size_type offset = 0;
297
+ size_type index = size;
298
+ do {
299
+ for (size_type o = offset; o < size; o = 2 * o + 2) {
300
+ offsets[i++] = o;
301
+ }
302
+ offset = offsets[--i];
303
+ offsets[--index] = offset;
304
+ offset = 2 * offset + 1;
305
+ } while (i || offset < size);
306
+ }
307
+
308
+ // Inplace conversion of a sorted vector to heap layout
309
+ // This algorithm utilizes circular swaps to position each element in its heap
310
+ // order offset in the vector. For example, given a sorted vector below:
311
+ // cont = { 0, 10, 20, 30, 40, 50, 60, 70 }
312
+ // getOffsets returns:
313
+ // index 0 1 2 3 4 5 6 7
314
+ // offsets = { 4, 2, 6, 1, 3, 5, 7, 0 }
315
+ //
316
+ // The algorithm moves elements circularly:
317
+ // cont[4]->cont[0]->cont[7]->cont[6]->cont[2]->cont[1]->cont[3]-> cont[4]
318
+ // cont[5] remains inplace
319
+ // returns:
320
+ // cont = { 40, 20, 60, 10, 30, 50, 70, 0 }
321
+ template <class Container>
322
+ void heapify(Container& cont) {
323
+ using size_type = typename Container::size_type;
324
+ size_type size = cont.size();
325
+ std::vector<size_type> offsets;
326
+ offsets.resize(size);
327
+ getOffsets(size, offsets);
328
+
329
+ std::function<void(size_type, size_type)> rotate = [&](size_type next,
330
+ size_type index) {
331
+ std::vector<size_type> worklist;
332
+ while (index != next) {
333
+ worklist.push_back(next);
334
+ next = offsets[next];
335
+ }
336
+ while (!worklist.empty()) {
337
+ auto cur = worklist.back();
338
+ worklist.pop_back();
339
+ cont[offsets[cur]] = std::move(cont[cur]);
340
+ offsets[cur] = size;
341
+ }
342
+ };
343
+
344
+ for (size_type index = 0; index < size; index++) {
345
+ // already moved
346
+ if (offsets[index] == size) {
347
+ continue;
348
+ }
349
+ size_type next = offsets[index];
350
+ if (next == index) {
351
+ continue;
352
+ }
353
+ // Subtlety: operator[] returns a Container::reference. Because
354
+ // Container::reference can be a proxy, using bare `auto` is not
355
+ // sufficient to remove the "reference nature" of
356
+ // Container::reference and force a move out of the container;
357
+ // instead, we need Container::value_type.
358
+ typename Container::value_type tmp = std::move(cont[index]);
359
+ rotate(next, index);
360
+ cont[next] = std::move(tmp);
361
+ }
362
+ }
363
+
364
+ // Below helper functions to implement inplace insertion/deletion.
365
+
366
+ // Returns the sequence of offsets that need to be moved. This sequence
367
+ // is the range between size-1 and the offset of the inserted element.
368
+ // There are two cases: {size - 1, ..., offset} or {offset, ..., size - 1}
369
+ // For example if 45 is inserted at offset == 0 and size == 9.
370
+ // Before insertion:
371
+ // element 0 10 20 30 40 50 60 70
372
+ // offset 7 3 1 4 0 5 2 6
373
+ // After inserting 45:
374
+ // element 0 10 20 30 40 45 50 60 70
375
+ // offset 7 3 8 1 4 0 5 2 6
376
+ // This function returns:
377
+ // offsets = { 8, 1, 4, 0 }
378
+ template <typename size_type, typename Offsets>
379
+ bool getOffsetRange(
380
+ size_type size, Offsets& offsets, size_type offset, size_type current) {
381
+ for (; current <= size; current <<= 1) {
382
+ if (getOffsetRange(size, offsets, offset, 2 * current + 1)) {
383
+ return true;
384
+ }
385
+ if (offsets.empty()) {
386
+ if (offset == current || size == current) {
387
+ // Start recording offsets that need to be moved.
388
+ offsets.push_back(current - 1);
389
+ }
390
+ } else {
391
+ // record offset
392
+ offsets.push_back(current - 1);
393
+ if (offset == current || size == current) {
394
+ // Stop recording offsets
395
+ return true;
396
+ }
397
+ }
398
+ }
399
+ return false;
400
+ }
401
+
402
+ template <typename size_type, typename Offsets>
403
+ void getOffsetRange(size_type size, Offsets& offsets, size_type offset) {
404
+ auto start = getStartOffsetToScan(offset, size);
405
+ getOffsetRange(size, offsets, offset, start);
406
+ }
407
+
408
+ // Insert a new element in heap order
409
+ // Assumption: the inserted element is already pushed at the back of the
410
+ // container vector (i.e. located at vector[size - 1]).
411
+ template <typename size_type, class Container>
412
+ size_type insert(size_type offset, Container& cont) {
413
+ size_type size = cont.size();
414
+ if (size == 1) {
415
+ return 0;
416
+ }
417
+ size_type adjust = 1;
418
+ if (offset == size - 1) {
419
+ adjust = 0;
420
+ auto last = lastOffset(size);
421
+ if (last == offset) {
422
+ return offset;
423
+ }
424
+ offset = last;
425
+ }
426
+ std::vector<size_type> offsets;
427
+ offsets.reserve(size);
428
+ getOffsetRange(size, offsets, offset + 1);
429
+ typename Container::value_type v = std::move(cont[size - 1]);
430
+ if (offsets[0] != offset) {
431
+ for (size_type i = 1, e = offsets.size(); i < e; ++i) {
432
+ cont[offsets[i - 1]] = std::move(cont[offsets[i]]);
433
+ }
434
+ cont[offset] = std::move(v);
435
+ return offset;
436
+ }
437
+ for (size_type i = offsets.size() - 1; i > adjust; --i) {
438
+ cont[offsets[i]] = std::move(cont[offsets[i - 1]]);
439
+ }
440
+ cont[offsets[adjust]] = std::move(v);
441
+ return offsets[adjust];
442
+ }
443
+
444
+ // Erase one element and preserve heap order
445
+ template <typename size_type, class Container>
446
+ size_type erase(size_type offset, Container& cont) {
447
+ size_type size = cont.size();
448
+ if (offset + 1 == size) {
449
+ auto ret = next(offset + 1, size);
450
+ cont.resize(size - 1);
451
+ return ret ? ret - 1 : size - 1;
452
+ }
453
+ std::vector<size_type> offsets;
454
+ offsets.reserve(size);
455
+ getOffsetRange(size, offsets, offset + 1);
456
+ if (offsets[0] == offset) {
457
+ for (size_type i = 1, e = offsets.size(); i < e; i++) {
458
+ cont[offsets[i - 1]] = std::move(cont[offsets[i]]);
459
+ }
460
+ } else {
461
+ for (size_type i = offsets.size() - 1; i > 0; --i) {
462
+ cont[offsets[i]] = std::move(cont[offsets[i - 1]]);
463
+ }
464
+ }
465
+ cont.resize(size - 1);
466
+ return offset;
467
+ }
468
+
469
+ // Search lower bound in a container sorted in heap order.
470
+ // To speed up lower_bound for small containers, peel four iterations and use
471
+ // reverse compare to exit quickly.
472
+ // The branch inside the loop is converted to a cmov by the compiler. cmov are
473
+ // more efficient when the branch is unpredictable.
474
+ template <typename Compare, typename RCompare, typename Container>
475
+ typename Container::size_type lower_bound(
476
+ Container& cont, Compare cmp, RCompare reverseCmp) {
477
+ using size_type = typename Container::size_type;
478
+ size_type size = cont.size();
479
+ auto last = size;
480
+ size_type offset = 0;
481
+ if (size) {
482
+ if (cmp(cont[offset])) {
483
+ offset = 2 * offset + 2;
484
+ } else {
485
+ if (!reverseCmp(cont[offset])) {
486
+ return offset;
487
+ }
488
+ last = offset;
489
+ offset = 2 * offset + 1;
490
+ }
491
+ if (offset < size) {
492
+ if (cmp(cont[offset])) {
493
+ offset = 2 * offset + 2;
494
+ } else {
495
+ if (!reverseCmp(cont[offset])) {
496
+ return offset;
497
+ }
498
+ last = offset;
499
+ offset = 2 * offset + 1;
500
+ }
501
+ if (offset < size) {
502
+ if (cmp(cont[offset])) {
503
+ offset = 2 * offset + 2;
504
+ } else {
505
+ if (!reverseCmp(cont[offset])) {
506
+ return offset;
507
+ }
508
+ last = offset;
509
+ offset = 2 * offset + 1;
510
+ }
511
+ if (offset < size) {
512
+ if (cmp(cont[offset])) {
513
+ offset = 2 * offset + 2;
514
+ } else {
515
+ if (!reverseCmp(cont[offset])) {
516
+ return offset;
517
+ }
518
+ last = offset;
519
+ offset = 2 * offset + 1;
520
+ }
521
+ for (; offset < size; offset++) {
522
+ if (cmp(cont[offset])) {
523
+ offset = 2 * offset + 1;
524
+ } else {
525
+ last = offset;
526
+ offset = 2 * offset;
527
+ }
528
+ }
529
+ }
530
+ }
531
+ }
532
+ }
533
+ return last;
534
+ }
535
+
536
+ template <typename Compare, typename Container>
537
+ typename Container::size_type upper_bound(Container& cont, Compare cmp) {
538
+ using size_type = typename Container::size_type;
539
+ auto size = cont.size();
540
+ auto last = size;
541
+ for (size_type offset = 0; offset < size; offset++) {
542
+ if (!cmp(cont[offset])) {
543
+ offset = 2 * offset + 1;
544
+ } else {
545
+ last = offset;
546
+ offset = 2 * offset;
547
+ }
548
+ }
549
+ return last;
550
+ }
551
+
552
+ // Helper functions below are similar to sorted containers. Wherever
553
+ // applicable renamed to heap containers.
554
+ template <typename, typename Compare, typename Key, typename T>
555
+ struct heap_vector_enable_if_is_transparent {};
556
+
557
+ template <typename Compare, typename Key, typename T>
558
+ struct heap_vector_enable_if_is_transparent<
559
+ void_t<typename Compare::is_transparent>,
560
+ Compare,
561
+ Key,
562
+ T> {
563
+ using type = T;
564
+ };
565
+
566
+ // This wrapper goes around a GrowthPolicy and provides iterator
567
+ // preservation semantics, but only if the growth policy is not the
568
+ // default (i.e. nothing).
569
+ template <class Policy>
570
+ struct growth_policy_wrapper : private Policy {
571
+ template <class Container, class Iterator>
572
+ Iterator increase_capacity(Container& c, Iterator desired_insertion) {
573
+ using diff_t = typename Container::difference_type;
574
+ diff_t d = desired_insertion - c.begin();
575
+ Policy::increase_capacity(c);
576
+ return c.begin() + d;
577
+ }
578
+ };
579
+ template <>
580
+ struct growth_policy_wrapper<void> {
581
+ template <class Container, class Iterator>
582
+ Iterator increase_capacity(Container&, Iterator it) {
583
+ return it;
584
+ }
585
+ };
586
+
587
+ template <class OurContainer, class Container, class InputIterator>
588
+ void bulk_insert(
589
+ OurContainer& sorted,
590
+ Container& cont,
591
+ InputIterator first,
592
+ InputIterator last) {
593
+ assert(first != last);
594
+
595
+ auto const prev_size = cont.size();
596
+ cont.insert(cont.end(), first, last);
597
+ auto const middle = cont.begin() + prev_size;
598
+
599
+ auto const& cmp(sorted.value_comp());
600
+ if (!std::is_sorted(middle, cont.end(), cmp)) {
601
+ std::sort(middle, cont.end(), cmp);
602
+ }
603
+ if (middle != cont.begin() && !cmp(*(middle - 1), *middle)) {
604
+ std::inplace_merge(cont.begin(), middle, cont.end(), cmp);
605
+ }
606
+ cont.erase(
607
+ std::unique(
608
+ cont.begin(),
609
+ cont.end(),
610
+ [&](typename OurContainer::value_type const& a,
611
+ typename OurContainer::value_type const& b) {
612
+ return !cmp(a, b) && !cmp(b, a);
613
+ }),
614
+ cont.end());
615
+ heapify(cont);
616
+ }
617
+
618
+ template <typename Container, typename Compare>
619
+ bool is_sorted_unique(Container const& container, Compare const& comp) {
620
+ if (container.empty()) {
621
+ return true;
622
+ }
623
+ auto const e = container.end();
624
+ for (auto a = container.begin(), b = std::next(a); b != e; ++a, ++b) {
625
+ if (!comp(*a, *b)) {
626
+ return false;
627
+ }
628
+ }
629
+ return true;
630
+ }
631
+
632
+ template <typename Container, typename Compare>
633
+ Container&& as_sorted_unique(Container&& container, Compare const& comp) {
634
+ std::sort(container.begin(), container.end(), comp);
635
+ container.erase(
636
+ std::unique(
637
+ container.begin(),
638
+ container.end(),
639
+ [&](auto const& a, auto const& b) {
640
+ return !comp(a, b) && !comp(b, a);
641
+ }),
642
+ container.end());
643
+ return static_cast<Container&&>(container);
644
+ }
645
+
646
+ // class value_compare_map is used to compare map elements.
647
+ template <class Compare>
648
+ struct value_compare_map : Compare {
649
+ template <typename... value_type>
650
+ auto operator()(const value_type&... a) const
651
+ noexcept(is_nothrow_invocable_v<const Compare&, decltype((a.first))...>)
652
+ -> invoke_result_t<const Compare&, decltype((a.first))...> {
653
+ return Compare::operator()(a.first...);
654
+ }
655
+
656
+ template <typename value_type>
657
+ const auto& getKey(const value_type& a) const noexcept {
658
+ return a.first;
659
+ }
660
+
661
+ explicit value_compare_map(const Compare& c) noexcept(
662
+ std::is_nothrow_copy_constructible<Compare>::value)
663
+ : Compare(c) {}
664
+ };
665
+
666
+ // wrapper class value_compare_set for set elements.
667
+ template <class Compare>
668
+ struct value_compare_set : Compare {
669
+ using Compare::operator();
670
+
671
+ template <typename value_type>
672
+ value_type& getKey(value_type& a) const noexcept {
673
+ return a;
674
+ }
675
+
676
+ explicit value_compare_set(const Compare& c) noexcept(
677
+ std::is_nothrow_copy_constructible<Compare>::value)
678
+ : Compare(c) {}
679
+ };
680
+
681
+ /**
682
+ * A heap_vector_container is a container similar to std::set<>, but
683
+ * implemented as a heap array with std::vector<>.
684
+ * This class contains shared implementation between set and map. It
685
+ * fully implements set methods and used as base class for map.
686
+ *
687
+ * @tparam T Data type to store
688
+ * @tparam Compare Comparison function that imposes a
689
+ * strict weak ordering over instances of T
690
+ * @tparam Allocator allocation policy
691
+ * @tparam GrowthPolicy policy object to control growth
692
+ * @tparam Container underlying vector where elements are stored
693
+ * @tparam KeyT key type, for set it is same as T.
694
+ * @tparam ValueCompare wrapper class to compare Container::value_type
695
+ *
696
+ */
697
+ template <
698
+ class T,
699
+ class Compare = std::less<T>,
700
+ class Allocator = std::allocator<T>,
701
+ class GrowthPolicy = void,
702
+ class Container = std::vector<T, Allocator>,
703
+ class KeyT = T,
704
+ class ValueCompare = value_compare_set<Compare>>
705
+ class heap_vector_container : growth_policy_wrapper<GrowthPolicy> {
706
+ protected:
707
+ growth_policy_wrapper<GrowthPolicy>& get_growth_policy() { return *this; }
708
+
709
+ template <typename K, typename V, typename C = Compare>
710
+ using if_is_transparent =
711
+ _t<heap_vector_enable_if_is_transparent<void, C, K, V>>;
712
+
713
+ struct EBO;
714
+
715
+ public:
716
+ using key_type = KeyT;
717
+ using value_type = T;
718
+ using key_compare = Compare;
719
+ using value_compare = ValueCompare;
720
+ using allocator_type = Allocator;
721
+ using container_type = Container;
722
+ using pointer = typename Container::pointer;
723
+ using reference = typename Container::reference;
724
+ using const_reference = typename Container::const_reference;
725
+ using difference_type = typename Container::difference_type;
726
+ using size_type = typename Container::size_type;
727
+
728
+ // Defines inorder iterator for heap set.
729
+ template <typename Iter>
730
+ struct heap_iterator {
731
+ using iterator_category = std::random_access_iterator_tag;
732
+ using size_type = typename Container::size_type;
733
+ using difference_type =
734
+ typename std::iterator_traits<Iter>::difference_type;
735
+ using value_type = typename std::iterator_traits<Iter>::value_type;
736
+ using pointer = typename std::iterator_traits<Iter>::pointer;
737
+ using reference = typename std::iterator_traits<Iter>::reference;
738
+
739
+ heap_iterator() = default;
740
+ template <typename C>
741
+ heap_iterator(Iter ptr, C* cont) {
742
+ ptr_ = ptr;
743
+ cont_ = const_cast<Container*>(cont);
744
+ }
745
+
746
+ template <
747
+ typename I2,
748
+ typename = typename std::enable_if<
749
+ std::is_same<typename Container::iterator, I2>::value>::type>
750
+ /* implicit */ heap_iterator(const heap_iterator<I2>& rawIterator)
751
+ : ptr_(rawIterator.ptr_), cont_(rawIterator.cont_) {}
752
+
753
+ ~heap_iterator() = default;
754
+
755
+ heap_iterator(const heap_iterator& rawIterator) = default;
756
+
757
+ heap_iterator& operator=(const heap_iterator& rawIterator) = default;
758
+ heap_iterator& operator=(Iter ptr) {
759
+ assert(
760
+ (ptr - cont_->begin()) >= 0 &&
761
+ (ptr - cont_->begin()) <= (difference_type)cont_->size());
762
+ ptr_ = ptr;
763
+ return (*this);
764
+ }
765
+
766
+ bool operator==(const heap_iterator& rawIterator) const {
767
+ return ptr_ == rawIterator.ptr_;
768
+ }
769
+ bool operator!=(const heap_iterator& rawIterator) const {
770
+ return !operator==(rawIterator);
771
+ }
772
+
773
+ heap_iterator& operator+=(const difference_type& movement) {
774
+ size_type offset = ptr_ - cont_->begin() + 1;
775
+ auto size = cont_->size();
776
+ if (movement < 0) {
777
+ difference_type i = 0;
778
+
779
+ if (offset - 1 == size) {
780
+ // handle --end()
781
+ offset = heap_vector_detail::lastOffset(size) + 1;
782
+ i = -1;
783
+ }
784
+ for (; i > movement; i--) {
785
+ offset = heap_vector_detail::prev(offset, size);
786
+ }
787
+ } else {
788
+ for (difference_type i = 0; i < movement; i++) {
789
+ offset = heap_vector_detail::next(offset, size);
790
+ }
791
+ }
792
+ ptr_ = cont_->begin() + (offset == 0 ? cont_->size() : offset - 1);
793
+ return (*this);
794
+ }
795
+
796
+ heap_iterator& operator-=(const difference_type& movement) {
797
+ return operator+=(-movement);
798
+ }
799
+ heap_iterator& operator++() { return operator+=(1); }
800
+ heap_iterator& operator--() { return operator-=(1); }
801
+ heap_iterator operator++(int) {
802
+ auto temp(*this);
803
+ operator+=(1);
804
+ return temp;
805
+ }
806
+ heap_iterator operator--(int) {
807
+ auto temp(*this);
808
+ operator-=(1);
809
+ return temp;
810
+ }
811
+ heap_iterator operator+(const difference_type& movement) {
812
+ auto temp(*this);
813
+ temp += movement;
814
+ return temp;
815
+ }
816
+ heap_iterator operator+(const difference_type& movement) const {
817
+ auto temp(*this);
818
+ temp += movement;
819
+ return temp;
820
+ }
821
+
822
+ heap_iterator operator-(const difference_type& movement) {
823
+ auto temp(*this);
824
+ temp -= movement;
825
+ return temp;
826
+ }
827
+
828
+ heap_iterator operator-(const difference_type& movement) const {
829
+ auto temp(*this);
830
+ temp -= movement;
831
+ return temp;
832
+ }
833
+
834
+ difference_type operator-(const heap_iterator& rawIterator) {
835
+ assert(cont_ == rawIterator.cont_);
836
+ size_type offset0 = ptr_ - cont_->begin();
837
+ size_type offset1 = rawIterator.ptr_ - cont_->begin();
838
+ if (offset1 == offset0)
839
+ return 0;
840
+ return heap_vector_detail::distance(*cont_, offset1, offset0);
841
+ }
842
+
843
+ difference_type operator-(const heap_iterator& rawIterator) const {
844
+ assert(cont_ == rawIterator.cont_);
845
+ size_type offset0 = ptr_ - cont_->begin();
846
+ size_type offset1 = rawIterator.ptr_ - cont_->begin();
847
+ if (offset1 == offset0)
848
+ return 0;
849
+ return heap_vector_detail::distance(*cont_, offset1, offset0);
850
+ }
851
+
852
+ reference operator*() const { return *ptr_; }
853
+ pointer operator->() const {
854
+ if constexpr (std::is_pointer_v<Iter>) {
855
+ return ptr_;
856
+ } else {
857
+ return ptr_.operator->();
858
+ }
859
+ }
860
+
861
+ protected:
862
+ template <typename I2>
863
+ friend struct heap_iterator;
864
+
865
+ template <
866
+ typename T2,
867
+ typename Compare2,
868
+ typename Allocator2,
869
+ typename GrowthPolicy2,
870
+ typename Container2,
871
+ typename KeyT2,
872
+ typename ValueCompare2>
873
+ friend class heap_vector_container;
874
+
875
+ template <
876
+ typename Key2,
877
+ typename Value2,
878
+ typename Compare2,
879
+ typename Allocator2,
880
+ typename GrowthPolicy2,
881
+ typename Container2>
882
+ friend class ::folly::heap_vector_map;
883
+
884
+ Iter ptr_;
885
+ Container* cont_;
886
+ };
887
+
888
+ using iterator = heap_iterator<typename Container::iterator>;
889
+ using const_iterator = heap_iterator<typename Container::const_iterator>;
890
+ using reverse_iterator = std::reverse_iterator<iterator>;
891
+ using const_reverse_iterator = std::reverse_iterator<const_iterator>;
892
+
893
+ heap_vector_container() : m_(value_compare(Compare()), Allocator()) {}
894
+
895
+ heap_vector_container(const heap_vector_container&) = default;
896
+
897
+ heap_vector_container(
898
+ const heap_vector_container& other, const Allocator& alloc)
899
+ : m_(other.m_, alloc) {}
900
+
901
+ heap_vector_container(heap_vector_container&&) = default;
902
+
903
+ heap_vector_container(
904
+ heap_vector_container&& other,
905
+ const Allocator& alloc) noexcept(std::
906
+ is_nothrow_constructible<
907
+ EBO,
908
+ EBO&&,
909
+ const Allocator&>::value)
910
+ : m_(std::move(other.m_), alloc) {}
911
+
912
+ explicit heap_vector_container(const Allocator& alloc)
913
+ : m_(value_compare(Compare()), alloc) {}
914
+
915
+ explicit heap_vector_container(
916
+ const Compare& comp, const Allocator& alloc = Allocator())
917
+ : m_(value_compare(comp), alloc) {}
918
+
919
+ template <class InputIterator>
920
+ explicit heap_vector_container(
921
+ InputIterator first,
922
+ InputIterator last,
923
+ const Compare& comp = Compare(),
924
+ const Allocator& alloc = Allocator())
925
+ : m_(value_compare(comp), alloc) {
926
+ insert(first, last);
927
+ }
928
+
929
+ template <class InputIterator>
930
+ heap_vector_container(
931
+ InputIterator first, InputIterator last, const Allocator& alloc)
932
+ : m_(value_compare(Compare()), alloc) {
933
+ insert(first, last);
934
+ }
935
+
936
+ /* implicit */ heap_vector_container(
937
+ std::initializer_list<value_type> list,
938
+ const Compare& comp = Compare(),
939
+ const Allocator& alloc = Allocator())
940
+ : m_(value_compare(comp), alloc) {
941
+ insert(list.begin(), list.end());
942
+ }
943
+
944
+ heap_vector_container(
945
+ std::initializer_list<value_type> list, const Allocator& alloc)
946
+ : m_(value_compare(Compare()), alloc) {
947
+ insert(list.begin(), list.end());
948
+ }
949
+
950
+ // Construct a heap_vector_container by stealing the storage of a prefilled
951
+ // container. The container need not be sorted already. This supports
952
+ // bulk construction of heap_vector_container with zero allocations, not
953
+ // counting those performed by the caller.
954
+ // Note that `heap_vector_container(const Container& container)` is not
955
+ // provided, since the purpose of this constructor is to avoid an unnecessary
956
+ // copy.
957
+ explicit heap_vector_container(
958
+ Container&& container,
959
+ const Compare& comp = Compare()) noexcept(std::
960
+ is_nothrow_constructible<
961
+ EBO,
962
+ value_compare,
963
+ Container&&>::value)
964
+ : heap_vector_container(
965
+ sorted_unique,
966
+ heap_vector_detail::as_sorted_unique(
967
+ std::move(container), value_compare(comp)),
968
+ comp) {}
969
+
970
+ // Construct a heap_vector_container by stealing the storage of a prefilled
971
+ // container. Its elements must be sorted and unique, as sorted_unique_t
972
+ // hints. Supports bulk construction of heap_vector_container with zero
973
+ // allocations, not counting those performed by the caller.
974
+ // Note that `heap_vector_container(sorted_unique_t, const Container&
975
+ // container)` is not provided, since the purpose of this constructor is to
976
+ // avoid an extra copy.
977
+ heap_vector_container(
978
+ sorted_unique_t /* unused */,
979
+ Container&& container,
980
+ const Compare& comp = Compare()) noexcept(std::
981
+ is_nothrow_constructible<
982
+ EBO,
983
+ value_compare,
984
+ Container&&>::value)
985
+ : m_(value_compare(comp), std::move(container)) {
986
+ assert(heap_vector_detail::is_sorted_unique(m_.cont_, value_comp()));
987
+ heap_vector_detail::heapify(m_.cont_);
988
+ }
989
+
990
+ Allocator get_allocator() const { return m_.cont_.get_allocator(); }
991
+
992
+ const Container& get_container() const noexcept { return m_.cont_; }
993
+
994
+ heap_vector_container& operator=(const heap_vector_container& other) =
995
+ default;
996
+
997
+ heap_vector_container& operator=(heap_vector_container&& other) = default;
998
+
999
+ heap_vector_container& operator=(std::initializer_list<value_type> ilist) {
1000
+ clear();
1001
+ insert(ilist.begin(), ilist.end());
1002
+ return *this;
1003
+ }
1004
+
1005
+ key_compare key_comp() const { return m_; }
1006
+ value_compare value_comp() const { return m_; }
1007
+
1008
+ iterator begin() {
1009
+ if (size()) {
1010
+ return iterator(
1011
+ m_.cont_.begin() + heap_vector_detail::firstOffset(size()),
1012
+ &m_.cont_);
1013
+ }
1014
+ return iterator(m_.cont_.begin(), &m_.cont_);
1015
+ }
1016
+ iterator end() { return iterator(m_.cont_.end(), &m_.cont_); }
1017
+ const_iterator cbegin() const {
1018
+ if (size()) {
1019
+ return const_iterator(
1020
+ m_.cont_.cbegin() + heap_vector_detail::firstOffset(size()),
1021
+ &m_.cont_);
1022
+ }
1023
+ return const_iterator(m_.cont_.cbegin(), &m_.cont_);
1024
+ }
1025
+ const_iterator begin() const {
1026
+ if (size()) {
1027
+ return const_iterator(
1028
+ m_.cont_.cbegin() + heap_vector_detail::firstOffset(size()),
1029
+ &m_.cont_);
1030
+ }
1031
+ return const_iterator(m_.cont_.begin(), &m_.cont_);
1032
+ }
1033
+ const_iterator cend() const {
1034
+ return const_iterator(m_.cont_.cend(), &m_.cont_);
1035
+ }
1036
+ const_iterator end() const {
1037
+ return const_iterator(m_.cont_.end(), &m_.cont_);
1038
+ }
1039
+ reverse_iterator rbegin() { return reverse_iterator(end()); }
1040
+ reverse_iterator rend() { return reverse_iterator(begin()); }
1041
+ const_reverse_iterator rbegin() const {
1042
+ return const_reverse_iterator(end());
1043
+ }
1044
+ const_reverse_iterator rend() const {
1045
+ return const_reverse_iterator(begin());
1046
+ }
1047
+ const_reverse_iterator crbegin() const {
1048
+ return const_reverse_iterator(end());
1049
+ }
1050
+ const_reverse_iterator crend() const {
1051
+ return const_reverse_iterator(begin());
1052
+ }
1053
+
1054
+ void clear() { return m_.cont_.clear(); }
1055
+ size_type size() const { return m_.cont_.size(); }
1056
+ size_type max_size() const { return m_.cont_.max_size(); }
1057
+ bool empty() const { return m_.cont_.empty(); }
1058
+ void reserve(size_type s) { return m_.cont_.reserve(s); }
1059
+ void shrink_to_fit() { m_.cont_.shrink_to_fit(); }
1060
+ size_type capacity() const { return m_.cont_.capacity(); }
1061
+ const value_type* data() const noexcept { return m_.cont_.data(); }
1062
+
1063
+ std::pair<iterator, bool> insert(const value_type& value) {
1064
+ iterator it = lower_bound(m_.getKey(value));
1065
+ if (it == end() || value_comp()(value, *it)) {
1066
+ auto offset = it.ptr_ - m_.cont_.begin();
1067
+ get_growth_policy().increase_capacity(*this, it);
1068
+ m_.cont_.push_back(value);
1069
+ offset = heap_vector_detail::insert(offset, m_.cont_);
1070
+ it = m_.cont_.begin() + offset;
1071
+ return std::make_pair(it, true);
1072
+ }
1073
+ return std::make_pair(it, false);
1074
+ }
1075
+
1076
+ std::pair<iterator, bool> insert(value_type&& value) {
1077
+ iterator it = lower_bound(m_.getKey(value));
1078
+ if (it == end() || value_comp()(value, *it)) {
1079
+ auto offset = it.ptr_ - m_.cont_.begin();
1080
+ get_growth_policy().increase_capacity(*this, it);
1081
+ m_.cont_.push_back(std::move(value));
1082
+ offset = heap_vector_detail::insert(offset, m_.cont_);
1083
+ it = m_.cont_.begin() + offset;
1084
+ return std::make_pair(it, true);
1085
+ }
1086
+ return std::make_pair(it, false);
1087
+ }
1088
+ /* There is no benefit of using hint. Keep it for compatibility
1089
+ * Ignore and insert */
1090
+ iterator insert(const_iterator /* hint */, const value_type& value) {
1091
+ return insert(value).first;
1092
+ }
1093
+
1094
+ iterator insert(const_iterator /* hint */, value_type&& value) {
1095
+ return insert(std::move(value)).first;
1096
+ }
1097
+
1098
+ template <class InputIterator>
1099
+ void insert(InputIterator first, InputIterator last) {
1100
+ if (first == last) {
1101
+ return;
1102
+ }
1103
+ if (iterator_has_known_distance_v<InputIterator, InputIterator> &&
1104
+ std::distance(first, last) == 1) {
1105
+ insert(*first);
1106
+ return;
1107
+ }
1108
+ std::sort(m_.cont_.begin(), m_.cont_.end(), value_comp());
1109
+ heap_vector_detail::bulk_insert(*this, m_.cont_, first, last);
1110
+ }
1111
+
1112
+ void insert(std::initializer_list<value_type> ilist) {
1113
+ insert(ilist.begin(), ilist.end());
1114
+ }
1115
+ // emplace isn't better than insert for heap_vector_container, but aids
1116
+ // compatibility
1117
+ template <typename... Args>
1118
+ std::pair<iterator, bool> emplace(Args&&... args) {
1119
+ folly::aligned_storage_for_t<value_type> b;
1120
+ auto* p = static_cast<value_type*>(static_cast<void*>(&b));
1121
+ auto a = get_allocator();
1122
+ std::allocator_traits<allocator_type>::construct(
1123
+ a, p, std::forward<Args>(args)...);
1124
+ auto g = makeGuard(
1125
+ [&]() { std::allocator_traits<allocator_type>::destroy(a, p); });
1126
+ return insert(std::move(*p));
1127
+ }
1128
+
1129
+ std::pair<iterator, bool> emplace(const value_type& value) {
1130
+ return insert(value);
1131
+ }
1132
+
1133
+ std::pair<iterator, bool> emplace(value_type&& value) {
1134
+ return insert(std::move(value));
1135
+ }
1136
+
1137
+ // emplace_hint isn't better than insert for heap_vector_container, but aids
1138
+ // compatibility
1139
+ template <typename... Args>
1140
+ iterator emplace_hint(const_iterator /* hint */, Args&&... args) {
1141
+ return emplace(std::forward<Args>(args)...).first;
1142
+ }
1143
+
1144
+ iterator emplace_hint(const_iterator hint, const value_type& value) {
1145
+ return insert(hint, value);
1146
+ }
1147
+
1148
+ iterator emplace_hint(const_iterator hint, value_type&& value) {
1149
+ return insert(hint, std::move(value));
1150
+ }
1151
+
1152
+ size_type erase(const key_type& key) {
1153
+ iterator it = find(key);
1154
+ if (it == end()) {
1155
+ return 0;
1156
+ }
1157
+ heap_vector_detail::erase(it.ptr_ - m_.cont_.begin(), m_.cont_);
1158
+ return 1;
1159
+ }
1160
+
1161
+ iterator erase(const_iterator it) {
1162
+ auto offset =
1163
+ heap_vector_detail::erase(it.ptr_ - m_.cont_.begin(), m_.cont_);
1164
+ iterator ret = end();
1165
+ ret = m_.cont_.begin() + offset;
1166
+ return ret;
1167
+ }
1168
+
1169
+ iterator erase(const_iterator first, const_iterator last) {
1170
+ if (first == last) {
1171
+ return end();
1172
+ }
1173
+ auto dist = last - first;
1174
+ if (dist <= 0) {
1175
+ return end();
1176
+ }
1177
+ if (dist == 1) {
1178
+ return erase(first);
1179
+ }
1180
+ auto it = m_.cont_.begin() + (first - begin());
1181
+ std::sort(m_.cont_.begin(), m_.cont_.end(), value_comp());
1182
+ it = m_.cont_.erase(it, it + dist);
1183
+ heap_vector_detail::heapify(m_.cont_);
1184
+ return begin() + (it - m_.cont_.begin());
1185
+ }
1186
+
1187
+ iterator find(const key_type& key) { return find_(*this, key); }
1188
+
1189
+ const_iterator find(const key_type& key) const { return find_(*this, key); }
1190
+
1191
+ template <typename K>
1192
+ if_is_transparent<K, iterator> find(const K& key) {
1193
+ return find_(*this, key);
1194
+ }
1195
+
1196
+ template <typename K>
1197
+ if_is_transparent<K, const_iterator> find(const K& key) const {
1198
+ return find_(*this, key);
1199
+ }
1200
+
1201
+ size_type count(const key_type& key) const {
1202
+ return find(key) == end() ? 0 : 1;
1203
+ }
1204
+
1205
+ template <typename K>
1206
+ if_is_transparent<K, size_type> count(const K& key) const {
1207
+ return find(key) == end() ? 0 : 1;
1208
+ }
1209
+
1210
+ bool contains(const key_type& key) const { return find(key) != end(); }
1211
+
1212
+ template <typename K>
1213
+ if_is_transparent<K, bool> contains(const K& key) const {
1214
+ return find(key) != end();
1215
+ }
1216
+
1217
+ iterator lower_bound(const key_type& key) { return lower_bound(*this, key); }
1218
+
1219
+ const_iterator lower_bound(const key_type& key) const {
1220
+ return lower_bound(*this, key);
1221
+ }
1222
+
1223
+ template <typename K>
1224
+ if_is_transparent<K, iterator> lower_bound(const K& key) {
1225
+ return lower_bound(*this, key);
1226
+ }
1227
+
1228
+ template <typename K>
1229
+ if_is_transparent<K, const_iterator> lower_bound(const K& key) const {
1230
+ return lower_bound(*this, key);
1231
+ }
1232
+
1233
+ iterator upper_bound(const key_type& key) { return upper_bound(*this, key); }
1234
+
1235
+ const_iterator upper_bound(const key_type& key) const {
1236
+ return upper_bound(*this, key);
1237
+ }
1238
+
1239
+ template <typename K>
1240
+ if_is_transparent<K, iterator> upper_bound(const K& key) {
1241
+ return upper_bound(*this, key);
1242
+ }
1243
+
1244
+ template <typename K>
1245
+ if_is_transparent<K, const_iterator> upper_bound(const K& key) const {
1246
+ return upper_bound(*this, key);
1247
+ }
1248
+
1249
+ std::pair<iterator, iterator> equal_range(const key_type& key) {
1250
+ return {lower_bound(key), upper_bound(key)};
1251
+ }
1252
+
1253
+ std::pair<const_iterator, const_iterator> equal_range(
1254
+ const key_type& key) const {
1255
+ return {lower_bound(key), upper_bound(key)};
1256
+ }
1257
+
1258
+ template <typename K>
1259
+ if_is_transparent<K, std::pair<iterator, iterator>> equal_range(
1260
+ const K& key) {
1261
+ return {lower_bound(key), upper_bound(key)};
1262
+ }
1263
+
1264
+ template <typename K>
1265
+ if_is_transparent<K, std::pair<const_iterator, const_iterator>> equal_range(
1266
+ const K& key) const {
1267
+ return {lower_bound(key), upper_bound(key)};
1268
+ }
1269
+
1270
+ void swap(heap_vector_container& o) noexcept(
1271
+ std::is_nothrow_swappable<Compare>::value &&
1272
+ noexcept(std::declval<Container&>().swap(std::declval<Container&>()))) {
1273
+ using std::swap; // Allow ADL for swap(); fall back to std::swap().
1274
+ Compare& a = m_;
1275
+ Compare& b = o.m_;
1276
+ swap(a, b);
1277
+ m_.cont_.swap(o.m_.cont_);
1278
+ }
1279
+
1280
+ bool operator==(const heap_vector_container& other) const {
1281
+ return m_.cont_ == other.m_.cont_;
1282
+ }
1283
+
1284
+ bool operator!=(const heap_vector_container& other) const {
1285
+ return !operator==(other);
1286
+ }
1287
+
1288
+ bool operator<(const heap_vector_container& other) const {
1289
+ return std::lexicographical_compare(
1290
+ begin(), end(), other.begin(), other.end(), value_comp());
1291
+ }
1292
+ bool operator>(const heap_vector_container& other) const {
1293
+ return other < *this;
1294
+ }
1295
+ bool operator<=(const heap_vector_container& other) const {
1296
+ return !operator>(other);
1297
+ }
1298
+ bool operator>=(const heap_vector_container& other) const {
1299
+ return !operator<(other);
1300
+ }
1301
+
1302
+ // Use underlying vector iterators to quickly traverse heap container.
1303
+ // Note elements are traversed following the heap order, i.e., memory
1304
+ // storage order.
1305
+ Range<typename Container::iterator> iterate() noexcept {
1306
+ return Range<typename Container::iterator>(
1307
+ m_.cont_.begin(), m_.cont_.end());
1308
+ }
1309
+
1310
+ const Range<typename Container::const_iterator> iterate() const noexcept {
1311
+ return Range<typename Container::const_iterator>(
1312
+ m_.cont_.begin(), m_.cont_.end());
1313
+ }
1314
+
1315
+ protected:
1316
+ // This is to get the empty base optimization
1317
+ struct EBO : value_compare {
1318
+ explicit EBO(const value_compare& c, const Allocator& alloc) noexcept(
1319
+ std::is_nothrow_default_constructible<Container>::value)
1320
+ : value_compare(c), cont_(alloc) {}
1321
+ EBO(const EBO& other, const Allocator& alloc) noexcept(
1322
+ std::is_nothrow_constructible<
1323
+ Container,
1324
+ const Container&,
1325
+ const Allocator&>::value)
1326
+ : value_compare(static_cast<const value_compare&>(other)),
1327
+ cont_(other.cont_, alloc) {}
1328
+ EBO(EBO&& other, const Allocator& alloc) noexcept(
1329
+ std::is_nothrow_constructible<
1330
+ Container,
1331
+ Container&&,
1332
+ const Allocator&>::value)
1333
+ : value_compare(static_cast<value_compare&&>(other)),
1334
+ cont_(std::move(other.cont_), alloc) {}
1335
+ EBO(const Compare& c, Container&& cont) noexcept(
1336
+ std::is_nothrow_move_constructible<Container>::value)
1337
+ : value_compare(c), cont_(std::move(cont)) {}
1338
+ Container cont_;
1339
+ } m_;
1340
+
1341
+ template <typename Self>
1342
+ using self_iterator_t = typename std::
1343
+ conditional<std::is_const<Self>::value, const_iterator, iterator>::type;
1344
+
1345
+ template <typename Self, typename K>
1346
+ static self_iterator_t<Self> find_(Self& self, K const& key) {
1347
+ self_iterator_t<Self> end = self.end();
1348
+ self_iterator_t<Self> it = self.lower_bound(key);
1349
+ if (it == end || !self.key_comp()(key, self.m_.getKey(*it))) {
1350
+ return it;
1351
+ }
1352
+ return end;
1353
+ }
1354
+
1355
+ template <typename Self, typename K>
1356
+ static self_iterator_t<Self> lower_bound(Self& self, K const& key) {
1357
+ auto c = self.key_comp();
1358
+ auto cmp = [&](auto const& a) { return c(self.m_.getKey(a), key); };
1359
+ auto reverseCmp = [&](auto const& a) { return c(key, self.m_.getKey(a)); };
1360
+ auto offset =
1361
+ heap_vector_detail::lower_bound(self.m_.cont_, cmp, reverseCmp);
1362
+ self_iterator_t<Self> ret = self.end();
1363
+ ret = self.m_.cont_.begin() + offset;
1364
+ return ret;
1365
+ }
1366
+
1367
+ template <typename Self, typename K>
1368
+ static self_iterator_t<Self> upper_bound(Self& self, K const& key) {
1369
+ auto c = self.key_comp();
1370
+ auto cmp = [&](auto const& a) { return c(key, self.m_.getKey(a)); };
1371
+ auto offset = heap_vector_detail::upper_bound(self.m_.cont_, cmp);
1372
+ self_iterator_t<Self> ret = self.end();
1373
+ ret = self.m_.cont_.begin() + offset;
1374
+ return ret;
1375
+ }
1376
+ };
1377
+
1378
+ } // namespace heap_vector_detail
1379
+
1380
+ } // namespace detail
1381
+
1382
+ /* heap_vector_set is a specialization of heap_vector_container
1383
+ *
1384
+ * @tparam T Data type to store
1385
+ * @tparam Compare Comparison function that imposes a
1386
+ * strict weak ordering over instances of T
1387
+ * @tparam Allocator allocation policy
1388
+ * @tparam GrowthPolicy policy object to control growth
1389
+ * @tparam Container underlying vector where elements are stored
1390
+ */
1391
+ template <
1392
+ class T,
1393
+ class Compare = std::less<T>,
1394
+ class Allocator = std::allocator<T>,
1395
+ class GrowthPolicy = void,
1396
+ class Container = std::vector<T, Allocator>>
1397
+ class heap_vector_set
1398
+ : public detail::heap_vector_detail::heap_vector_container<
1399
+ T,
1400
+ Compare,
1401
+ Allocator,
1402
+ GrowthPolicy,
1403
+ Container,
1404
+ T,
1405
+ detail::heap_vector_detail::value_compare_set<Compare>> {
1406
+ private:
1407
+ using heap_vector_container =
1408
+ detail::heap_vector_detail::heap_vector_container<
1409
+ T,
1410
+ Compare,
1411
+ Allocator,
1412
+ GrowthPolicy,
1413
+ Container,
1414
+ T,
1415
+ detail::heap_vector_detail::value_compare_set<Compare>>;
1416
+
1417
+ public:
1418
+ using heap_vector_container::heap_vector_container;
1419
+ };
1420
+
1421
+ // Swap function that can be found using ADL.
1422
+ template <class T, class C, class A, class G>
1423
+ inline void swap(
1424
+ heap_vector_set<T, C, A, G>& a, heap_vector_set<T, C, A, G>& b) noexcept {
1425
+ return a.swap(b);
1426
+ }
1427
+
1428
+ #if FOLLY_HAS_MEMORY_RESOURCE
1429
+
1430
+ namespace pmr {
1431
+
1432
+ template <
1433
+ class T,
1434
+ class Compare = std::less<T>,
1435
+ class GrowthPolicy = void,
1436
+ class Container =
1437
+ std::vector<T, folly::detail::std_pmr::polymorphic_allocator<T>>>
1438
+ using heap_vector_set = folly::heap_vector_set<
1439
+ T,
1440
+ Compare,
1441
+ folly::detail::std_pmr::polymorphic_allocator<T>,
1442
+ GrowthPolicy,
1443
+ Container>;
1444
+
1445
+ } // namespace pmr
1446
+
1447
+ #endif
1448
+
1449
+ //////////////////////////////////////////////////////////////////////
1450
+
1451
+ /**
1452
+ * A heap_vector_map based on heap layout.
1453
+ *
1454
+ * @tparam Key Key type
1455
+ * @tparam Value Value type
1456
+ * @tparam Compare Function that can compare key types and impose
1457
+ * a strict weak ordering over them.
1458
+ * @tparam Allocator allocation policy
1459
+ * @tparam GrowthPolicy policy object to control growth
1460
+ *
1461
+ */
1462
+
1463
+ template <
1464
+ class Key,
1465
+ class Value,
1466
+ class Compare = std::less<Key>,
1467
+ class Allocator = std::allocator<std::pair<Key, Value>>,
1468
+ class GrowthPolicy = void,
1469
+ class Container = std::vector<std::pair<Key, Value>, Allocator>>
1470
+ class heap_vector_map
1471
+ : public detail::heap_vector_detail::heap_vector_container<
1472
+ typename Container::value_type,
1473
+ Compare,
1474
+ Allocator,
1475
+ GrowthPolicy,
1476
+ Container,
1477
+ Key,
1478
+ detail::heap_vector_detail::value_compare_map<Compare>> {
1479
+ public:
1480
+ using key_type = Key;
1481
+ using mapped_type = Value;
1482
+ using value_type = typename Container::value_type;
1483
+ using key_compare = Compare;
1484
+ using allocator_type = Allocator;
1485
+ using container_type = Container;
1486
+ using pointer = typename Container::pointer;
1487
+ using reference = typename Container::reference;
1488
+ using const_reference = typename Container::const_reference;
1489
+ using difference_type = typename Container::difference_type;
1490
+ using size_type = typename Container::size_type;
1491
+ using value_compare = detail::heap_vector_detail::value_compare_map<Compare>;
1492
+
1493
+ protected:
1494
+ using heap_vector_container =
1495
+ detail::heap_vector_detail::heap_vector_container<
1496
+ value_type,
1497
+ key_compare,
1498
+ Allocator,
1499
+ GrowthPolicy,
1500
+ Container,
1501
+ key_type,
1502
+ value_compare>;
1503
+ using heap_vector_container::get_growth_policy;
1504
+ using heap_vector_container::m_;
1505
+
1506
+ public:
1507
+ using iterator = typename heap_vector_container::iterator;
1508
+ using const_iterator = typename heap_vector_container::const_iterator;
1509
+ using reverse_iterator = std::reverse_iterator<iterator>;
1510
+ using const_reverse_iterator = std::reverse_iterator<const_iterator>;
1511
+
1512
+ // Since heap_vector_container methods are publicly available through
1513
+ // inheritance, just expose method used within this class.
1514
+ using heap_vector_container::end;
1515
+ using heap_vector_container::find;
1516
+ using heap_vector_container::heap_vector_container;
1517
+ using heap_vector_container::key_comp;
1518
+ using heap_vector_container::lower_bound;
1519
+
1520
+ mapped_type& at(const key_type& key) {
1521
+ iterator it = find(key);
1522
+ if (it != end()) {
1523
+ return it->second;
1524
+ }
1525
+ throw_exception<std::out_of_range>("heap_vector_map::at");
1526
+ }
1527
+
1528
+ const mapped_type& at(const key_type& key) const {
1529
+ const_iterator it = find(key);
1530
+ if (it != end()) {
1531
+ return it->second;
1532
+ }
1533
+ throw_exception<std::out_of_range>("heap_vector_map::at");
1534
+ }
1535
+
1536
+ mapped_type& operator[](const key_type& key) {
1537
+ iterator it = lower_bound(key);
1538
+ if (it == end() || key_comp()(key, it->first)) {
1539
+ auto offset = it.ptr_ - m_.cont_.begin();
1540
+ get_growth_policy().increase_capacity(*this, it);
1541
+ m_.cont_.emplace_back(key, mapped_type());
1542
+ offset = detail::heap_vector_detail::insert(offset, m_.cont_);
1543
+ it = m_.cont_.begin() + offset;
1544
+ return it->second;
1545
+ }
1546
+ return it->second;
1547
+ }
1548
+ };
1549
+
1550
+ // Swap function that can be found using ADL.
1551
+ template <class K, class V, class C, class A, class G>
1552
+ inline void swap(
1553
+ heap_vector_map<K, V, C, A, G>& a,
1554
+ heap_vector_map<K, V, C, A, G>& b) noexcept {
1555
+ return a.swap(b);
1556
+ }
1557
+
1558
+ #if FOLLY_HAS_MEMORY_RESOURCE
1559
+
1560
+ namespace pmr {
1561
+
1562
+ template <
1563
+ class Key,
1564
+ class Value,
1565
+ class Compare = std::less<Key>,
1566
+ class GrowthPolicy = void,
1567
+ class Container = std::vector<
1568
+ std::pair<Key, Value>,
1569
+ folly::detail::std_pmr::polymorphic_allocator<std::pair<Key, Value>>>>
1570
+ using heap_vector_map = folly::heap_vector_map<
1571
+ Key,
1572
+ Value,
1573
+ Compare,
1574
+ folly::detail::std_pmr::polymorphic_allocator<std::pair<Key, Value>>,
1575
+ GrowthPolicy,
1576
+ Container>;
1577
+
1578
+ } // namespace pmr
1579
+
1580
+ #endif
1581
+
1582
+ // Specialize heap_vector_map to integral key type and std::less comparaison.
1583
+ // small_heap_map achieve a very fast find for small map < 200 elements.
1584
+ template <
1585
+ typename Key,
1586
+ typename Value,
1587
+ typename SizeType = uint32_t,
1588
+ class Container = folly::small_vector<
1589
+ std::pair<Key, Value>,
1590
+ 0,
1591
+ folly::small_vector_policy::policy_size_type<SizeType>>,
1592
+ typename = std::enable_if_t<
1593
+ std::is_integral<Key>::value || std::is_enum<Key>::value>>
1594
+ class small_heap_vector_map : public folly::heap_vector_map<
1595
+ Key,
1596
+ Value,
1597
+ std::less<Key>,
1598
+ typename Container::allocator_type,
1599
+ void,
1600
+ Container> {
1601
+ public:
1602
+ using key_type = Key;
1603
+ using mapped_type = Value;
1604
+ using value_type = typename Container::value_type;
1605
+ using key_compare = std::less<Key>;
1606
+ using allocator_type = typename Container::allocator_type;
1607
+ using container_type = Container;
1608
+ using pointer = typename Container::pointer;
1609
+ using reference = typename Container::reference;
1610
+ using const_reference = typename Container::const_reference;
1611
+ using difference_type = typename Container::difference_type;
1612
+ using size_type = typename Container::size_type;
1613
+ using value_compare =
1614
+ detail::heap_vector_detail::value_compare_map<std::less<Key>>;
1615
+
1616
+ private:
1617
+ using heap_vector_map = folly::
1618
+ heap_vector_map<Key, Value, key_compare, allocator_type, void, Container>;
1619
+
1620
+ using heap_vector_map::m_;
1621
+
1622
+ public:
1623
+ using iterator = typename heap_vector_map::iterator;
1624
+ using const_iterator = typename heap_vector_map::const_iterator;
1625
+ using reverse_iterator = std::reverse_iterator<iterator>;
1626
+ using const_reverse_iterator = std::reverse_iterator<const_iterator>;
1627
+
1628
+ using heap_vector_map::begin;
1629
+ using heap_vector_map::heap_vector_map;
1630
+ using heap_vector_map::size;
1631
+ iterator find(const key_type key) {
1632
+ auto offset = find_(*this, key);
1633
+ iterator ret = begin();
1634
+ ret = m_.cont_.begin() + offset;
1635
+ return ret;
1636
+ }
1637
+
1638
+ const_iterator find(const key_type key) const {
1639
+ auto offset = find_(*this, key);
1640
+ const_iterator ret = begin();
1641
+ ret = m_.cont_.begin() + offset;
1642
+ return ret;
1643
+ }
1644
+
1645
+ private:
1646
+ template <typename Self, typename K>
1647
+ static inline size_type find_(Self& self, K const key) {
1648
+ auto size = self.size();
1649
+ if (!size) {
1650
+ return 0;
1651
+ }
1652
+ auto& cont = self.m_.cont_;
1653
+ size_type offset = 1;
1654
+ auto cur_k = self.m_.getKey(cont[0]);
1655
+ for (int i = 0; i < 6; i++) {
1656
+ auto o = offset;
1657
+ offset = 2 * offset;
1658
+ if (cur_k <= key) {
1659
+ ++offset;
1660
+ if (cur_k == key) {
1661
+ return o - 1;
1662
+ }
1663
+ }
1664
+ if (offset > size) {
1665
+ return size;
1666
+ }
1667
+ cur_k = self.m_.getKey(cont[offset - 1]);
1668
+ }
1669
+ while (true) {
1670
+ auto lt = cur_k < key;
1671
+ if (cur_k == key) {
1672
+ return offset - 1;
1673
+ }
1674
+ offset = 2 * offset + lt;
1675
+ if (offset > size)
1676
+ return size;
1677
+ cur_k = self.m_.getKey(cont[offset - 1]);
1678
+ }
1679
+ return size;
1680
+ }
1681
+ };
1682
+
1683
+ } // namespace folly