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,1026 @@
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
+ #pragma once
18
+
19
+ #include <bitset>
20
+ #include <vector>
21
+
22
+ #include <glog/logging.h>
23
+ #include <folly/ConstructorCallbackList.h>
24
+ #include <folly/Function.h>
25
+ #include <folly/Optional.h>
26
+ #include <folly/ScopeGuard.h>
27
+ #include <folly/io/async/DestructorCheck.h>
28
+ #include <folly/small_vector.h>
29
+
30
+ /**
31
+ * Tooling that makes it easier to design observable objects and observers.
32
+ */
33
+
34
+ namespace folly {
35
+
36
+ /**
37
+ * Interface for store of pointers to observers.
38
+ */
39
+ template <typename Observer>
40
+ class ObserverContainerStoreBase {
41
+ public:
42
+ using observer_type = Observer;
43
+
44
+ // ObserverContainerStore stores shared_ptr<Observer> objects.
45
+ //
46
+ // To support observer objects that are NOT managed by a shared_ptr, the
47
+ // encapsulating ObserverContainer wraps unmanaged pointers inside of
48
+ // shared_ptrs, but sets an empty deleter for the shared_ptr, so that the
49
+ // pointer remains unmanaged.
50
+ //
51
+ // As a result, it is possible for the shared_ptrs maintained by the store to
52
+ // be "unmanaged". The type alias `MaybeManagedObserverPointer` is used to
53
+ // ensure that this detail is apparent in other parts of the container code.
54
+ using MaybeManagedObserverPointer = std::shared_ptr<Observer>;
55
+
56
+ virtual ~ObserverContainerStoreBase() = default;
57
+
58
+ /**
59
+ * Add an observer pointer to the store.
60
+ *
61
+ * @param observer Observer to add.
62
+ * @return Whether observer was added (not already present).
63
+ */
64
+ virtual bool add(MaybeManagedObserverPointer observer) = 0;
65
+
66
+ /**
67
+ * Remove an observer pointer from the store.
68
+ *
69
+ * @param observer Observer to remove.
70
+ * @return Whether observer found and removed from store.
71
+ */
72
+ virtual bool remove(MaybeManagedObserverPointer observer) = 0;
73
+
74
+ /**
75
+ * Get number of observers in store.
76
+ *
77
+ * If called while the store is being iterated, the returned value may not
78
+ * reflect changes that occurred (e.g., observers added or removed) during
79
+ * iteration.
80
+ *
81
+ * @return Number of observers in store.
82
+ */
83
+ virtual size_t size() const = 0;
84
+
85
+ /**
86
+ * Policy that determines how invokeForEachObserver handles mutations.
87
+ */
88
+ enum class InvokeWhileIteratingPolicy {
89
+ InvokeAdded, // if observer added, invoke fn for it
90
+ DoNotInvokeAdded, // if observer added, do not invoke fn for it
91
+ CheckNoChange, // observers must not be added or removed during iteration
92
+ CheckNoAdded // observers must not be added during iteration
93
+ };
94
+
95
+ /**
96
+ * Invoke function for each observer in the store.
97
+ *
98
+ * @param fn Function to call for each observer in store.
99
+ * @param policy InvokeWhileIteratingPolicy policy.
100
+ */
101
+ virtual void invokeForEachObserver(
102
+ folly::Function<void(MaybeManagedObserverPointer&)>&& fn,
103
+ const InvokeWhileIteratingPolicy policy) = 0;
104
+
105
+ /**
106
+ * Invoke function for each observer in the store.
107
+ *
108
+ * @param fn Function to call for each observer in store.
109
+ * @param policy InvokeWhileIteratingPolicy policy.
110
+ */
111
+ virtual void invokeForEachObserver(
112
+ folly::Function<void(Observer*)>&& fn,
113
+ const InvokeWhileIteratingPolicy policy) {
114
+ invokeForEachObserver(
115
+ [fnL = std::move(fn)](MaybeManagedObserverPointer& observer) mutable {
116
+ fnL(observer.get());
117
+ },
118
+ policy);
119
+ }
120
+ };
121
+
122
+ /**
123
+ * Policy for ObserverContainerStore.
124
+ *
125
+ * Defines the udnerlying container type and the default size.
126
+ */
127
+ template <unsigned int ReserveElements = 2>
128
+ struct ObserverContainerStorePolicyDefault {
129
+ template <typename Observer>
130
+ using container = std::conditional_t<
131
+ !kIsMobile,
132
+ folly::small_vector<Observer, ReserveElements>,
133
+ std::vector<Observer>>;
134
+ const static unsigned int reserve_elements = ReserveElements;
135
+ };
136
+
137
+ /**
138
+ * Policy-based implementation of ObserverContainerStoreBase.
139
+ */
140
+ template <
141
+ typename Observer,
142
+ typename Policy = ObserverContainerStorePolicyDefault<>>
143
+ class ObserverContainerStore : public ObserverContainerStoreBase<Observer> {
144
+ public:
145
+ using Base = ObserverContainerStoreBase<Observer>;
146
+ using InvokeWhileIteratingPolicy = typename Base::InvokeWhileIteratingPolicy;
147
+
148
+ /**
149
+ * Construct a new store, reserving as configured.
150
+ */
151
+ ObserverContainerStore() { observers_.reserve(Policy::reserve_elements); }
152
+
153
+ /**
154
+ * Add an observer pointer to the store.
155
+ *
156
+ * @param observer Observer to add.
157
+ * @return Whether observer was added (not already present).
158
+ */
159
+ bool add(std::shared_ptr<Observer> observer) override {
160
+ // attempts to add the same observer multiple times are rejected
161
+ if (std::find(observers_.begin(), observers_.end(), observer) !=
162
+ observers_.end()) {
163
+ return false;
164
+ }
165
+
166
+ if (iterating_) {
167
+ CHECK(maybeCurrentIterationPolicy_.has_value());
168
+ const auto& policy = maybeCurrentIterationPolicy_.value();
169
+ switch (policy) {
170
+ case InvokeWhileIteratingPolicy::InvokeAdded:
171
+ case InvokeWhileIteratingPolicy::DoNotInvokeAdded:
172
+ break;
173
+ case InvokeWhileIteratingPolicy::CheckNoChange:
174
+ folly::terminate_with<std::runtime_error>(
175
+ "Cannot add observers while iterating "
176
+ "per current iteration policy (CheckNoChange)");
177
+ break;
178
+ case InvokeWhileIteratingPolicy::CheckNoAdded:
179
+ folly::terminate_with<std::runtime_error>(
180
+ "Cannot add observers while iterating "
181
+ "per current iteration policy (CheckNoAdded)");
182
+ break;
183
+ }
184
+ }
185
+ observers_.insert(observers_.end(), observer);
186
+ return true;
187
+ }
188
+
189
+ /**
190
+ * Remove an observer pointer from the store.
191
+ *
192
+ * @param observer Observer to remove.
193
+ * @return Whether observer found and removed from store.
194
+ */
195
+ bool remove(std::shared_ptr<Observer> observer) override {
196
+ const auto it = std::find(observers_.begin(), observers_.end(), observer);
197
+ if (it == observers_.end()) {
198
+ return false;
199
+ }
200
+
201
+ // if store is currently being iterated, set this element to nullptr and it
202
+ // will be cleaned up after iteration is completed, else erase immediately.
203
+ if (iterating_) {
204
+ CHECK(maybeCurrentIterationPolicy_.has_value());
205
+ const auto& policy = maybeCurrentIterationPolicy_.value();
206
+ switch (policy) {
207
+ case InvokeWhileIteratingPolicy::InvokeAdded:
208
+ case InvokeWhileIteratingPolicy::DoNotInvokeAdded:
209
+ break;
210
+ case InvokeWhileIteratingPolicy::CheckNoChange:
211
+ folly::terminate_with<std::runtime_error>(
212
+ "Cannot remove observers while iterating "
213
+ "per current iteration policy (CheckNoChange)");
214
+ break;
215
+ case InvokeWhileIteratingPolicy::CheckNoAdded:
216
+ break;
217
+ }
218
+
219
+ *it = nullptr;
220
+ removalDuringIteration_ = true;
221
+ } else {
222
+ observers_.erase(it);
223
+ }
224
+
225
+ return true;
226
+ }
227
+
228
+ /**
229
+ * Get number of observers in store.
230
+ *
231
+ * If called while the store is being iterated, the returned value may not
232
+ * reflect changes that occurred (e.g., observers added or removed) during
233
+ * iteration.
234
+ *
235
+ * @return Number of observers in store.
236
+ */
237
+ size_t size() const override { return observers_.size(); }
238
+
239
+ /**
240
+ * Invoke function for each observer in the store.
241
+ *
242
+ * @param fn Function to call for each observer in store.
243
+ * @param policy InvokeWhileIteratingPolicy policy.
244
+ */
245
+ void invokeForEachObserver(
246
+ folly::Function<void(typename Base::MaybeManagedObserverPointer&)>&& fn,
247
+ const typename Base::InvokeWhileIteratingPolicy policy) noexcept
248
+ override {
249
+ CHECK(!iterating_)
250
+ << "Nested iteration of ObserverContainer is prohibited.";
251
+ CHECK(!maybeCurrentIterationPolicy_.has_value())
252
+ << "Nested iteration of ObserverContainer is prohibited.";
253
+ iterating_ = true;
254
+ maybeCurrentIterationPolicy_ = policy;
255
+ SCOPE_EXIT {
256
+ if (removalDuringIteration_) {
257
+ // observers removed while we were iterating through container;
258
+ // remove elements for which the element value is null
259
+ observers_.erase(
260
+ std::remove_if(
261
+ observers_.begin(),
262
+ observers_.end(),
263
+ [](const auto& elem) { return elem == nullptr; }),
264
+ observers_.end());
265
+ }
266
+ iterating_ = false;
267
+ maybeCurrentIterationPolicy_ = folly::none;
268
+ removalDuringIteration_ = false;
269
+ };
270
+
271
+ const auto numObserversAtStart = observers_.size();
272
+
273
+ // iterate through the list using indexes, not iterators, so that the list
274
+ // can mutate during iteration...
275
+ for (typename container_type::size_type idx = 0;
276
+ // observers_.size() cannot decrease during iteration, so it should be
277
+ // insignificantly faster to check the single size in the common case.
278
+ idx < numObserversAtStart ||
279
+ (idx < observers_.size() &&
280
+ policy == InvokeWhileIteratingPolicy::InvokeAdded);
281
+ idx++) {
282
+ auto& observer = observers_.at(idx);
283
+ if (!observer) { // empty space in list caused by incomplete removal
284
+ continue;
285
+ }
286
+
287
+ fn(observer);
288
+ }
289
+ }
290
+
291
+ using Base::invokeForEachObserver;
292
+
293
+ private:
294
+ using container_type =
295
+ typename Policy::template container<std::shared_ptr<Observer>>;
296
+
297
+ // The actual list of observers.
298
+ container_type observers_;
299
+
300
+ // Whether we are actively iterating through the list of observers.
301
+ bool iterating_{false};
302
+
303
+ // If we are actively iterating, the corresponding InvokeWhileIteratingPolicy.
304
+ folly::Optional<InvokeWhileIteratingPolicy> maybeCurrentIterationPolicy_;
305
+
306
+ // Whether a removal or addition occurred while we iterating through the list.
307
+ bool removalDuringIteration_{false};
308
+ };
309
+
310
+ /**
311
+ * Policy for ObserverContainerBase.
312
+ *
313
+ * @tparam EventEnum Enum of events that observers can subscribe to.
314
+ * Each event must have a unique integer value greater
315
+ * than zero.
316
+ *
317
+ * @tparam BitsetSize Size of bitset, must be greater than or equal to the
318
+ * number of events in EventEnum.
319
+ */
320
+ template <typename EventEnum, size_t BitsetSize>
321
+ struct ObserverContainerBasePolicyDefault {
322
+ static constexpr size_t bitset_size() { return BitsetSize; }
323
+ using event_enum = EventEnum;
324
+ };
325
+
326
+ /**
327
+ * Base ObserverContainer and definition of Observers.
328
+ */
329
+ template <
330
+ typename ObserverInterface,
331
+ typename Observed,
332
+ typename ContainerPolicy>
333
+ class ObserverContainerBase {
334
+ public:
335
+ using interface_type = ObserverInterface;
336
+ using observed_type = Observed;
337
+ using policy_type = ContainerPolicy;
338
+ using EventEnum = typename ContainerPolicy::event_enum;
339
+ using EventEnumIntT = std::underlying_type_t<EventEnum>;
340
+
341
+ virtual ~ObserverContainerBase() = default;
342
+
343
+ /**
344
+ * EventSet is used to keep track of the observer events that are enabled.
345
+ */
346
+ class ObserverEventSet {
347
+ public:
348
+ ObserverEventSet() : bitset_(0) {}
349
+
350
+ /**
351
+ * Enables all events.
352
+ */
353
+ void enableAllEvents() { bitset_.set(); }
354
+
355
+ /**
356
+ * Enables the events passed in the initializer list.
357
+ *
358
+ * @param eventsEnums Events to enable.
359
+
360
+ */
361
+ template <typename... EventEnums>
362
+ void enable(EventEnums... eventEnums) {
363
+ for (auto&& event : {eventEnums...}) {
364
+ const auto eventAsInt = static_cast<EventEnumIntT>(event);
365
+ bitset_.set(eventAsInt);
366
+ }
367
+ }
368
+
369
+ /**
370
+ * Returns whether the event passed in is enabled.
371
+ *
372
+ * @param event Event to check.
373
+ * @return Whether the passed event is enabled.
374
+ */
375
+ bool isEnabled(const EventEnum event) const {
376
+ const auto eventAsInt = static_cast<EventEnumIntT>(event);
377
+ return bitset_.test(eventAsInt);
378
+ }
379
+
380
+ /**
381
+ * Builder that makes it easier to pass EventSet to Observer constructor.
382
+ */
383
+ class Builder {
384
+ public:
385
+ explicit Builder() = default;
386
+
387
+ /**
388
+ * Enables all events.
389
+ */
390
+ Builder&& enableAllEvents() {
391
+ set_.enableAllEvents();
392
+ return std::move(*this);
393
+ }
394
+
395
+ /**
396
+ * Enables the events passed in the intiailizer list.
397
+ *
398
+ * @param events Events to enable.
399
+ */
400
+ template <typename... EventEnums>
401
+ Builder&& enable(EventEnums... eventEnums) {
402
+ set_.enable(eventEnums...);
403
+ return std::move(*this);
404
+ }
405
+
406
+ /**
407
+ * Returns the EventSet that has been built.
408
+ */
409
+ ObserverEventSet build() && { return set_; }
410
+
411
+ private:
412
+ ObserverEventSet set_;
413
+ };
414
+
415
+ private:
416
+ std::bitset<ContainerPolicy::bitset_size()> bitset_{0};
417
+ };
418
+
419
+ /**
420
+ * Observer base interface.
421
+ *
422
+ * This interface includes the events exposed by the subject's observer
423
+ * interface and the set of events that are provided by the ObserverContainer
424
+ * (attached/detached/moved/destoyed). It also defines how observers subscribe
425
+ * to specific events made available by the subject.
426
+ */
427
+ class ObserverBase : public ObserverInterface, public DestructorCheck {
428
+ public:
429
+ using observed_type = Observed;
430
+ using interface_type = ObserverInterface;
431
+
432
+ using EventSet = ObserverEventSet;
433
+ using EventSetBuilder = typename ObserverEventSet::Builder;
434
+
435
+ ~ObserverBase() override = default;
436
+
437
+ /**
438
+ * Construct a new observer with no event subscriptions.
439
+ */
440
+ ObserverBase() {}
441
+
442
+ /**
443
+ * Construct a new observer subscribed to events in the passed EventSet.
444
+ */
445
+ explicit ObserverBase(EventSet eventSet) : eventSet_(eventSet) {}
446
+
447
+ /**
448
+ * Base class that can be used to pass context about move operation.
449
+ */
450
+ class MoveContext {};
451
+
452
+ /**
453
+ * Base class that can be used to pass context about why object destroyed.
454
+ */
455
+ class DestroyContext {};
456
+
457
+ /**
458
+ * Invoked when this observer is attached to an object.
459
+ *
460
+ * @param obj Object that observer is now attached to.
461
+ */
462
+ virtual void attached(Observed* /* obj */) noexcept {}
463
+
464
+ /**
465
+ * Invoked if this observer is detached from an object.
466
+ *
467
+ * @param obj Object that observer is no longer attached to.
468
+ */
469
+ virtual void detached(Observed* /* obj */) noexcept {}
470
+
471
+ /**
472
+ * Invoked when an observed object's destructor is invoked.
473
+ *
474
+ * Destruction of the observed object implicitly implies detached, and thus
475
+ * detached will not be called if an object is destroyed.
476
+ *
477
+ * @param obj Object being destroyed.
478
+ * @param ctx Additional info about what triggered destruction.
479
+ * Not available unless provided by the implementation;
480
+ * if not supported it is a nullptr.
481
+ */
482
+ virtual void destroyed(
483
+ Observed* /* obj */, DestroyContext* /* ctx */) noexcept {}
484
+
485
+ /**
486
+ * Invoked when object being observed changes due to move construction.
487
+ *
488
+ * @param oldObj Object previously being observed.
489
+ * @param newObj Object now being observed.
490
+ * @param ctx Additional info about what triggered the move.
491
+ * Not available unless provided by the implementation;
492
+ * if not supported it is a nullptr.
493
+ */
494
+ virtual void moved(
495
+ Observed* /* oldObj */,
496
+ Observed* /* newObj */,
497
+ MoveContext* /* ctx */) noexcept {}
498
+
499
+ /**
500
+ * Proxy function used to invoke a method defined in the observer interface.
501
+ *
502
+ * Can be overridden to enable composition of observers, including event bus
503
+ * architectures in which multiple handlers act on an event.
504
+ *
505
+ * Implementations can remove themselves and add/remove other observers from
506
+ * the container when handling this call. If new observers are added to the
507
+ * container, invokeInterfaceMethod will be called on those new observers
508
+ * as well. If you want to avoid this in your observer implementation, delay
509
+ * mutation of the container until postInvokeInterfaceMethod is called.
510
+ *
511
+ * @param obj Object associated with observer event.
512
+ * @param fn Function that will invoke the method associated with
513
+ * an observer event, passing any event context.
514
+ * @param maybeEvent The event enum associated with the invocation.
515
+ */
516
+ virtual void invokeInterfaceMethod(
517
+ Observed* obj,
518
+ folly::Function<void(ObserverBase*, Observed*)>& fn,
519
+ folly::Optional<EventEnum> /* maybeEvent */) noexcept {
520
+ fn(this, obj);
521
+ }
522
+
523
+ /**
524
+ * Invoked after invokeInterfaceMethod has completed for all observers.
525
+ *
526
+ * Can be used to delay mutation of the container after processing of an
527
+ * event has completed. Implementations can remove themselves and add/remove
528
+ * other observers from the container when handling this call. However, this
529
+ * function will only be called for the set of observers in the container
530
+ * when the preceding call to invokeInterfaceMethod finished.
531
+ *
532
+ * @param obj Object associated with observer event.
533
+ */
534
+ virtual void postInvokeInterfaceMethod(Observed* /* obj */) noexcept {}
535
+
536
+ /**
537
+ * Returns the EventSet containing the events the observer wants.
538
+ */
539
+ const EventSet& getEventSet() const noexcept { return eventSet_; }
540
+
541
+ private:
542
+ const EventSet eventSet_;
543
+ };
544
+
545
+ /**
546
+ * Observer interface.
547
+ *
548
+ * The interface between an observer container and observers in the container.
549
+ *
550
+ * This interface includes methods that are called upon relevant changes to
551
+ * the observer's status in a container (added/removedFromObserverContainer).
552
+ *
553
+ * An observer must not be destroyed while it is in a container. This can be
554
+ * accomplished by removing the observer from the container on its destruction
555
+ * or delaying destruction.
556
+ *
557
+ * Typical use cases should not attempt to implement this interface and should
558
+ * instead use a specialization such as ManagedObserver.
559
+ */
560
+ class Observer : public ObserverBase {
561
+ public:
562
+ using observed_type = Observed;
563
+ using interface_type = ObserverInterface;
564
+
565
+ using EventSet = ObserverEventSet;
566
+ using EventSetBuilder = typename ObserverEventSet::Builder;
567
+
568
+ ~Observer() override = default;
569
+
570
+ /**
571
+ * Construct a new observer with no event subscriptions.
572
+ */
573
+ Observer() : ObserverBase() {}
574
+
575
+ /**
576
+ * Construct a new observer subscribed to events in the passed EventSet.
577
+ */
578
+ explicit Observer(EventSet eventSet) : ObserverBase(eventSet) {}
579
+
580
+ /**
581
+ * Invoked when this observer has been added to an observer container.
582
+ *
583
+ * For the typical observer container implementation a call to `attached`
584
+ * will proceed a call to this method.
585
+ *
586
+ * The observer implementation must ensure that it remains alive as long as
587
+ * it is in this container.
588
+ *
589
+ * @param ctr Container observer has been added to.
590
+ */
591
+ virtual void addedToObserverContainer(
592
+ ObserverContainerBase* ctr) noexcept = 0;
593
+
594
+ /**
595
+ * Invoked when this observer has been removed from an observer container.
596
+ *
597
+ * For the typical observer container implementation a call to `detached`
598
+ * will have occurred before this method is called.
599
+ *
600
+ * @param ctr Container observer has been removed from.
601
+ */
602
+ virtual void removedFromObserverContainer(
603
+ ObserverContainerBase* ctr) noexcept = 0;
604
+
605
+ /**
606
+ * Invoked when this observer is moved from one container to another.
607
+ *
608
+ * Occurs in the case of move construction of a new object during which the
609
+ * observers in the observer container are shifted from the old object to
610
+ * the new object.
611
+ *
612
+ * @param oldCtr Container observer has been removed from.
613
+ * @param newCtr Container observer has been added to.
614
+ */
615
+ virtual void movedToObserverContainer(
616
+ ObserverContainerBase* oldCtr,
617
+ ObserverContainerBase* newCtr) noexcept = 0;
618
+ };
619
+
620
+ /**
621
+ * Returns the object associated with the container (e.g., observed object).
622
+ *
623
+ * @return Return object associated with container or nullptr.
624
+ */
625
+ virtual Observed* getObject() const = 0;
626
+
627
+ /**
628
+ * Adds an observer to the container.
629
+ *
630
+ * If the observer is already in the container, this is a no-op.
631
+ *
632
+ * @param observer Observer to add.
633
+ */
634
+ virtual void addObserver(std::shared_ptr<Observer> observer) = 0;
635
+
636
+ /**
637
+ * Adds an observer to the container.
638
+ *
639
+ * If the observer is already in the container, this is a no-op.
640
+ *
641
+ * @param observer Observer to add.
642
+ */
643
+ virtual void addObserver(Observer* observer) {
644
+ // create a shared_ptr holding an unmanaged ptr
645
+ // this does not trigger control block allocation
646
+ return addObserver(
647
+ std::shared_ptr<Observer>(std::shared_ptr<void>(), observer));
648
+ }
649
+
650
+ /**
651
+ * Removes an observer from the container.
652
+ *
653
+ * @param observer Observer to remove.
654
+ * @return Whether the observer was found and removed.
655
+ */
656
+ virtual bool removeObserver(std::shared_ptr<Observer> observer) = 0;
657
+
658
+ /**
659
+ * Removes an observer from the container.
660
+ *
661
+ * @param observer Observer to remove.
662
+ * @return Whether the observer was found and removed.
663
+ */
664
+ virtual bool removeObserver(Observer* observer) {
665
+ // create a shared_ptr holding an unmanaged ptr
666
+ // this does not trigger control block allocation
667
+ return removeObserver(
668
+ std::shared_ptr<Observer>(std::shared_ptr<void>(), observer));
669
+ }
670
+
671
+ /**
672
+ * Get number of observers in container.
673
+ *
674
+ * @return Number of observers in container.
675
+ */
676
+ size_t numObservers() const { return getStoreConst().size(); }
677
+
678
+ /**
679
+ * Get a list of observers in the container of type T.
680
+ *
681
+ * @tparam T Type of observer to find.
682
+ * @return List of observers in the container of type T.
683
+ */
684
+ template <typename T = Observer>
685
+ std::vector<T*> findObservers() {
686
+ static_assert(
687
+ std::is_base_of<Observer, T>::value,
688
+ "T must derive from ObserverContainer::Observer");
689
+
690
+ std::vector<T*> matchingObservers;
691
+ using InvokeWhileIteratingPolicy = typename ObserverContainerStoreBase<
692
+ Observer>::InvokeWhileIteratingPolicy;
693
+ getStore().invokeForEachObserver(
694
+ [&matchingObservers](Observer* observer) {
695
+ auto castPtr = dynamic_cast<T*>(observer);
696
+ if (castPtr) {
697
+ matchingObservers.emplace_back(castPtr);
698
+ }
699
+ },
700
+ InvokeWhileIteratingPolicy::CheckNoChange);
701
+
702
+ return matchingObservers;
703
+ }
704
+
705
+ /**
706
+ * Get all observers.
707
+ *
708
+ * @return List of observers in the container.
709
+ */
710
+ std::vector<Observer*> getObservers() { return findObservers<Observer>(); }
711
+
712
+ /**
713
+ * Returns if any observer in the container is subscribed to a given event.
714
+ *
715
+ * TODO(bschlinker): The current implementation scans the entire container to
716
+ * search for an observer subscribed to the requested event; we should cache
717
+ * this information instead and update the cache on observer add / remove.
718
+ *
719
+ * @tparam event Event in EventEnum.
720
+ * @return If there are observers subscribed to the given event.
721
+ */
722
+ template <EventEnum event>
723
+ bool hasObserversForEvent() {
724
+ bool foundObserverWithEvent = false;
725
+ using InvokeWhileIteratingPolicy = typename ObserverContainerStoreBase<
726
+ Observer>::InvokeWhileIteratingPolicy;
727
+ getStore().invokeForEachObserver(
728
+ [&foundObserverWithEvent](Observer* observer) {
729
+ foundObserverWithEvent |= observer->getEventSet().isEnabled(event);
730
+ },
731
+ InvokeWhileIteratingPolicy::CheckNoChange);
732
+ return foundObserverWithEvent;
733
+ }
734
+
735
+ /**
736
+ * Helper class for observers that attach to single object / container.
737
+ *
738
+ * Does not have any thread safety, and thus can only be used if the observer
739
+ * is driven exclusively by the same thread as the thread that controls the
740
+ * object being observed.
741
+ *
742
+ * Tracks the container the observer is in (if any). If the observer's
743
+ * destructor is triggered while it is in an container, it will be removed
744
+ * from the container during the destruction process.
745
+ */
746
+ class ManagedObserver : public Observer {
747
+ public:
748
+ using Observer::Observer;
749
+ using EventSet = typename Observer::EventSet;
750
+ using EventSetBuilder = typename Observer::EventSetBuilder;
751
+
752
+ ~ManagedObserver() override { detach(); }
753
+
754
+ /**
755
+ * Detach the observer (if currently attached).
756
+ *
757
+ * If the observer is not currently attached, this is a no-op.
758
+ *
759
+ * @return If successfully detached.
760
+ */
761
+ bool detach() {
762
+ if (!ctr_) {
763
+ return false;
764
+ }
765
+ return ctr_->removeObserver(this);
766
+ }
767
+
768
+ /**
769
+ * Return if the observer is observing an object.
770
+ *
771
+ * @return If observer is observing an object.
772
+ */
773
+ bool isObserving() const {
774
+ return ctr_ != nullptr && ctr_->getObject() != nullptr;
775
+ }
776
+
777
+ /**
778
+ * Get the object that is being observed or nullptr.
779
+ *
780
+ * @return Object being observed.
781
+ */
782
+ Observed* getObservedObject() const {
783
+ if (!ctr_) {
784
+ return nullptr;
785
+ }
786
+ return ctr_->getObject();
787
+ }
788
+
789
+ private:
790
+ void addedToObserverContainer(
791
+ ObserverContainerBase* ctr) noexcept override {
792
+ CHECK(!ctr_);
793
+ ctr_ = ctr;
794
+ }
795
+
796
+ void removedFromObserverContainer(
797
+ ObserverContainerBase* ctr) noexcept override {
798
+ CHECK_EQ(ctr_, ctr);
799
+ ctr_ = nullptr;
800
+ }
801
+
802
+ void movedToObserverContainer(
803
+ ObserverContainerBase* oldCtr,
804
+ ObserverContainerBase* newCtr) noexcept override {
805
+ CHECK_EQ(ctr_, oldCtr);
806
+ CHECK_NE(ctr_, newCtr);
807
+ ctr_ = newCtr;
808
+ }
809
+
810
+ // Container the observer is in (or nullptr).
811
+ ObserverContainerBase* ctr_{nullptr};
812
+ };
813
+
814
+ protected:
815
+ virtual ObserverContainerStoreBase<Observer>& getStore() = 0;
816
+
817
+ virtual const ObserverContainerStoreBase<Observer>& getStoreConst() const = 0;
818
+
819
+ void invokeInterfaceMethodImpl(
820
+ Observed* observed,
821
+ folly::Function<void(ObserverBase*, Observed*)>&& fn,
822
+ const folly::Optional<EventEnum> maybeEvent = folly::none) noexcept {
823
+ using InvokeWhileIteratingPolicy = typename ObserverContainerStoreBase<
824
+ Observer>::InvokeWhileIteratingPolicy;
825
+ getStore().invokeForEachObserver(
826
+ [observed, maybeEvent, &fn](Observer* observer) {
827
+ if (!maybeEvent.has_value() ||
828
+ observer->getEventSet().isEnabled(maybeEvent.value())) {
829
+ observer->invokeInterfaceMethod(observed, fn, maybeEvent);
830
+ }
831
+ },
832
+ InvokeWhileIteratingPolicy::InvokeAdded);
833
+ getStore().invokeForEachObserver(
834
+ [observed, maybeEvent](ObserverBase* observer) {
835
+ if (!maybeEvent.has_value() ||
836
+ observer->getEventSet().isEnabled(maybeEvent.value())) {
837
+ observer->postInvokeInterfaceMethod(observed);
838
+ }
839
+ },
840
+ InvokeWhileIteratingPolicy::DoNotInvokeAdded);
841
+ }
842
+ };
843
+
844
+ /**
845
+ * Policy-based implementation of ObserverContainerBase.
846
+ */
847
+ template <
848
+ typename ObserverInterface,
849
+ typename Observed,
850
+ typename ContainerPolicy,
851
+ typename StorePolicy = ObserverContainerStorePolicyDefault<>,
852
+ std::size_t MaxConstructorCallbacks = 4>
853
+ class ObserverContainer : public ObserverContainerBase<
854
+ ObserverInterface,
855
+ Observed,
856
+ ContainerPolicy> {
857
+ public:
858
+ using ContainerBase =
859
+ ObserverContainerBase<ObserverInterface, Observed, ContainerPolicy>;
860
+ using Observer = typename ContainerBase::Observer;
861
+ using EventEnum = typename ContainerBase::EventEnum;
862
+ using StoreBase = ObserverContainerStoreBase<Observer>;
863
+ using ContainerConstructorCallbackList =
864
+ ConstructorCallbackList<ObserverContainer, MaxConstructorCallbacks>;
865
+
866
+ explicit ObserverContainer(Observed* obj)
867
+ : obj_(CHECK_NOTNULL(obj)), constructorCallbackList_(this) {}
868
+
869
+ ObserverContainer(Observed* obj, ObserverContainer&& observerContainer)
870
+ : obj_(CHECK_NOTNULL(obj)), constructorCallbackList_(this) {
871
+ using InvokeWhileIteratingPolicy =
872
+ typename StoreBase::InvokeWhileIteratingPolicy;
873
+ observerContainer.getStore().invokeForEachObserver(
874
+ [this, &observerContainer](
875
+ typename StoreBase::MaybeManagedObserverPointer& observer) {
876
+ // observer may be a managed pointer (e.g., a shared_ptr), and
877
+ // invokeForEachObserver passes a reference, so we need to copy the
878
+ // observer object before calling remove so that it will not be
879
+ // destroyed upon removal from the old ObserverContainer
880
+ auto observerCopy = observer;
881
+ CHECK_NOTNULL(observerCopy.get());
882
+
883
+ // remove
884
+ const bool removed = observerContainer.getStore().remove(observer);
885
+ CHECK(removed);
886
+
887
+ // add to new, operating solely on observerCopy
888
+ const bool added = getStore().add(observerCopy);
889
+ CHECK(added);
890
+ observerCopy->movedToObserverContainer(&observerContainer, this);
891
+ observerCopy->moved(
892
+ observerContainer.getObject(), obj_, nullptr /* ctx */);
893
+ },
894
+ InvokeWhileIteratingPolicy::CheckNoAdded);
895
+ }
896
+
897
+ ~ObserverContainer() override {
898
+ using InvokeWhileIteratingPolicy =
899
+ typename StoreBase::InvokeWhileIteratingPolicy;
900
+ getStore().invokeForEachObserver(
901
+ [this](Observer* observer) {
902
+ DestructorCheck::Safety dc(*observer);
903
+ observer->destroyed(obj_, nullptr /* ctx */);
904
+ if (!dc.destroyed()) {
905
+ observer->removedFromObserverContainer(this);
906
+ }
907
+ },
908
+ InvokeWhileIteratingPolicy::CheckNoAdded);
909
+ }
910
+
911
+ /**
912
+ * Returns the object associated with the container (e.g., observed object).
913
+ *
914
+ * @return Return object associated with container or nullptr.
915
+ */
916
+ Observed* getObject() const override { return obj_; }
917
+
918
+ using ContainerBase::addObserver;
919
+ using ContainerBase::removeObserver;
920
+
921
+ /**
922
+ * Adds an observer to the container.
923
+ *
924
+ * If the observer is already in the container, this is a no-op.
925
+ *
926
+ * @param observer Observer to add.
927
+ */
928
+ void addObserver(std::shared_ptr<Observer> observer) override {
929
+ CHECK_NOTNULL(observer.get());
930
+ if (getStore().add(observer)) {
931
+ DestructorCheck::Safety dc(*observer);
932
+ observer->addedToObserverContainer(this);
933
+ if (!dc.destroyed()) {
934
+ observer->attached(obj_);
935
+ }
936
+ }
937
+ }
938
+
939
+ /**
940
+ * Removes an observer from the container.
941
+ *
942
+ * @param observer Observer to remove.
943
+ * @return Whether the observer was found and removed.
944
+ */
945
+ bool removeObserver(std::shared_ptr<Observer> observer) override {
946
+ CHECK_NOTNULL(observer.get());
947
+ if (getStore().remove(observer)) {
948
+ DestructorCheck::Safety dc(*observer);
949
+ observer->detached(obj_);
950
+ if (!dc.destroyed()) {
951
+ observer->removedFromObserverContainer(this);
952
+ }
953
+ return true;
954
+ }
955
+ return false;
956
+ }
957
+
958
+ /**
959
+ * Add a callback fired each time obj of the observed type is constructed.
960
+ *
961
+ * Uses ConstructorCallbackList. Can be used to attach observers to all
962
+ * objects of a given type.
963
+ *
964
+ * @throw std::length_error() if installing callback would exceed max allowed
965
+ */
966
+ static void addConstructorCallback(
967
+ typename ContainerConstructorCallbackList::Callback cb) {
968
+ ContainerConstructorCallbackList::addCallback(std::move(cb));
969
+ }
970
+
971
+ /**
972
+ * Invokes an observer interface method on observers subscribed to an event.
973
+ *
974
+ * See instead `invokeInterfaceMethodAllObservers` to invoke an interface
975
+ * method on all observers without filtering based on observer event
976
+ * subscription.
977
+ *
978
+ * @tparam event Associated event in EventEnum. The passed function will
979
+ * only be called for observers subscribed to this event.
980
+ * @param fn Function to call for each observer that takes a pointer
981
+ * to the observer and invokes the interface method.
982
+ */
983
+ template <EventEnum event>
984
+ void invokeInterfaceMethod(
985
+ folly::Function<void(ObserverInterface*, Observed*)>&& fn) noexcept {
986
+ this->invokeInterfaceMethodImpl(obj_, std::move(fn), event);
987
+ }
988
+
989
+ /**
990
+ * Invokes an observer interface method on all observers.
991
+ *
992
+ * @param fn Function to call for each observer that takes a pointer
993
+ * to the observer and invokes the interface method.
994
+ */
995
+ void invokeInterfaceMethodAllObservers(
996
+ folly::Function<void(ObserverInterface*, Observed*)>&& fn) noexcept {
997
+ this->invokeInterfaceMethodImpl(obj_, std::move(fn), folly::none);
998
+ }
999
+
1000
+ ObserverContainer(const ObserverContainer&) = delete;
1001
+ ObserverContainer(ObserverContainer&&) = delete;
1002
+ ObserverContainer& operator=(const ObserverContainer&) = delete;
1003
+ ObserverContainer& operator=(ObserverContainer&& rhs) = delete;
1004
+
1005
+ private:
1006
+ StoreBase& getStore() override { return store_; }
1007
+ const StoreBase& getStoreConst() const override { return store_; }
1008
+
1009
+ // Object being observed.
1010
+ Observed* obj_{nullptr};
1011
+
1012
+ // Store that contains the observers in the container.
1013
+ ObserverContainerStore<Observer, StorePolicy> store_;
1014
+
1015
+ // Enables objects to register constructor callbacks.
1016
+ //
1017
+ // This can be used to enable observers to be attached to all objects of a
1018
+ // given type immediately upon object construction.
1019
+ //
1020
+ // Initialized last and in ObserverContainer instead of ObserverContainerBase
1021
+ // to ensure that the container has completed initialization and is ready to
1022
+ // add observers when any constructor callbacks are called.
1023
+ ContainerConstructorCallbackList constructorCallbackList_{this};
1024
+ };
1025
+
1026
+ } // namespace folly