react-native-windows 0.85.0-preview.1 → 0.85.0-preview.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (910) hide show
  1. package/Directory.Build.props +1 -1
  2. package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp +28 -46
  3. package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.h +0 -3
  4. package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp +19 -13
  5. package/Microsoft.ReactNative/Fabric/Composition/Modal/WindowsModalHostViewComponentView.cpp +107 -0
  6. package/Microsoft.ReactNative/Fabric/Composition/SelectionItemAutomationEvent.h +73 -0
  7. package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.cpp +105 -32
  8. package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.h +7 -2
  9. package/PropertySheets/CIBuildOptimizations.props +2 -2
  10. package/PropertySheets/Generated/PackageVersion.g.props +2 -2
  11. package/PropertySheets/JSEngine.props +1 -1
  12. package/PropertySheets/NuGet.LockFile.props +2 -9
  13. package/Scripts/NuGetRestoreForceEvaluateAllSolutions.ps1 +54 -5
  14. package/Scripts/UpdateNightlyDependencies.ps1 +47 -0
  15. package/Scripts/creaternwapp.cmd +29 -9
  16. package/Scripts/creaternwlib.cmd +31 -15
  17. package/external/.clang-format +1 -0
  18. package/external/External.vcxitems +10 -0
  19. package/external/fast-float/.syncignore +10 -0
  20. package/external/fast-float/LICENSE-APACHE +190 -0
  21. package/external/fast-float/LICENSE-BOOST +23 -0
  22. package/external/fast-float/LICENSE-MIT +27 -0
  23. package/external/fast-float/README.md +545 -0
  24. package/external/fast-float/cgmanifest.json +15 -0
  25. package/external/fast-float/fast-float.vcxitems +14 -0
  26. package/external/fast-float/include/fast_float/ascii_number.h +588 -0
  27. package/external/fast-float/include/fast_float/bigint.h +638 -0
  28. package/external/fast-float/include/fast_float/constexpr_feature_detect.h +46 -0
  29. package/external/fast-float/include/fast_float/decimal_to_binary.h +212 -0
  30. package/external/fast-float/include/fast_float/digit_comparison.h +457 -0
  31. package/external/fast-float/include/fast_float/fast_float.h +59 -0
  32. package/external/fast-float/include/fast_float/fast_table.h +708 -0
  33. package/external/fast-float/include/fast_float/float_common.h +1240 -0
  34. package/external/fast-float/include/fast_float/parse_number.h +399 -0
  35. package/external/fast-float/sync-config.json +8 -0
  36. package/external/fmt/.syncignore +10 -0
  37. package/external/fmt/CONTRIBUTING.md +20 -0
  38. package/external/fmt/LICENSE +27 -0
  39. package/external/fmt/README.md +484 -0
  40. package/external/fmt/cgmanifest.json +15 -0
  41. package/external/fmt/doc/ChangeLog-old.md +3290 -0
  42. package/external/fmt/doc/api.md +650 -0
  43. package/external/fmt/doc/fmt.css +61 -0
  44. package/external/fmt/doc/fmt.js +4 -0
  45. package/external/fmt/doc/get-started.md +222 -0
  46. package/external/fmt/doc/index.md +151 -0
  47. package/external/fmt/doc/perf.svg +1 -0
  48. package/external/fmt/doc/python-license.txt +290 -0
  49. package/external/fmt/doc/syntax.md +887 -0
  50. package/external/fmt/fmt.vcxitems +28 -0
  51. package/external/fmt/include/fmt/args.h +228 -0
  52. package/external/fmt/include/fmt/base.h +3077 -0
  53. package/external/fmt/include/fmt/chrono.h +2432 -0
  54. package/external/fmt/include/fmt/color.h +612 -0
  55. package/external/fmt/include/fmt/compile.h +529 -0
  56. package/external/fmt/include/fmt/core.h +5 -0
  57. package/external/fmt/include/fmt/format-inl.h +1928 -0
  58. package/external/fmt/include/fmt/format.h +4427 -0
  59. package/external/fmt/include/fmt/os.h +439 -0
  60. package/external/fmt/include/fmt/ostream.h +211 -0
  61. package/external/fmt/include/fmt/printf.h +656 -0
  62. package/external/fmt/include/fmt/ranges.h +882 -0
  63. package/external/fmt/include/fmt/std.h +699 -0
  64. package/external/fmt/include/fmt/xchar.h +322 -0
  65. package/external/fmt/src/fmt.cc +135 -0
  66. package/external/fmt/src/format.cc +43 -0
  67. package/external/fmt/src/os.cc +403 -0
  68. package/external/fmt/sync-config.json +8 -0
  69. package/external/folly/.syncignore +60 -0
  70. package/external/folly/Folly.natvis +25 -0
  71. package/external/folly/LICENSE +200 -0
  72. package/external/folly/README.md +263 -0
  73. package/external/folly/cgmanifest.json +25 -0
  74. package/external/folly/folly/.clang-format +1 -0
  75. package/external/folly/folly/AtomicHashArray-inl.h +546 -0
  76. package/external/folly/folly/AtomicHashArray.h +431 -0
  77. package/external/folly/folly/AtomicHashMap-inl.h +653 -0
  78. package/external/folly/folly/AtomicHashMap.h +484 -0
  79. package/external/folly/folly/AtomicIntrusiveLinkedList.h +206 -0
  80. package/external/folly/folly/AtomicLinkedList.h +110 -0
  81. package/external/folly/folly/AtomicUnorderedMap.h +522 -0
  82. package/external/folly/folly/BUCK +1631 -0
  83. package/external/folly/folly/BUILD_MODE.bzl +72 -0
  84. package/external/folly/folly/Benchmark.cpp +986 -0
  85. package/external/folly/folly/Benchmark.h +680 -0
  86. package/external/folly/folly/BenchmarkUtil.h +47 -0
  87. package/external/folly/folly/Bits.h +17 -0
  88. package/external/folly/folly/CMakeLists.txt +110 -0
  89. package/external/folly/folly/CPortability.h +338 -0
  90. package/external/folly/folly/CancellationToken-inl.h +449 -0
  91. package/external/folly/folly/CancellationToken.cpp +250 -0
  92. package/external/folly/folly/CancellationToken.h +365 -0
  93. package/external/folly/folly/Chrono.h +132 -0
  94. package/external/folly/folly/ClockGettimeWrappers.cpp +93 -0
  95. package/external/folly/folly/ClockGettimeWrappers.h +29 -0
  96. package/external/folly/folly/ConcurrentBitSet.h +157 -0
  97. package/external/folly/folly/ConcurrentLazy.h +74 -0
  98. package/external/folly/folly/ConcurrentSkipList-inl.h +341 -0
  99. package/external/folly/folly/ConcurrentSkipList.h +824 -0
  100. package/external/folly/folly/ConstexprMath.h +978 -0
  101. package/external/folly/folly/ConstructorCallbackList.h +158 -0
  102. package/external/folly/folly/Conv.cpp +1205 -0
  103. package/external/folly/folly/Conv.h +2026 -0
  104. package/external/folly/folly/CppAttributes.h +170 -0
  105. package/external/folly/folly/CpuId.h +297 -0
  106. package/external/folly/folly/DefaultKeepAliveExecutor.h +172 -0
  107. package/external/folly/folly/Demangle.cpp +255 -0
  108. package/external/folly/folly/Demangle.h +73 -0
  109. package/external/folly/folly/DiscriminatedPtr.h +236 -0
  110. package/external/folly/folly/DynamicConverter.h +17 -0
  111. package/external/folly/folly/Exception.h +150 -0
  112. package/external/folly/folly/ExceptionString.cpp +51 -0
  113. package/external/folly/folly/ExceptionString.h +33 -0
  114. package/external/folly/folly/ExceptionWrapper-inl.h +264 -0
  115. package/external/folly/folly/ExceptionWrapper.cpp +37 -0
  116. package/external/folly/folly/ExceptionWrapper.h +377 -0
  117. package/external/folly/folly/Executor.cpp +111 -0
  118. package/external/folly/folly/Executor.h +351 -0
  119. package/external/folly/folly/Expected.h +1725 -0
  120. package/external/folly/folly/FBString.h +2888 -0
  121. package/external/folly/folly/FBVector.h +17 -0
  122. package/external/folly/folly/File.cpp +180 -0
  123. package/external/folly/folly/File.h +177 -0
  124. package/external/folly/folly/FileUtil.cpp +378 -0
  125. package/external/folly/folly/FileUtil.h +332 -0
  126. package/external/folly/folly/Fingerprint.cpp +135 -0
  127. package/external/folly/folly/Fingerprint.h +289 -0
  128. package/external/folly/folly/FixedString.h +2965 -0
  129. package/external/folly/folly/FollyMemcpy.cpp +30 -0
  130. package/external/folly/folly/FollyMemcpy.h +23 -0
  131. package/external/folly/folly/FollyMemset.cpp +29 -0
  132. package/external/folly/folly/FollyMemset.h +25 -0
  133. package/external/folly/folly/Format-inl.h +1152 -0
  134. package/external/folly/folly/Format.cpp +429 -0
  135. package/external/folly/folly/Format.h +463 -0
  136. package/external/folly/folly/FormatArg.h +285 -0
  137. package/external/folly/folly/FormatTraits.h +65 -0
  138. package/external/folly/folly/Function.h +1159 -0
  139. package/external/folly/folly/GLog.h +85 -0
  140. package/external/folly/folly/GroupVarint.cpp +153 -0
  141. package/external/folly/folly/GroupVarint.h +630 -0
  142. package/external/folly/folly/Hash.h +20 -0
  143. package/external/folly/folly/IPAddress.cpp +490 -0
  144. package/external/folly/folly/IPAddress.h +667 -0
  145. package/external/folly/folly/IPAddressException.h +82 -0
  146. package/external/folly/folly/IPAddressV4.cpp +305 -0
  147. package/external/folly/folly/IPAddressV4.h +495 -0
  148. package/external/folly/folly/IPAddressV6.cpp +541 -0
  149. package/external/folly/folly/IPAddressV6.h +627 -0
  150. package/external/folly/folly/Indestructible.h +164 -0
  151. package/external/folly/folly/IndexedMemPool.h +550 -0
  152. package/external/folly/folly/IntrusiveList.h +17 -0
  153. package/external/folly/folly/Lazy.h +142 -0
  154. package/external/folly/folly/Likely.h +76 -0
  155. package/external/folly/folly/MPMCPipeline.h +280 -0
  156. package/external/folly/folly/MPMCQueue.h +1556 -0
  157. package/external/folly/folly/MacAddress.cpp +188 -0
  158. package/external/folly/folly/MacAddress.h +260 -0
  159. package/external/folly/folly/MapUtil.h +17 -0
  160. package/external/folly/folly/Math.h +258 -0
  161. package/external/folly/folly/MaybeManagedPtr.h +120 -0
  162. package/external/folly/folly/Memory.h +900 -0
  163. package/external/folly/folly/MicroLock.cpp +76 -0
  164. package/external/folly/folly/MicroLock.h +354 -0
  165. package/external/folly/folly/MicroSpinLock.h +17 -0
  166. package/external/folly/folly/MoveWrapper.h +76 -0
  167. package/external/folly/folly/ObserverContainer.h +1026 -0
  168. package/external/folly/folly/Optional.h +743 -0
  169. package/external/folly/folly/Overload.h +325 -0
  170. package/external/folly/folly/PackedSyncPtr.h +147 -0
  171. package/external/folly/folly/Padded.h +464 -0
  172. package/external/folly/folly/Poly-inl.h +230 -0
  173. package/external/folly/folly/Poly.h +1095 -0
  174. package/external/folly/folly/PolyException.h +43 -0
  175. package/external/folly/folly/Portability.h +644 -0
  176. package/external/folly/folly/Preprocessor.h +236 -0
  177. package/external/folly/folly/ProducerConsumerQueue.h +182 -0
  178. package/external/folly/folly/RWSpinLock.h +17 -0
  179. package/external/folly/folly/Random-inl.h +86 -0
  180. package/external/folly/folly/Random.cpp +184 -0
  181. package/external/folly/folly/Random.h +434 -0
  182. package/external/folly/folly/Range.h +1772 -0
  183. package/external/folly/folly/Replaceable.h +636 -0
  184. package/external/folly/folly/ScopeGuard.cpp +29 -0
  185. package/external/folly/folly/ScopeGuard.h +420 -0
  186. package/external/folly/folly/SharedMutex.cpp +81 -0
  187. package/external/folly/folly/SharedMutex.h +1751 -0
  188. package/external/folly/folly/Singleton-inl.h +332 -0
  189. package/external/folly/folly/Singleton.cpp +512 -0
  190. package/external/folly/folly/Singleton.h +891 -0
  191. package/external/folly/folly/SingletonThreadLocal.cpp +53 -0
  192. package/external/folly/folly/SingletonThreadLocal.h +263 -0
  193. package/external/folly/folly/SocketAddress.cpp +786 -0
  194. package/external/folly/folly/SocketAddress.h +768 -0
  195. package/external/folly/folly/SpinLock.h +55 -0
  196. package/external/folly/folly/String-inl.h +668 -0
  197. package/external/folly/folly/String.cpp +777 -0
  198. package/external/folly/folly/String.h +767 -0
  199. package/external/folly/folly/Subprocess.cpp +1142 -0
  200. package/external/folly/folly/Subprocess.h +1055 -0
  201. package/external/folly/folly/Synchronized.h +1833 -0
  202. package/external/folly/folly/SynchronizedPtr.h +106 -0
  203. package/external/folly/folly/ThreadCachedInt.h +175 -0
  204. package/external/folly/folly/ThreadLocal.h +478 -0
  205. package/external/folly/folly/TimeoutQueue.cpp +78 -0
  206. package/external/folly/folly/TimeoutQueue.h +123 -0
  207. package/external/folly/folly/TokenBucket.h +673 -0
  208. package/external/folly/folly/Traits.h +1442 -0
  209. package/external/folly/folly/Try-inl.h +372 -0
  210. package/external/folly/folly/Try.cpp +23 -0
  211. package/external/folly/folly/Try.h +728 -0
  212. package/external/folly/folly/UTF8String.h +56 -0
  213. package/external/folly/folly/Unicode.cpp +201 -0
  214. package/external/folly/folly/Unicode.h +94 -0
  215. package/external/folly/folly/Unit.h +65 -0
  216. package/external/folly/folly/Uri-inl.h +101 -0
  217. package/external/folly/folly/Uri.cpp +190 -0
  218. package/external/folly/folly/Uri.h +142 -0
  219. package/external/folly/folly/Utility.h +932 -0
  220. package/external/folly/folly/VERSION +1 -0
  221. package/external/folly/folly/Varint.h +230 -0
  222. package/external/folly/folly/VirtualExecutor.h +17 -0
  223. package/external/folly/folly/algorithm/simd/BUCK +47 -0
  224. package/external/folly/folly/algorithm/simd/Contains.cpp +42 -0
  225. package/external/folly/folly/algorithm/simd/Contains.h +116 -0
  226. package/external/folly/folly/algorithm/simd/FindFixed.h +301 -0
  227. package/external/folly/folly/algorithm/simd/Ignore.h +52 -0
  228. package/external/folly/folly/algorithm/simd/Movemask.h +207 -0
  229. package/external/folly/folly/algorithm/simd/detail/BUCK +70 -0
  230. package/external/folly/folly/algorithm/simd/detail/ContainsImpl.h +91 -0
  231. package/external/folly/folly/algorithm/simd/detail/SimdAnyOf.h +83 -0
  232. package/external/folly/folly/algorithm/simd/detail/SimdForEach.h +209 -0
  233. package/external/folly/folly/algorithm/simd/detail/SimdPlatform.h +445 -0
  234. package/external/folly/folly/algorithm/simd/detail/Traits.h +125 -0
  235. package/external/folly/folly/algorithm/simd/detail/UnrollUtils.h +126 -0
  236. package/external/folly/folly/base64.h +264 -0
  237. package/external/folly/folly/chrono/BUCK +29 -0
  238. package/external/folly/folly/chrono/Clock.h +65 -0
  239. package/external/folly/folly/chrono/Conv.h +712 -0
  240. package/external/folly/folly/chrono/Hardware.h +155 -0
  241. package/external/folly/folly/chrono/test/BUCK +26 -0
  242. package/external/folly/folly/chrono/test/ClockTest.cpp +68 -0
  243. package/external/folly/folly/chrono/test/ConvTest.cpp +652 -0
  244. package/external/folly/folly/concurrency/AtomicSharedPtr.h +387 -0
  245. package/external/folly/folly/concurrency/BUCK +170 -0
  246. package/external/folly/folly/concurrency/CacheLocality.cpp +633 -0
  247. package/external/folly/folly/concurrency/CacheLocality.h +460 -0
  248. package/external/folly/folly/concurrency/ConcurrentHashMap.h +822 -0
  249. package/external/folly/folly/concurrency/CoreCachedSharedPtr.h +232 -0
  250. package/external/folly/folly/concurrency/DeadlockDetector.cpp +27 -0
  251. package/external/folly/folly/concurrency/DeadlockDetector.h +44 -0
  252. package/external/folly/folly/concurrency/DynamicBoundedQueue.h +751 -0
  253. package/external/folly/folly/concurrency/PriorityUnboundedQueueSet.h +207 -0
  254. package/external/folly/folly/concurrency/ProcessLocalUniqueId.cpp +46 -0
  255. package/external/folly/folly/concurrency/ProcessLocalUniqueId.h +38 -0
  256. package/external/folly/folly/concurrency/SingletonRelaxedCounter.h +325 -0
  257. package/external/folly/folly/concurrency/ThreadCachedSynchronized.h +227 -0
  258. package/external/folly/folly/concurrency/UnboundedQueue.h +891 -0
  259. package/external/folly/folly/concurrency/container/BUCK +77 -0
  260. package/external/folly/folly/concurrency/container/FlatCombiningPriorityQueue.h +426 -0
  261. package/external/folly/folly/concurrency/container/LockFreeRingBuffer.h +306 -0
  262. package/external/folly/folly/concurrency/container/RelaxedConcurrentPriorityQueue.h +1212 -0
  263. package/external/folly/folly/concurrency/container/SingleWriterFixedHashMap.h +322 -0
  264. package/external/folly/folly/concurrency/container/atomic_grow_array.h +564 -0
  265. package/external/folly/folly/concurrency/container/test/BUCK +75 -0
  266. package/external/folly/folly/concurrency/container/test/FlatCombiningPriorityQueueTest.cpp +570 -0
  267. package/external/folly/folly/concurrency/container/test/LockFreeRingBufferTest.cpp +276 -0
  268. package/external/folly/folly/concurrency/container/test/RelaxedConcurrentPriorityQueueTest.cpp +1570 -0
  269. package/external/folly/folly/concurrency/container/test/SingleWriterFixedHashMapTest.cpp +401 -0
  270. package/external/folly/folly/concurrency/container/test/atomic_grow_array_test.cpp +187 -0
  271. package/external/folly/folly/concurrency/detail/AtomicSharedPtr-detail.h +212 -0
  272. package/external/folly/folly/concurrency/detail/ConcurrentHashMap-detail.h +1911 -0
  273. package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.cpp +43 -0
  274. package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.h +190 -0
  275. package/external/folly/folly/concurrency/memory/BUCK +53 -0
  276. package/external/folly/folly/concurrency/memory/PrimaryPtr.h +338 -0
  277. package/external/folly/folly/concurrency/memory/ReadMostlySharedPtr.h +511 -0
  278. package/external/folly/folly/concurrency/memory/TLRefCount.h +228 -0
  279. package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrBenchmark.cpp +56 -0
  280. package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrTest.cpp +454 -0
  281. package/external/folly/folly/concurrency/memory/test/BUCK +95 -0
  282. package/external/folly/folly/concurrency/memory/test/PrimaryPtrTest.cpp +303 -0
  283. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrBenchmark.cpp +138 -0
  284. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrStressTest.cpp +75 -0
  285. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrTest.cpp +378 -0
  286. package/external/folly/folly/concurrency/memory/test/RefCountBenchmark.cpp +90 -0
  287. package/external/folly/folly/concurrency/memory/test/RefCountTest.cpp +168 -0
  288. package/external/folly/folly/concurrency/test/AtomicSharedPtrCounted.h +156 -0
  289. package/external/folly/folly/concurrency/test/AtomicSharedPtrPerformance.cpp +255 -0
  290. package/external/folly/folly/concurrency/test/AtomicSharedPtrTest.cpp +257 -0
  291. package/external/folly/folly/concurrency/test/BUCK +229 -0
  292. package/external/folly/folly/concurrency/test/CacheLocalityBenchmark.cpp +392 -0
  293. package/external/folly/folly/concurrency/test/CacheLocalityTest.cpp +1229 -0
  294. package/external/folly/folly/concurrency/test/ConcurrentHashMapBench.cpp +260 -0
  295. package/external/folly/folly/concurrency/test/ConcurrentHashMapTest.cpp +1242 -0
  296. package/external/folly/folly/concurrency/test/CoreCachedSharedPtrTest.cpp +408 -0
  297. package/external/folly/folly/concurrency/test/DynamicBoundedQueueTest.cpp +984 -0
  298. package/external/folly/folly/concurrency/test/PriorityUnboundedQueueSetTest.cpp +73 -0
  299. package/external/folly/folly/concurrency/test/ProcessLocalUniqueIdTest.cpp +66 -0
  300. package/external/folly/folly/concurrency/test/SingletonRelaxedCounterBench.cpp +101 -0
  301. package/external/folly/folly/concurrency/test/SingletonRelaxedCounterTest.cpp +185 -0
  302. package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedBench.cpp +76 -0
  303. package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedTest.cpp +93 -0
  304. package/external/folly/folly/concurrency/test/UnboundedQueueTest.cpp +1302 -0
  305. package/external/folly/folly/container/Access.h +57 -0
  306. package/external/folly/folly/container/Array.h +87 -0
  307. package/external/folly/folly/container/BUCK +353 -0
  308. package/external/folly/folly/container/BitIterator.h +203 -0
  309. package/external/folly/folly/container/Enumerate.h +162 -0
  310. package/external/folly/folly/container/EvictingCacheMap.h +730 -0
  311. package/external/folly/folly/container/F14.md +300 -0
  312. package/external/folly/folly/container/F14Map-fwd.h +113 -0
  313. package/external/folly/folly/container/F14Map.h +2108 -0
  314. package/external/folly/folly/container/F14Set-fwd.h +95 -0
  315. package/external/folly/folly/container/F14Set.h +1603 -0
  316. package/external/folly/folly/container/FBVector.h +1711 -0
  317. package/external/folly/folly/container/Foreach-inl.h +316 -0
  318. package/external/folly/folly/container/Foreach.h +209 -0
  319. package/external/folly/folly/container/HeterogeneousAccess-fwd.h +33 -0
  320. package/external/folly/folly/container/HeterogeneousAccess.h +171 -0
  321. package/external/folly/folly/container/IntrusiveHeap.h +268 -0
  322. package/external/folly/folly/container/IntrusiveList.h +131 -0
  323. package/external/folly/folly/container/Iterator.h +843 -0
  324. package/external/folly/folly/container/MapUtil.h +376 -0
  325. package/external/folly/folly/container/Merge.h +90 -0
  326. package/external/folly/folly/container/RegexMatchCache.cpp +521 -0
  327. package/external/folly/folly/container/RegexMatchCache.h +699 -0
  328. package/external/folly/folly/container/Reserve.h +109 -0
  329. package/external/folly/folly/container/SparseByteSet.h +123 -0
  330. package/external/folly/folly/container/View.h +81 -0
  331. package/external/folly/folly/container/WeightedEvictingCacheMap.h +651 -0
  332. package/external/folly/folly/container/detail/BUCK +115 -0
  333. package/external/folly/folly/container/detail/BitIteratorDetail.h +87 -0
  334. package/external/folly/folly/container/detail/F14Defaults.h +34 -0
  335. package/external/folly/folly/container/detail/F14IntrinsicsAvailability.h +67 -0
  336. package/external/folly/folly/container/detail/F14MapFallback.h +717 -0
  337. package/external/folly/folly/container/detail/F14Mask.h +235 -0
  338. package/external/folly/folly/container/detail/F14Policy.h +1523 -0
  339. package/external/folly/folly/container/detail/F14SetFallback.h +528 -0
  340. package/external/folly/folly/container/detail/F14Table.cpp +71 -0
  341. package/external/folly/folly/container/detail/F14Table.h +2680 -0
  342. package/external/folly/folly/container/detail/Util.h +303 -0
  343. package/external/folly/folly/container/detail/tape_detail.h +135 -0
  344. package/external/folly/folly/container/detail/test/BUCK +14 -0
  345. package/external/folly/folly/container/detail/test/F14DetailTest.cpp +47 -0
  346. package/external/folly/folly/container/heap_vector_types.h +1683 -0
  347. package/external/folly/folly/container/range_traits.h +81 -0
  348. package/external/folly/folly/container/small_vector.h +1476 -0
  349. package/external/folly/folly/container/sorted_vector_types.h +1652 -0
  350. package/external/folly/folly/container/span.h +408 -0
  351. package/external/folly/folly/container/tape.h +608 -0
  352. package/external/folly/folly/container/test/.clang-tidy +12 -0
  353. package/external/folly/folly/container/test/AccessTest.cpp +138 -0
  354. package/external/folly/folly/container/test/ArrayTest.cpp +84 -0
  355. package/external/folly/folly/container/test/BUCK +568 -0
  356. package/external/folly/folly/container/test/BitIteratorBench.cpp +112 -0
  357. package/external/folly/folly/container/test/BitIteratorTest.cpp +109 -0
  358. package/external/folly/folly/container/test/EnumerateTest.cpp +294 -0
  359. package/external/folly/folly/container/test/EvictingCacheMapBench.cpp +80 -0
  360. package/external/folly/folly/container/test/EvictingCacheMapTest.cpp +842 -0
  361. package/external/folly/folly/container/test/F14AsanSupportTest.cpp +143 -0
  362. package/external/folly/folly/container/test/F14FwdTest.cpp +37 -0
  363. package/external/folly/folly/container/test/F14InterprocessTest.cpp +404 -0
  364. package/external/folly/folly/container/test/F14MapTest.cpp +2543 -0
  365. package/external/folly/folly/container/test/F14PolicyTest.cpp +49 -0
  366. package/external/folly/folly/container/test/F14SetTest.cpp +1738 -0
  367. package/external/folly/folly/container/test/F14SmallOverheads.cpp +215 -0
  368. package/external/folly/folly/container/test/F14TestUtil.h +117 -0
  369. package/external/folly/folly/container/test/FBVectorBenchmark.cpp +380 -0
  370. package/external/folly/folly/container/test/FBVectorBenchmarks.cpp.h +100 -0
  371. package/external/folly/folly/container/test/FBVectorTest.cpp +326 -0
  372. package/external/folly/folly/container/test/FBVectorTests.cpp.h +304 -0
  373. package/external/folly/folly/container/test/ForeachBenchmark.cpp +388 -0
  374. package/external/folly/folly/container/test/ForeachTest.cpp +338 -0
  375. package/external/folly/folly/container/test/HashMapsBench.cpp +458 -0
  376. package/external/folly/folly/container/test/HeterogeneousAccessTest.cpp +242 -0
  377. package/external/folly/folly/container/test/IntrusiveHeapTest.cpp +262 -0
  378. package/external/folly/folly/container/test/IteratorTest.cpp +989 -0
  379. package/external/folly/folly/container/test/MapUtilTest.cpp +365 -0
  380. package/external/folly/folly/container/test/MergeTest.cpp +66 -0
  381. package/external/folly/folly/container/test/RegexMatchCacheTest.cpp +634 -0
  382. package/external/folly/folly/container/test/ReserveTest.cpp +173 -0
  383. package/external/folly/folly/container/test/SparseByteSetBenchmark.cpp +153 -0
  384. package/external/folly/folly/container/test/SparseByteSetTest.cpp +117 -0
  385. package/external/folly/folly/container/test/TrackingTypes.h +584 -0
  386. package/external/folly/folly/container/test/UtilTest.cpp +609 -0
  387. package/external/folly/folly/container/test/WeightedEvictingCacheMapTest.cpp +800 -0
  388. package/external/folly/folly/container/test/heap_vector_types_test.cpp +1774 -0
  389. package/external/folly/folly/container/test/range_traits_test.cpp +59 -0
  390. package/external/folly/folly/container/test/small_vector_test.cpp +1571 -0
  391. package/external/folly/folly/container/test/sorted_vector_test.cpp +1589 -0
  392. package/external/folly/folly/container/test/span_test.cpp +520 -0
  393. package/external/folly/folly/container/test/tape_bench.cpp +200 -0
  394. package/external/folly/folly/container/test/tape_test.cpp +590 -0
  395. package/external/folly/folly/defs.bzl +238 -0
  396. package/external/folly/folly/detail/AsyncTrace.cpp +36 -0
  397. package/external/folly/folly/detail/AsyncTrace.h +44 -0
  398. package/external/folly/folly/detail/AtomicHashUtils.h +42 -0
  399. package/external/folly/folly/detail/AtomicUnorderedMapUtils.h +80 -0
  400. package/external/folly/folly/detail/BUCK +406 -0
  401. package/external/folly/folly/detail/DiscriminatedPtrDetail.h +172 -0
  402. package/external/folly/folly/detail/FileUtilDetail.cpp +63 -0
  403. package/external/folly/folly/detail/FileUtilDetail.h +85 -0
  404. package/external/folly/folly/detail/FileUtilVectorDetail.h +81 -0
  405. package/external/folly/folly/detail/FingerprintPolynomial.h +132 -0
  406. package/external/folly/folly/detail/Futex-inl.h +123 -0
  407. package/external/folly/folly/detail/Futex.cpp +273 -0
  408. package/external/folly/folly/detail/Futex.h +109 -0
  409. package/external/folly/folly/detail/GroupVarintDetail.h +101 -0
  410. package/external/folly/folly/detail/IPAddress.cpp +37 -0
  411. package/external/folly/folly/detail/IPAddress.h +57 -0
  412. package/external/folly/folly/detail/IPAddressSource.h +278 -0
  413. package/external/folly/folly/detail/Iterators.h +156 -0
  414. package/external/folly/folly/detail/MPMCPipelineDetail.h +122 -0
  415. package/external/folly/folly/detail/MemoryIdler.cpp +233 -0
  416. package/external/folly/folly/detail/MemoryIdler.h +216 -0
  417. package/external/folly/folly/detail/PerfScoped.cpp +112 -0
  418. package/external/folly/folly/detail/PerfScoped.h +70 -0
  419. package/external/folly/folly/detail/PolyDetail.h +921 -0
  420. package/external/folly/folly/detail/RangeCommon.cpp +55 -0
  421. package/external/folly/folly/detail/RangeCommon.h +93 -0
  422. package/external/folly/folly/detail/RangeSse42.cpp +198 -0
  423. package/external/folly/folly/detail/RangeSse42.h +30 -0
  424. package/external/folly/folly/detail/SimpleSimdStringUtils.cpp +31 -0
  425. package/external/folly/folly/detail/SimpleSimdStringUtils.h +27 -0
  426. package/external/folly/folly/detail/SimpleSimdStringUtilsImpl.h +63 -0
  427. package/external/folly/folly/detail/Singleton.h +34 -0
  428. package/external/folly/folly/detail/SlowFingerprint.h +90 -0
  429. package/external/folly/folly/detail/SocketFastOpen.cpp +175 -0
  430. package/external/folly/folly/detail/SocketFastOpen.h +89 -0
  431. package/external/folly/folly/detail/SplitStringSimd.cpp +84 -0
  432. package/external/folly/folly/detail/SplitStringSimd.h +151 -0
  433. package/external/folly/folly/detail/SplitStringSimdImpl.h +149 -0
  434. package/external/folly/folly/detail/Sse.cpp +35 -0
  435. package/external/folly/folly/detail/Sse.h +45 -0
  436. package/external/folly/folly/detail/StaticSingletonManager.cpp +119 -0
  437. package/external/folly/folly/detail/StaticSingletonManager.h +298 -0
  438. package/external/folly/folly/detail/ThreadLocalDetail.cpp +492 -0
  439. package/external/folly/folly/detail/ThreadLocalDetail.h +800 -0
  440. package/external/folly/folly/detail/TrapOnAvx512.cpp +41 -0
  441. package/external/folly/folly/detail/TrapOnAvx512.h +21 -0
  442. package/external/folly/folly/detail/TurnSequencer.h +295 -0
  443. package/external/folly/folly/detail/TypeList.h +551 -0
  444. package/external/folly/folly/detail/UniqueInstance.cpp +136 -0
  445. package/external/folly/folly/detail/UniqueInstance.h +68 -0
  446. package/external/folly/folly/detail/base64_detail/BUCK +102 -0
  447. package/external/folly/folly/detail/base64_detail/Base64Api.cpp +40 -0
  448. package/external/folly/folly/detail/base64_detail/Base64Api.h +101 -0
  449. package/external/folly/folly/detail/base64_detail/Base64Common.h +80 -0
  450. package/external/folly/folly/detail/base64_detail/Base64Constants.h +79 -0
  451. package/external/folly/folly/detail/base64_detail/Base64HiddenConstants.h +129 -0
  452. package/external/folly/folly/detail/base64_detail/Base64SWAR.cpp +161 -0
  453. package/external/folly/folly/detail/base64_detail/Base64SWAR.h +32 -0
  454. package/external/folly/folly/detail/base64_detail/Base64Scalar.h +262 -0
  455. package/external/folly/folly/detail/base64_detail/Base64Simd.h +102 -0
  456. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.cpp +42 -0
  457. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.h +33 -0
  458. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2_Platform.h +167 -0
  459. package/external/folly/folly/detail/base64_detail/README.md +392 -0
  460. package/external/folly/folly/detail/base64_detail/tests/BUCK +36 -0
  461. package/external/folly/folly/detail/base64_detail/tests/Base64AgainstScalarTest.cpp +141 -0
  462. package/external/folly/folly/detail/base64_detail/tests/Base64PlatformTest.cpp +273 -0
  463. package/external/folly/folly/detail/base64_detail/tests/Base64SpecialCasesTest.cpp +555 -0
  464. package/external/folly/folly/detail/test/AsyncTraceTest.cpp +43 -0
  465. package/external/folly/folly/detail/test/BUCK +118 -0
  466. package/external/folly/folly/detail/test/FileUtilDetailTest.cpp +56 -0
  467. package/external/folly/folly/detail/test/PerfScopedTest.cpp +107 -0
  468. package/external/folly/folly/detail/test/SimpleSimdStringUtilsTest.cpp +92 -0
  469. package/external/folly/folly/detail/test/SplitStringSimdTest.cpp +242 -0
  470. package/external/folly/folly/detail/test/StaticSingletonManagerTest.cpp +121 -0
  471. package/external/folly/folly/detail/test/ThreadLocalBenchmark.cpp +116 -0
  472. package/external/folly/folly/detail/test/ThreadLocalDetailTest.cpp +194 -0
  473. package/external/folly/folly/detail/test/TrapOnAvx512TestNegative.cpp +29 -0
  474. package/external/folly/folly/detail/test/UniqueInstanceTest.cpp +60 -0
  475. package/external/folly/folly/detail/thread_local_globals.cpp +69 -0
  476. package/external/folly/folly/detail/thread_local_globals.h +36 -0
  477. package/external/folly/folly/docs/AtomicHashMap.md +134 -0
  478. package/external/folly/folly/docs/Benchmark.md +310 -0
  479. package/external/folly/folly/docs/Conv.md +291 -0
  480. package/external/folly/folly/docs/Dynamic.md +220 -0
  481. package/external/folly/folly/docs/DynamicConverter.md +71 -0
  482. package/external/folly/folly/docs/Executors.md +63 -0
  483. package/external/folly/folly/docs/FBString.md +46 -0
  484. package/external/folly/folly/docs/FBVector.md +200 -0
  485. package/external/folly/folly/docs/Fbvector--graphical_solutions.png +0 -0
  486. package/external/folly/folly/docs/Format.md +177 -0
  487. package/external/folly/folly/docs/Function.md +92 -0
  488. package/external/folly/folly/docs/Futures.md +263 -0
  489. package/external/folly/folly/docs/GroupVarint.md +46 -0
  490. package/external/folly/folly/docs/Histogram.md +104 -0
  491. package/external/folly/folly/docs/MapUtils.md +80 -0
  492. package/external/folly/folly/docs/Overview.md +263 -0
  493. package/external/folly/folly/docs/PackedSyncPtr.md +77 -0
  494. package/external/folly/folly/docs/Poly.md +500 -0
  495. package/external/folly/folly/docs/ProducerConsumerQueue.md +82 -0
  496. package/external/folly/folly/docs/Rcu.md +218 -0
  497. package/external/folly/folly/docs/SmallLocks.md +24 -0
  498. package/external/folly/folly/docs/Synchronized.md +793 -0
  499. package/external/folly/folly/docs/ThreadCachedInt.md +98 -0
  500. package/external/folly/folly/docs/ThreadLocal.md +105 -0
  501. package/external/folly/folly/docs/Traits.md +161 -0
  502. package/external/folly/folly/docs/small_vector.md +64 -0
  503. package/external/folly/folly/docs/style.css +23 -0
  504. package/external/folly/folly/dynamic-inl.h +17 -0
  505. package/external/folly/folly/dynamic.h +17 -0
  506. package/external/folly/folly/folly_extended_library.bzl +28 -0
  507. package/external/folly/folly/functional/ApplyTuple.h +204 -0
  508. package/external/folly/folly/functional/BUCK +57 -0
  509. package/external/folly/folly/functional/Invoke.h +880 -0
  510. package/external/folly/folly/functional/Partial.h +130 -0
  511. package/external/folly/folly/functional/protocol.h +203 -0
  512. package/external/folly/folly/functional/test/ApplyTupleTest.cpp +549 -0
  513. package/external/folly/folly/functional/test/BUCK +57 -0
  514. package/external/folly/folly/functional/test/InvokeTest.cpp +483 -0
  515. package/external/folly/folly/functional/test/PartialTest.cpp +141 -0
  516. package/external/folly/folly/functional/test/protocol_test.cpp +177 -0
  517. package/external/folly/folly/functional/test/traits_test.cpp +551 -0
  518. package/external/folly/folly/functional/traits.h +675 -0
  519. package/external/folly/folly/hash/BUCK +86 -0
  520. package/external/folly/folly/hash/Checksum.cpp +275 -0
  521. package/external/folly/folly/hash/Checksum.h +94 -0
  522. package/external/folly/folly/hash/FarmHash.h +46 -0
  523. package/external/folly/folly/hash/Hash.h +1045 -0
  524. package/external/folly/folly/hash/MurmurHash.h +86 -0
  525. package/external/folly/folly/hash/SpookyHashV1.cpp +391 -0
  526. package/external/folly/folly/hash/SpookyHashV1.h +307 -0
  527. package/external/folly/folly/hash/SpookyHashV2.cpp +392 -0
  528. package/external/folly/folly/hash/SpookyHashV2.h +339 -0
  529. package/external/folly/folly/hash/detail/BUCK +26 -0
  530. package/external/folly/folly/hash/detail/ChecksumDetail.cpp +296 -0
  531. package/external/folly/folly/hash/detail/ChecksumDetail.h +137 -0
  532. package/external/folly/folly/hash/detail/Crc32CombineDetail.cpp +191 -0
  533. package/external/folly/folly/hash/detail/Crc32cDetail.cpp +303 -0
  534. package/external/folly/folly/hash/test/BUCK +132 -0
  535. package/external/folly/folly/hash/test/ChecksumBenchmark.cpp +91 -0
  536. package/external/folly/folly/hash/test/ChecksumTest.cpp +587 -0
  537. package/external/folly/folly/hash/test/FarmHashTest.cpp +41 -0
  538. package/external/folly/folly/hash/test/HashBenchmark.cpp +238 -0
  539. package/external/folly/folly/hash/test/HashTest.cpp +997 -0
  540. package/external/folly/folly/hash/test/MurmurHashTest.cpp +76 -0
  541. package/external/folly/folly/hash/test/SpookyHashV1Test.cpp +559 -0
  542. package/external/folly/folly/hash/test/SpookyHashV2Test.cpp +549 -0
  543. package/external/folly/folly/hash/test/traits_test.cpp +69 -0
  544. package/external/folly/folly/hash/traits.h +115 -0
  545. package/external/folly/folly/json/BUCK +155 -0
  546. package/external/folly/folly/json/DynamicConverter.h +464 -0
  547. package/external/folly/folly/json/DynamicParser-inl.h +316 -0
  548. package/external/folly/folly/json/DynamicParser.cpp +198 -0
  549. package/external/folly/folly/json/DynamicParser.h +394 -0
  550. package/external/folly/folly/json/JSONSchema.cpp +1030 -0
  551. package/external/folly/folly/json/JSONSchema.h +73 -0
  552. package/external/folly/folly/json/JsonMockUtil.h +73 -0
  553. package/external/folly/folly/json/JsonTestUtil.cpp +167 -0
  554. package/external/folly/folly/json/JsonTestUtil.h +88 -0
  555. package/external/folly/folly/json/bser/BUCK +24 -0
  556. package/external/folly/folly/json/bser/Bser.h +107 -0
  557. package/external/folly/folly/json/bser/Dump.cpp +253 -0
  558. package/external/folly/folly/json/bser/Load.cpp +246 -0
  559. package/external/folly/folly/json/bser/test/BUCK +14 -0
  560. package/external/folly/folly/json/bser/test/BserTest.cpp +149 -0
  561. package/external/folly/folly/json/dynamic-inl.h +1438 -0
  562. package/external/folly/folly/json/dynamic.cpp +552 -0
  563. package/external/folly/folly/json/dynamic.h +1346 -0
  564. package/external/folly/folly/json/json.cpp +1118 -0
  565. package/external/folly/folly/json/json.h +238 -0
  566. package/external/folly/folly/json/json_patch.cpp +325 -0
  567. package/external/folly/folly/json/json_patch.h +126 -0
  568. package/external/folly/folly/json/json_pointer.cpp +114 -0
  569. package/external/folly/folly/json/json_pointer.h +87 -0
  570. package/external/folly/folly/json/test/BUCK +147 -0
  571. package/external/folly/folly/json/test/DynamicBenchmark.cpp +146 -0
  572. package/external/folly/folly/json/test/DynamicConverterTest.cpp +518 -0
  573. package/external/folly/folly/json/test/DynamicOtherTest.cpp +344 -0
  574. package/external/folly/folly/json/test/DynamicParserTest.cpp +443 -0
  575. package/external/folly/folly/json/test/DynamicTest.cpp +1647 -0
  576. package/external/folly/folly/json/test/JSONSchemaTest.cpp +450 -0
  577. package/external/folly/folly/json/test/JsonBenchmark.cpp +264 -0
  578. package/external/folly/folly/json/test/JsonOtherTest.cpp +51 -0
  579. package/external/folly/folly/json/test/JsonTest.cpp +1153 -0
  580. package/external/folly/folly/json/test/JsonTestUtilTest.cpp +97 -0
  581. package/external/folly/folly/json/test/json_patch_test.cpp +361 -0
  582. package/external/folly/folly/json/test/json_pointer_test.cpp +58 -0
  583. package/external/folly/folly/json/tool/BUCK +13 -0
  584. package/external/folly/folly/json/tool/JSONSchemaTester.cpp +58 -0
  585. package/external/folly/folly/json.h +17 -0
  586. package/external/folly/folly/json_patch.h +17 -0
  587. package/external/folly/folly/json_pointer.h +17 -0
  588. package/external/folly/folly/lang/Access.h +29 -0
  589. package/external/folly/folly/lang/Align.h +240 -0
  590. package/external/folly/folly/lang/Aligned.h +92 -0
  591. package/external/folly/folly/lang/Assume.h +82 -0
  592. package/external/folly/folly/lang/BUCK +287 -0
  593. package/external/folly/folly/lang/Badge.h +108 -0
  594. package/external/folly/folly/lang/Bits.h +570 -0
  595. package/external/folly/folly/lang/BitsClass.h +312 -0
  596. package/external/folly/folly/lang/Builtin.h +74 -0
  597. package/external/folly/folly/lang/CArray.h +34 -0
  598. package/external/folly/folly/lang/CString.cpp +86 -0
  599. package/external/folly/folly/lang/CString.h +55 -0
  600. package/external/folly/folly/lang/Cast.h +51 -0
  601. package/external/folly/folly/lang/CheckedMath.h +253 -0
  602. package/external/folly/folly/lang/CustomizationPoint.h +58 -0
  603. package/external/folly/folly/lang/Exception.cpp +822 -0
  604. package/external/folly/folly/lang/Exception.h +716 -0
  605. package/external/folly/folly/lang/Extern.h +55 -0
  606. package/external/folly/folly/lang/Hint-inl.h +144 -0
  607. package/external/folly/folly/lang/Hint.h +238 -0
  608. package/external/folly/folly/lang/Keep.h +98 -0
  609. package/external/folly/folly/lang/New.h +124 -0
  610. package/external/folly/folly/lang/Ordering.h +140 -0
  611. package/external/folly/folly/lang/Pretty.h +159 -0
  612. package/external/folly/folly/lang/PropagateConst.h +413 -0
  613. package/external/folly/folly/lang/RValueReferenceWrapper.h +152 -0
  614. package/external/folly/folly/lang/SafeAssert.cpp +589 -0
  615. package/external/folly/folly/lang/SafeAssert.h +188 -0
  616. package/external/folly/folly/lang/StaticConst.h +33 -0
  617. package/external/folly/folly/lang/Thunk.h +100 -0
  618. package/external/folly/folly/lang/ToAscii.cpp +348 -0
  619. package/external/folly/folly/lang/ToAscii.h +182 -0
  620. package/external/folly/folly/lang/TypeInfo.h +58 -0
  621. package/external/folly/folly/lang/UncaughtExceptions.cpp +17 -0
  622. package/external/folly/folly/lang/UncaughtExceptions.h +19 -0
  623. package/external/folly/folly/lang/test/AlignTest.cpp +87 -0
  624. package/external/folly/folly/lang/test/AlignedTest.cpp +130 -0
  625. package/external/folly/folly/lang/test/BUCK +258 -0
  626. package/external/folly/folly/lang/test/BadgeTest.cpp +89 -0
  627. package/external/folly/folly/lang/test/BitsBenchmark.cpp +164 -0
  628. package/external/folly/folly/lang/test/BitsClassBenchmark.cpp +122 -0
  629. package/external/folly/folly/lang/test/BitsClassTest.cpp +379 -0
  630. package/external/folly/folly/lang/test/BitsTest.cpp +577 -0
  631. package/external/folly/folly/lang/test/CStringTest.cpp +60 -0
  632. package/external/folly/folly/lang/test/CastTest.cpp +47 -0
  633. package/external/folly/folly/lang/test/CheckedMathTest.cpp +394 -0
  634. package/external/folly/folly/lang/test/ExceptionBench.cpp +427 -0
  635. package/external/folly/folly/lang/test/ExceptionTest.cpp +413 -0
  636. package/external/folly/folly/lang/test/ExternTest.cpp +39 -0
  637. package/external/folly/folly/lang/test/HintTest.cpp +100 -0
  638. package/external/folly/folly/lang/test/NewTest.cpp +38 -0
  639. package/external/folly/folly/lang/test/OrderingTest.cpp +105 -0
  640. package/external/folly/folly/lang/test/PrettyTest.cpp +44 -0
  641. package/external/folly/folly/lang/test/PropagateConstTest.cpp +356 -0
  642. package/external/folly/folly/lang/test/RValueReferenceWrapperTest.cpp +85 -0
  643. package/external/folly/folly/lang/test/SafeAssertTest.cpp +75 -0
  644. package/external/folly/folly/lang/test/ThunkTest.cpp +105 -0
  645. package/external/folly/folly/lang/test/ToAsciiBench.cpp +466 -0
  646. package/external/folly/folly/lang/test/ToAsciiTest.cpp +266 -0
  647. package/external/folly/folly/lang/test/TypeInfoTest.cpp +56 -0
  648. package/external/folly/folly/memcpy.S +292 -0
  649. package/external/folly/folly/memcpy_select_aarch64.cpp +145 -0
  650. package/external/folly/folly/memory/Arena-inl.h +83 -0
  651. package/external/folly/folly/memory/Arena.h +325 -0
  652. package/external/folly/folly/memory/BUCK +191 -0
  653. package/external/folly/folly/memory/JemallocHugePageAllocator.cpp +449 -0
  654. package/external/folly/folly/memory/JemallocHugePageAllocator.h +105 -0
  655. package/external/folly/folly/memory/JemallocHugePageAllocatorTest.cpp +341 -0
  656. package/external/folly/folly/memory/JemallocNodumpAllocator.cpp +176 -0
  657. package/external/folly/folly/memory/JemallocNodumpAllocator.h +119 -0
  658. package/external/folly/folly/memory/JemallocNodumpAllocatorTest.cpp +61 -0
  659. package/external/folly/folly/memory/MallctlHelper.cpp +37 -0
  660. package/external/folly/folly/memory/MallctlHelper.h +167 -0
  661. package/external/folly/folly/memory/Malloc.h +551 -0
  662. package/external/folly/folly/memory/MemoryResource.h +57 -0
  663. package/external/folly/folly/memory/ReentrantAllocator.cpp +162 -0
  664. package/external/folly/folly/memory/ReentrantAllocator.h +261 -0
  665. package/external/folly/folly/memory/SanitizeAddress.cpp +75 -0
  666. package/external/folly/folly/memory/SanitizeAddress.h +117 -0
  667. package/external/folly/folly/memory/SanitizeLeak.cpp +119 -0
  668. package/external/folly/folly/memory/SanitizeLeak.h +108 -0
  669. package/external/folly/folly/memory/ThreadCachedArena.cpp +53 -0
  670. package/external/folly/folly/memory/ThreadCachedArena.h +90 -0
  671. package/external/folly/folly/memory/UninitializedMemoryHacks.h +426 -0
  672. package/external/folly/folly/memory/detail/BUCK +10 -0
  673. package/external/folly/folly/memory/detail/MallocImpl.cpp +52 -0
  674. package/external/folly/folly/memory/detail/MallocImpl.h +97 -0
  675. package/external/folly/folly/memory/not_null-inl.h +522 -0
  676. package/external/folly/folly/memory/not_null.h +449 -0
  677. package/external/folly/folly/memory/test/ArenaTest.cpp +354 -0
  678. package/external/folly/folly/memory/test/BUCK +146 -0
  679. package/external/folly/folly/memory/test/MallctlHelperTest.cpp +169 -0
  680. package/external/folly/folly/memory/test/MallocBenchmark.cpp +91 -0
  681. package/external/folly/folly/memory/test/MallocTest.cpp +78 -0
  682. package/external/folly/folly/memory/test/MemoryResourceTest.cpp +31 -0
  683. package/external/folly/folly/memory/test/ReentrantAllocatorTest.cpp +144 -0
  684. package/external/folly/folly/memory/test/SanitizeAddressTest.cpp +67 -0
  685. package/external/folly/folly/memory/test/SanitizeLeakTest.cpp +139 -0
  686. package/external/folly/folly/memory/test/ThreadCachedArenaTest.cpp +276 -0
  687. package/external/folly/folly/memory/test/UninitializedMemoryHacksODR.cpp +21 -0
  688. package/external/folly/folly/memory/test/UninitializedMemoryHacksTest.cpp +327 -0
  689. package/external/folly/folly/memory/test/not_null_test.cpp +608 -0
  690. package/external/folly/folly/memset.S +245 -0
  691. package/external/folly/folly/memset_select_aarch64.cpp +72 -0
  692. package/external/folly/folly/portability/Asm.h +50 -0
  693. package/external/folly/folly/portability/Atomic.h +31 -0
  694. package/external/folly/folly/portability/BUCK +456 -0
  695. package/external/folly/folly/portability/Builtins.cpp +31 -0
  696. package/external/folly/folly/portability/Builtins.h +161 -0
  697. package/external/folly/folly/portability/Config.h +43 -0
  698. package/external/folly/folly/portability/Constexpr.h +145 -0
  699. package/external/folly/folly/portability/Dirent.cpp +140 -0
  700. package/external/folly/folly/portability/Dirent.h +41 -0
  701. package/external/folly/folly/portability/Event.h +44 -0
  702. package/external/folly/folly/portability/Fcntl.cpp +120 -0
  703. package/external/folly/folly/portability/Fcntl.h +67 -0
  704. package/external/folly/folly/portability/Filesystem.cpp +67 -0
  705. package/external/folly/folly/portability/Filesystem.h +114 -0
  706. package/external/folly/folly/portability/FmtCompile.h +40 -0
  707. package/external/folly/folly/portability/GFlags.h +139 -0
  708. package/external/folly/folly/portability/GMock.h +35 -0
  709. package/external/folly/folly/portability/GTest.h +35 -0
  710. package/external/folly/folly/portability/IOVec.h +34 -0
  711. package/external/folly/folly/portability/Libgen.cpp +59 -0
  712. package/external/folly/folly/portability/Libgen.h +29 -0
  713. package/external/folly/folly/portability/Libunwind.h +21 -0
  714. package/external/folly/folly/portability/Malloc.cpp +31 -0
  715. package/external/folly/folly/portability/Malloc.h +53 -0
  716. package/external/folly/folly/portability/Math.h +90 -0
  717. package/external/folly/folly/portability/Memory.h +26 -0
  718. package/external/folly/folly/portability/OpenSSL.cpp +17 -0
  719. package/external/folly/folly/portability/OpenSSL.h +102 -0
  720. package/external/folly/folly/portability/PThread.cpp +697 -0
  721. package/external/folly/folly/portability/PThread.h +148 -0
  722. package/external/folly/folly/portability/README.md +21 -0
  723. package/external/folly/folly/portability/Sched.cpp +41 -0
  724. package/external/folly/folly/portability/Sched.h +45 -0
  725. package/external/folly/folly/portability/Sockets.cpp +245 -0
  726. package/external/folly/folly/portability/Sockets.h +155 -0
  727. package/external/folly/folly/portability/SourceLocation.h +49 -0
  728. package/external/folly/folly/portability/Stdio.cpp +77 -0
  729. package/external/folly/folly/portability/Stdio.h +32 -0
  730. package/external/folly/folly/portability/Stdlib.cpp +172 -0
  731. package/external/folly/folly/portability/Stdlib.h +64 -0
  732. package/external/folly/folly/portability/String.cpp +53 -0
  733. package/external/folly/folly/portability/String.h +39 -0
  734. package/external/folly/folly/portability/SysFile.cpp +46 -0
  735. package/external/folly/folly/portability/SysFile.h +27 -0
  736. package/external/folly/folly/portability/SysMembarrier.cpp +104 -0
  737. package/external/folly/folly/portability/SysMembarrier.h +26 -0
  738. package/external/folly/folly/portability/SysMman.cpp +242 -0
  739. package/external/folly/folly/portability/SysMman.h +68 -0
  740. package/external/folly/folly/portability/SysResource.cpp +108 -0
  741. package/external/folly/folly/portability/SysResource.h +71 -0
  742. package/external/folly/folly/portability/SysStat.cpp +66 -0
  743. package/external/folly/folly/portability/SysStat.h +52 -0
  744. package/external/folly/folly/portability/SysSyscall.h +73 -0
  745. package/external/folly/folly/portability/SysTime.cpp +62 -0
  746. package/external/folly/folly/portability/SysTime.h +50 -0
  747. package/external/folly/folly/portability/SysTypes.h +44 -0
  748. package/external/folly/folly/portability/SysUio.cpp +179 -0
  749. package/external/folly/folly/portability/SysUio.h +51 -0
  750. package/external/folly/folly/portability/Syslog.h +39 -0
  751. package/external/folly/folly/portability/Time.cpp +357 -0
  752. package/external/folly/folly/portability/Time.h +74 -0
  753. package/external/folly/folly/portability/Unistd.cpp +33 -0
  754. package/external/folly/folly/portability/Unistd.h +111 -0
  755. package/external/folly/folly/portability/Windows.h +108 -0
  756. package/external/folly/folly/portability/openat2.c +30 -0
  757. package/external/folly/folly/portability/openat2.h +39 -0
  758. package/external/folly/folly/portability/test/BUCK +59 -0
  759. package/external/folly/folly/portability/test/ConstexprTest.cpp +102 -0
  760. package/external/folly/folly/portability/test/FilesystemTest.cpp +35 -0
  761. package/external/folly/folly/portability/test/LibgenTest.cpp +35 -0
  762. package/external/folly/folly/portability/test/OpenSSLPortabilityTest.cpp +108 -0
  763. package/external/folly/folly/portability/test/PThreadTest.cpp +80 -0
  764. package/external/folly/folly/portability/test/TimeTest.cpp +90 -0
  765. package/external/folly/folly/small_vector.h +17 -0
  766. package/external/folly/folly/somerge_defs.bzl +399 -0
  767. package/external/folly/folly/sorted_vector_types.h +17 -0
  768. package/external/folly/folly/stop_watch.h +317 -0
  769. package/external/folly/folly/synchronization/AsymmetricThreadFence.cpp +91 -0
  770. package/external/folly/folly/synchronization/AsymmetricThreadFence.h +60 -0
  771. package/external/folly/folly/synchronization/AtomicNotification-inl.h +146 -0
  772. package/external/folly/folly/synchronization/AtomicNotification.cpp +34 -0
  773. package/external/folly/folly/synchronization/AtomicNotification.h +117 -0
  774. package/external/folly/folly/synchronization/AtomicRef.h +181 -0
  775. package/external/folly/folly/synchronization/AtomicStruct.h +150 -0
  776. package/external/folly/folly/synchronization/AtomicUtil-inl.h +482 -0
  777. package/external/folly/folly/synchronization/AtomicUtil.h +179 -0
  778. package/external/folly/folly/synchronization/BUCK +418 -0
  779. package/external/folly/folly/synchronization/Baton.h +419 -0
  780. package/external/folly/folly/synchronization/CallOnce.h +263 -0
  781. package/external/folly/folly/synchronization/DelayedInit.h +179 -0
  782. package/external/folly/folly/synchronization/DistributedMutex-inl.h +1744 -0
  783. package/external/folly/folly/synchronization/DistributedMutex.cpp +27 -0
  784. package/external/folly/folly/synchronization/DistributedMutex.h +342 -0
  785. package/external/folly/folly/synchronization/EventCount.h +200 -0
  786. package/external/folly/folly/synchronization/FlatCombining.h +629 -0
  787. package/external/folly/folly/synchronization/Hazptr-fwd.h +217 -0
  788. package/external/folly/folly/synchronization/Hazptr.cpp +36 -0
  789. package/external/folly/folly/synchronization/Hazptr.h +209 -0
  790. package/external/folly/folly/synchronization/HazptrDomain.cpp +68 -0
  791. package/external/folly/folly/synchronization/HazptrDomain.h +832 -0
  792. package/external/folly/folly/synchronization/HazptrHolder.h +431 -0
  793. package/external/folly/folly/synchronization/HazptrObj.h +533 -0
  794. package/external/folly/folly/synchronization/HazptrObjLinked.h +315 -0
  795. package/external/folly/folly/synchronization/HazptrRec.h +68 -0
  796. package/external/folly/folly/synchronization/HazptrThrLocal.h +180 -0
  797. package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.cpp +46 -0
  798. package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.h +25 -0
  799. package/external/folly/folly/synchronization/Latch.h +160 -0
  800. package/external/folly/folly/synchronization/LifoSem.h +767 -0
  801. package/external/folly/folly/synchronization/Lock.h +887 -0
  802. package/external/folly/folly/synchronization/MicroSpinLock.h +154 -0
  803. package/external/folly/folly/synchronization/NativeSemaphore.h +187 -0
  804. package/external/folly/folly/synchronization/ParkingLot.cpp +37 -0
  805. package/external/folly/folly/synchronization/ParkingLot.h +330 -0
  806. package/external/folly/folly/synchronization/PicoSpinLock.h +167 -0
  807. package/external/folly/folly/synchronization/RWSpinLock.h +549 -0
  808. package/external/folly/folly/synchronization/Rcu.cpp +26 -0
  809. package/external/folly/folly/synchronization/Rcu.h +553 -0
  810. package/external/folly/folly/synchronization/RelaxedAtomic.h +336 -0
  811. package/external/folly/folly/synchronization/SanitizeThread.cpp +141 -0
  812. package/external/folly/folly/synchronization/SanitizeThread.h +166 -0
  813. package/external/folly/folly/synchronization/SaturatingSemaphore.h +324 -0
  814. package/external/folly/folly/synchronization/SmallLocks.h +36 -0
  815. package/external/folly/folly/synchronization/ThrottledLifoSem.h +362 -0
  816. package/external/folly/folly/synchronization/WaitOptions.cpp +25 -0
  817. package/external/folly/folly/synchronization/WaitOptions.h +75 -0
  818. package/external/folly/folly/synchronization/detail/AtomicUtils.h +59 -0
  819. package/external/folly/folly/synchronization/detail/BUCK +104 -0
  820. package/external/folly/folly/synchronization/detail/Hardware.cpp +192 -0
  821. package/external/folly/folly/synchronization/detail/Hardware.h +75 -0
  822. package/external/folly/folly/synchronization/detail/HazptrUtils.h +339 -0
  823. package/external/folly/folly/synchronization/detail/InlineFunctionRef.h +229 -0
  824. package/external/folly/folly/synchronization/detail/Sleeper.cpp +27 -0
  825. package/external/folly/folly/synchronization/detail/Sleeper.h +62 -0
  826. package/external/folly/folly/synchronization/detail/Spin.h +96 -0
  827. package/external/folly/folly/synchronization/detail/ThreadCachedLists.h +174 -0
  828. package/external/folly/folly/synchronization/detail/ThreadCachedReaders.h +189 -0
  829. package/external/folly/folly/synchronization/detail/ThreadCachedTag.h +26 -0
  830. package/external/folly/folly/synchronization/detail/test/BUCK +28 -0
  831. package/external/folly/folly/synchronization/detail/test/HardwareTest.cpp +74 -0
  832. package/external/folly/folly/synchronization/detail/test/InlineFunctionRefTest.cpp +286 -0
  833. package/external/folly/folly/synchronization/example/BUCK +27 -0
  834. package/external/folly/folly/synchronization/example/HazptrLockFreeLIFO.h +88 -0
  835. package/external/folly/folly/synchronization/example/HazptrSWMRSet.h +133 -0
  836. package/external/folly/folly/synchronization/example/HazptrWideCAS.h +62 -0
  837. package/external/folly/folly/synchronization/test/AtomicNotificationTest.cpp +236 -0
  838. package/external/folly/folly/synchronization/test/AtomicRefTest.cpp +170 -0
  839. package/external/folly/folly/synchronization/test/AtomicStructTest.cpp +65 -0
  840. package/external/folly/folly/synchronization/test/AtomicUtilBench.cpp +457 -0
  841. package/external/folly/folly/synchronization/test/AtomicUtilTest.cpp +650 -0
  842. package/external/folly/folly/synchronization/test/BUCK +495 -0
  843. package/external/folly/folly/synchronization/test/Barrier.h +52 -0
  844. package/external/folly/folly/synchronization/test/BarrierTest.cpp +56 -0
  845. package/external/folly/folly/synchronization/test/BatonBenchmark.cpp +77 -0
  846. package/external/folly/folly/synchronization/test/BatonTest.cpp +164 -0
  847. package/external/folly/folly/synchronization/test/BatonTestHelpers.h +118 -0
  848. package/external/folly/folly/synchronization/test/CallOnceBenchmark.cpp +72 -0
  849. package/external/folly/folly/synchronization/test/CallOnceTest.cpp +153 -0
  850. package/external/folly/folly/synchronization/test/DelayedInitTest.cpp +281 -0
  851. package/external/folly/folly/synchronization/test/DistributedMutexTest.cpp +2074 -0
  852. package/external/folly/folly/synchronization/test/EventCountTest.cpp +124 -0
  853. package/external/folly/folly/synchronization/test/FlatCombiningBenchmark.cpp +1789 -0
  854. package/external/folly/folly/synchronization/test/FlatCombiningExamples.h +222 -0
  855. package/external/folly/folly/synchronization/test/FlatCombiningTest.cpp +121 -0
  856. package/external/folly/folly/synchronization/test/FlatCombiningTestHelpers.h +227 -0
  857. package/external/folly/folly/synchronization/test/HazptrTest.cpp +1689 -0
  858. package/external/folly/folly/synchronization/test/LatchTest.cpp +224 -0
  859. package/external/folly/folly/synchronization/test/LifoSemBench.cpp +185 -0
  860. package/external/folly/folly/synchronization/test/LifoSemTests.cpp +353 -0
  861. package/external/folly/folly/synchronization/test/LockTest.cpp +1239 -0
  862. package/external/folly/folly/synchronization/test/NativeSemaphoreTest.cpp +37 -0
  863. package/external/folly/folly/synchronization/test/ParkingLotBenchmark.cpp +239 -0
  864. package/external/folly/folly/synchronization/test/ParkingLotTest.cpp +170 -0
  865. package/external/folly/folly/synchronization/test/RWSpinLockTest.cpp +235 -0
  866. package/external/folly/folly/synchronization/test/RcuBench.cpp +66 -0
  867. package/external/folly/folly/synchronization/test/RcuTest.cpp +330 -0
  868. package/external/folly/folly/synchronization/test/RelaxedAtomicTest.cpp +389 -0
  869. package/external/folly/folly/synchronization/test/SaturatingSemaphoreTest.cpp +166 -0
  870. package/external/folly/folly/synchronization/test/Semaphore.h +242 -0
  871. package/external/folly/folly/synchronization/test/SemaphoreTest.cpp +271 -0
  872. package/external/folly/folly/synchronization/test/SmallLocksBenchmark.cpp +1296 -0
  873. package/external/folly/folly/synchronization/test/SmallLocksTest.cpp +510 -0
  874. package/external/folly/folly/synchronization/test/ThreadCachedEpochBench.h +67 -0
  875. package/external/folly/folly/synchronization/test/ThreadCachedReadersBench.cpp +42 -0
  876. package/external/folly/folly/synchronization/test/ThreadCachedReadersTest.cpp +52 -0
  877. package/external/folly/folly/synchronization/test/ThrottledLifoSemTest.cpp +243 -0
  878. package/external/folly/folly/system/AtFork.cpp +205 -0
  879. package/external/folly/folly/system/AtFork.h +116 -0
  880. package/external/folly/folly/system/AuxVector.h +198 -0
  881. package/external/folly/folly/system/BUCK +144 -0
  882. package/external/folly/folly/system/EnvUtil.cpp +93 -0
  883. package/external/folly/folly/system/EnvUtil.h +113 -0
  884. package/external/folly/folly/system/HardwareConcurrency.cpp +39 -0
  885. package/external/folly/folly/system/HardwareConcurrency.h +23 -0
  886. package/external/folly/folly/system/MemoryMapping.cpp +477 -0
  887. package/external/folly/folly/system/MemoryMapping.h +287 -0
  888. package/external/folly/folly/system/Pid.cpp +87 -0
  889. package/external/folly/folly/system/Pid.h +34 -0
  890. package/external/folly/folly/system/Shell.cpp +33 -0
  891. package/external/folly/folly/system/Shell.h +93 -0
  892. package/external/folly/folly/system/ThreadId.cpp +89 -0
  893. package/external/folly/folly/system/ThreadId.h +62 -0
  894. package/external/folly/folly/system/ThreadName.cpp +330 -0
  895. package/external/folly/folly/system/ThreadName.h +72 -0
  896. package/external/folly/folly/system/test/AtForkTest.cpp +309 -0
  897. package/external/folly/folly/system/test/AuxVectorTest.cpp +55 -0
  898. package/external/folly/folly/system/test/BUCK +120 -0
  899. package/external/folly/folly/system/test/EnvUtilSubprocess.cpp +26 -0
  900. package/external/folly/folly/system/test/EnvUtilTest.cpp +197 -0
  901. package/external/folly/folly/system/test/MemoryMappingTest.cpp +179 -0
  902. package/external/folly/folly/system/test/PidTest.cpp +46 -0
  903. package/external/folly/folly/system/test/ShellTest.cpp +66 -0
  904. package/external/folly/folly/system/test/ThreadIdTest.cpp +114 -0
  905. package/external/folly/folly/system/test/ThreadNameTest.cpp +85 -0
  906. package/external/folly/folly.vcxitems +164 -0
  907. package/external/folly/static/logo.svg +1 -0
  908. package/external/folly/sync-config.json +8 -0
  909. package/package.json +3 -3
  910. package/templates/cpp-lib/example/metro.config.js +18 -2
@@ -0,0 +1,1095 @@
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
+ // TODO: [x] "cast" from Poly<C&> to Poly<C&&>
18
+ // TODO: [ ] copy/move from Poly<C&>/Poly<C&&> to Poly<C>
19
+ // TODO: [ ] copy-on-write?
20
+ // TODO: [ ] down- and cross-casting? (Possible?)
21
+ // TODO: [ ] shared ownership? (Dubious.)
22
+ // TODO: [ ] can games be played with making the VTable a member of a struct
23
+ // with strange alignment such that the address of the VTable can
24
+ // be used to tell whether the object is stored in-situ or not?
25
+
26
+ #pragma once
27
+
28
+ #include <cassert>
29
+ #include <new>
30
+ #include <type_traits>
31
+ #include <typeinfo>
32
+ #include <utility>
33
+
34
+ #include <folly/CPortability.h>
35
+ #include <folly/CppAttributes.h>
36
+ #include <folly/Traits.h>
37
+ #include <folly/detail/TypeList.h>
38
+ #include <folly/lang/Assume.h>
39
+
40
+ #include <folly/PolyException.h>
41
+ #include <folly/detail/PolyDetail.h>
42
+
43
+ namespace folly {
44
+ template <class I>
45
+ struct Poly;
46
+
47
+ // MSVC workaround
48
+ template <class Node, class Tfx, class Access>
49
+ struct PolySelf_ {
50
+ using type = decltype(Access::template self_<Node, Tfx>());
51
+ };
52
+
53
+ /**
54
+ * Within the definition of interface `I`, `PolySelf<Base>` is an alias for
55
+ * the instance of `Poly` that is currently being instantiated. It is
56
+ * one of: `Poly<J>`, `Poly<J&&>`, `Poly<J&>`, or `Poly<J const&>`; where
57
+ * `J` is either `I` or some interface that extends `I`.
58
+ *
59
+ * It can be used within interface definitions to declare members that accept
60
+ * other `Poly` objects of the same type as `*this`.
61
+ *
62
+ * The first parameter may optionally be cv- and/or reference-qualified, in
63
+ * which case, the qualification is applies to the type of the interface in the
64
+ * resulting `Poly<>` instance. The second template parameter controls whether
65
+ * or not the interface is decayed before the cv-ref qualifiers of the first
66
+ * argument are applied. For example, given the following:
67
+ *
68
+ * struct Foo {
69
+ * template <class Base>
70
+ * struct Interface : Base {
71
+ * using A = PolySelf<Base>;
72
+ * using B = PolySelf<Base &>;
73
+ * using C = PolySelf<Base const &>;
74
+ * using X = PolySelf<Base, PolyDecay>;
75
+ * using Y = PolySelf<Base &, PolyDecay>;
76
+ * using Z = PolySelf<Base const &, PolyDecay>;
77
+ * };
78
+ * // ...
79
+ * };
80
+ * struct Bar : PolyExtends<Foo> {
81
+ * // ...
82
+ * };
83
+ *
84
+ * Then for `Poly<Bar>`, the typedefs are aliases for the following types:
85
+ * - `A` is `Poly<Bar>`
86
+ * - `B` is `Poly<Bar &>`
87
+ * - `C` is `Poly<Bar const &>`
88
+ * - `X` is `Poly<Bar>`
89
+ * - `Y` is `Poly<Bar &>`
90
+ * - `Z` is `Poly<Bar const &>`
91
+ *
92
+ * And for `Poly<Bar &>`, the typedefs are aliases for the following types:
93
+ * - `A` is `Poly<Bar &>`
94
+ * - `B` is `Poly<Bar &>`
95
+ * - `C` is `Poly<Bar &>`
96
+ * - `X` is `Poly<Bar>`
97
+ * - `Y` is `Poly<Bar &>`
98
+ * - `Z` is `Poly<Bar const &>`
99
+ */
100
+ template <
101
+ class Node,
102
+ class Tfx = detail::MetaIdentity,
103
+ class Access = detail::PolyAccess>
104
+ using PolySelf = _t<PolySelf_<Node, Tfx, Access>>;
105
+
106
+ /**
107
+ * When used in conjunction with `PolySelf`, controls how to construct `Poly`
108
+ * types related to the one currently being instantiated.
109
+ *
110
+ * \sa PolySelf
111
+ */
112
+ using PolyDecay = detail::MetaQuote<std::decay_t>;
113
+
114
+ #define FOLLY_POLY_MEMBER(SIG, MEM) ::folly::sig<SIG>(MEM)
115
+ #define FOLLY_POLY_MEMBERS(...) ::folly::PolyMembers<__VA_ARGS__>
116
+
117
+ template <auto... Ps>
118
+ struct PolyMembers {};
119
+
120
+ /**
121
+ * Used in the definition of a `Poly` interface to say that the current
122
+ * interface is an extension of a set of zero or more interfaces.
123
+ *
124
+ * Example:
125
+ *
126
+ * struct IFoo {
127
+ * template <class Base> struct Interface : Base {
128
+ * void foo() { folly::poly_call<0>(*this); }
129
+ * };
130
+ * template <class T> using Members = FOLLY_POLY_MEMBERS(&T::foo);
131
+ * }
132
+ * struct IBar : PolyExtends<IFoo> {
133
+ * template <class Base> struct Interface : Base {
134
+ * void bar(int i) { folly::poly_call<0>(*this, i); }
135
+ * };
136
+ * template <class T> using Members = FOLLY_POLY_MEMBERS(&T::bar);
137
+ * }
138
+ */
139
+ template <class... I>
140
+ struct PolyExtends : virtual I... {
141
+ using Subsumptions = detail::TypeList<I...>;
142
+
143
+ template <class Base>
144
+ struct Interface : Base {
145
+ Interface() = default;
146
+ using Base::Base;
147
+ };
148
+
149
+ template <class...>
150
+ using Members = PolyMembers<>;
151
+ };
152
+
153
+ ////////////////////////////////////////////////////////////////////////////////
154
+ /**
155
+ * Call the N-th member of the currently-being-defined interface. When the
156
+ * first parameter is an object of type `PolySelf<Base>` (as opposed to `*this`)
157
+ * you must explicitly specify which interface through which to dispatch.
158
+ * For instance:
159
+ *
160
+ * struct IAddable {
161
+ * template <class Base>
162
+ * struct Interface : Base {
163
+ * friend folly::PolySelf<Base, folly::PolyDecay>
164
+ * operator+(
165
+ * folly::PolySelf<Base> const& a,
166
+ * folly::PolySelf<Base> const& b) {
167
+ * return folly::poly_call<0, IAddable>(a, b);
168
+ * }
169
+ * };
170
+ * template <class T>
171
+ * static auto plus_(T const& a, T const& b) -> decltype(a + b) {
172
+ * return a + b;
173
+ * }
174
+ * template <class T>
175
+ * using Members = FOLLY_POLY_MEMBERS(&plus_<std::decay_t<T>>);
176
+ * };
177
+ *
178
+ * \sa PolySelf
179
+ */
180
+ template <std::size_t N, typename This, typename... As>
181
+ auto poly_call(This&& _this, As&&... as)
182
+ -> decltype(detail::PolyAccess::call<N>(
183
+ static_cast<This&&>(_this), static_cast<As&&>(as)...)) {
184
+ return detail::PolyAccess::call<N>(
185
+ static_cast<This&&>(_this), static_cast<As&&>(as)...);
186
+ }
187
+
188
+ /// \overload
189
+ template <std::size_t N, class I, class Tail, typename... As>
190
+ decltype(auto) poly_call(detail::PolyNode<I, Tail>&& _this, As&&... as) {
191
+ using This = detail::InterfaceOf<I, detail::PolyNode<I, Tail>>;
192
+ return detail::PolyAccess::call<N>(
193
+ static_cast<This&&>(_this), static_cast<As&&>(as)...);
194
+ }
195
+
196
+ /// \overload
197
+ template <std::size_t N, class I, class Tail, typename... As>
198
+ decltype(auto) poly_call(detail::PolyNode<I, Tail>& _this, As&&... as) {
199
+ using This = detail::InterfaceOf<I, detail::PolyNode<I, Tail>>;
200
+ return detail::PolyAccess::call<N>(
201
+ static_cast<This&>(_this), static_cast<As&&>(as)...);
202
+ }
203
+
204
+ /// \overload
205
+ template <std::size_t N, class I, class Tail, typename... As>
206
+ decltype(auto) poly_call(detail::PolyNode<I, Tail> const& _this, As&&... as) {
207
+ using This = detail::InterfaceOf<I, detail::PolyNode<I, Tail>>;
208
+ return detail::PolyAccess::call<N>(
209
+ static_cast<This const&>(_this), static_cast<As&&>(as)...);
210
+ }
211
+
212
+ /// \overload
213
+ template <
214
+ std::size_t N,
215
+ class I,
216
+ class Poly,
217
+ typename... As,
218
+ std::enable_if_t<detail::IsPoly<Poly>::value, int> = 0>
219
+ auto poly_call(Poly&& _this, As&&... as) -> decltype(poly_call<N, I>(
220
+ static_cast<Poly&&>(_this).get(),
221
+ static_cast<As&&>(as)...)) {
222
+ return poly_call<N, I>(
223
+ static_cast<Poly&&>(_this).get(), static_cast<As&&>(as)...);
224
+ }
225
+
226
+ /// \cond
227
+ /// \overload
228
+ template <std::size_t N, class I, typename... As>
229
+ [[noreturn]] detail::Bottom poly_call(detail::ArchetypeBase const&, As&&...) {
230
+ assume_unreachable();
231
+ }
232
+ /// \endcond
233
+
234
+ ////////////////////////////////////////////////////////////////////////////////
235
+ /**
236
+ * Try to cast the `Poly` object to the requested type. If the `Poly` stores an
237
+ * object of that type, return a reference to the object; otherwise, throw an
238
+ * exception.
239
+ * \tparam T The (unqualified) type to which to cast the `Poly` object.
240
+ * \tparam Poly The type of the `Poly` object.
241
+ * \param that The `Poly` object to be cast.
242
+ * \return A reference to the `T` object stored in or referred to by `that`.
243
+ * \throw BadPolyAccess if `that` is empty.
244
+ * \throw BadPolyCast if `that` does not store or refer to an object of type
245
+ * `T`.
246
+ */
247
+ template <class T, class I>
248
+ detail::AddCvrefOf<T, I>&& poly_cast(detail::PolyRoot<I>&& that) {
249
+ return detail::PolyAccess::cast<T>(std::move(that));
250
+ }
251
+
252
+ /// \overload
253
+ template <class T, class I>
254
+ detail::AddCvrefOf<T, I>& poly_cast(detail::PolyRoot<I>& that) {
255
+ return detail::PolyAccess::cast<T>(that);
256
+ }
257
+
258
+ /// \overload
259
+ template <class T, class I>
260
+ detail::AddCvrefOf<T, I> const& poly_cast(detail::PolyRoot<I> const& that) {
261
+ return detail::PolyAccess::cast<T>(that);
262
+ }
263
+
264
+ /// \cond
265
+ /// \overload
266
+ template <class T, class I>
267
+ [[noreturn]] detail::AddCvrefOf<T, I>&& poly_cast(detail::ArchetypeRoot<I>&&) {
268
+ assume_unreachable();
269
+ }
270
+
271
+ /// \overload
272
+ template <class T, class I>
273
+ [[noreturn]] detail::AddCvrefOf<T, I>& poly_cast(detail::ArchetypeRoot<I>&) {
274
+ assume_unreachable();
275
+ }
276
+
277
+ /// \overload
278
+ template <class T, class I>
279
+ [[noreturn]] detail::AddCvrefOf<T, I> const& poly_cast(
280
+ detail::ArchetypeRoot<I> const&) {
281
+ assume_unreachable();
282
+ }
283
+ /// \endcond
284
+
285
+ /// \overload
286
+ template <
287
+ class T,
288
+ class Poly,
289
+ std::enable_if_t<detail::IsPoly<Poly>::value, int> = 0>
290
+ constexpr auto poly_cast(Poly&& that)
291
+ -> decltype(poly_cast<T>(std::declval<Poly>().get())) {
292
+ return poly_cast<T>(static_cast<Poly&&>(that).get());
293
+ }
294
+
295
+ ////////////////////////////////////////////////////////////////////////////////
296
+ /**
297
+ * Returns a reference to the `std::type_info` object corresponding to the
298
+ * object currently stored in `that`. If `that` is empty, returns
299
+ * `typeid(void)`.
300
+ */
301
+ template <class I>
302
+ std::type_info const& poly_type(detail::PolyRoot<I> const& that) noexcept {
303
+ return detail::PolyAccess::type(that);
304
+ }
305
+
306
+ /// \cond
307
+ /// \overload
308
+ [[noreturn]] inline std::type_info const& poly_type(
309
+ detail::ArchetypeBase const&) noexcept {
310
+ assume_unreachable();
311
+ }
312
+ /// \endcond
313
+
314
+ /// \overload
315
+ template <class Poly, std::enable_if_t<detail::IsPoly<Poly>::value, int> = 0>
316
+ constexpr auto poly_type(Poly const& that) noexcept
317
+ -> decltype(poly_type(that.get())) {
318
+ return poly_type(that.get());
319
+ }
320
+
321
+ ////////////////////////////////////////////////////////////////////////////////
322
+ /**
323
+ * Returns `true` if `that` is not currently storing an object; `false`,
324
+ * otherwise.
325
+ */
326
+ template <class I>
327
+ bool poly_empty(detail::PolyRoot<I> const& that) noexcept {
328
+ return detail::State::eEmpty == detail::PolyAccess::vtable(that)->state_;
329
+ }
330
+
331
+ /// \overload
332
+ template <class I>
333
+ constexpr bool poly_empty(detail::PolyRoot<I&&> const&) noexcept {
334
+ return false;
335
+ }
336
+
337
+ /// \overload
338
+ template <class I>
339
+ constexpr bool poly_empty(detail::PolyRoot<I&> const&) noexcept {
340
+ return false;
341
+ }
342
+
343
+ /// \overload
344
+ template <class I>
345
+ constexpr bool poly_empty(Poly<I&&> const&) noexcept {
346
+ return false;
347
+ }
348
+
349
+ /// \overload
350
+ template <class I>
351
+ constexpr bool poly_empty(Poly<I&> const&) noexcept {
352
+ return false;
353
+ }
354
+
355
+ /// \cond
356
+ [[noreturn]] inline bool poly_empty(detail::ArchetypeBase const&) noexcept {
357
+ assume_unreachable();
358
+ }
359
+ /// \endcond
360
+
361
+ ////////////////////////////////////////////////////////////////////////////////
362
+ /**
363
+ * Given a `Poly<I&>`, return a `Poly<I&&>`. Otherwise, when `I` is not a
364
+ * reference type, returns a `Poly<I>&&` when given a `Poly<I>&`, like
365
+ * `std::move`.
366
+ */
367
+ template <
368
+ class I,
369
+ std::enable_if_t<Negation<std::is_reference<I>>::value, int> = 0>
370
+ constexpr Poly<I>&& poly_move(detail::PolyRoot<I>& that) noexcept {
371
+ return static_cast<Poly<I>&&>(static_cast<Poly<I>&>(that));
372
+ }
373
+
374
+ /// \overload
375
+ template <class I, std::enable_if_t<Negation<std::is_const<I>>::value, int> = 0>
376
+ Poly<I&&> poly_move(detail::PolyRoot<I&> const& that) noexcept {
377
+ return detail::PolyAccess::move(that);
378
+ }
379
+
380
+ /// \overload
381
+ template <class I>
382
+ Poly<I const&> poly_move(detail::PolyRoot<I const&> const& that) noexcept {
383
+ return detail::PolyAccess::move(that);
384
+ }
385
+
386
+ /// \cond
387
+ /// \overload
388
+ [[noreturn]] inline detail::ArchetypeBase poly_move(
389
+ detail::ArchetypeBase const&) noexcept {
390
+ assume_unreachable();
391
+ }
392
+ /// \endcond
393
+
394
+ /// \overload
395
+ template <class Poly, std::enable_if_t<detail::IsPoly<Poly>::value, int> = 0>
396
+ constexpr auto poly_move(Poly& that) noexcept
397
+ -> decltype(poly_move(that.get())) {
398
+ return poly_move(that.get());
399
+ }
400
+
401
+ /// \cond
402
+ namespace detail {
403
+ /**
404
+ * The implementation for `Poly` for when the interface type is not
405
+ * reference-like qualified, as in `Poly<SemiRegular>`.
406
+ */
407
+ template <class I>
408
+ struct PolyVal : PolyImpl<I> {
409
+ private:
410
+ friend PolyAccess;
411
+
412
+ struct NoneSuch {};
413
+ using Copyable = std::is_copy_constructible<PolyImpl<I>>;
414
+ using PolyOrNonesuch = If<Copyable::value, PolyVal, NoneSuch>;
415
+
416
+ using PolyRoot<I>::vptr_;
417
+
418
+ PolyRoot<I>& _polyRoot_() noexcept { return *this; }
419
+ PolyRoot<I> const& _polyRoot_() const noexcept { return *this; }
420
+
421
+ Data* _data_() noexcept { return PolyAccess::data(*this); }
422
+ Data const* _data_() const noexcept { return PolyAccess::data(*this); }
423
+
424
+ public:
425
+ /**
426
+ * Default constructor.
427
+ * \post `poly_empty(*this) == true`
428
+ */
429
+ PolyVal() = default;
430
+ /**
431
+ * Move constructor.
432
+ * \post `poly_empty(that) == true`
433
+ */
434
+ PolyVal(PolyVal&& that) noexcept;
435
+ /**
436
+ * A copy constructor if `I` is copyable; otherwise, a useless constructor
437
+ * from a private, incomplete type.
438
+ */
439
+ /* implicit */ PolyVal(PolyOrNonesuch const& that);
440
+
441
+ ~PolyVal();
442
+
443
+ /**
444
+ * Inherit any constructors defined by any of the interfaces.
445
+ */
446
+ using PolyImpl<I>::PolyImpl;
447
+
448
+ /**
449
+ * Copy assignment, destroys the object currently held (if any) and makes
450
+ * `*this` equal to `that` by stealing its guts.
451
+ */
452
+ Poly<I>& operator=(PolyVal that) noexcept;
453
+
454
+ /**
455
+ * Construct a Poly<I> from a concrete type that satisfies the I concept
456
+ */
457
+ template <class T, std::enable_if_t<ModelsInterface<T, I>::value, int> = 0>
458
+ /* implicit */ PolyVal(T&& t);
459
+
460
+ /**
461
+ * Construct a `Poly` from a compatible `Poly`. "Compatible" here means: the
462
+ * other interface extends this one either directly or indirectly.
463
+ */
464
+ template <class I2, std::enable_if_t<ValueCompatible<I, I2>::value, int> = 0>
465
+ /* implicit */ PolyVal(Poly<I2> that);
466
+
467
+ /**
468
+ * Assign to this `Poly<I>` from a concrete type that satisfies the `I`
469
+ * concept.
470
+ */
471
+ template <class T, std::enable_if_t<ModelsInterface<T, I>::value, int> = 0>
472
+ Poly<I>& operator=(T&& t);
473
+
474
+ /**
475
+ * Assign a compatible `Poly` to `*this`. "Compatible" here means: the
476
+ * other interface extends this one either directly or indirectly.
477
+ */
478
+ template <class I2, std::enable_if_t<ValueCompatible<I, I2>::value, int> = 0>
479
+ Poly<I>& operator=(Poly<I2> that);
480
+
481
+ /**
482
+ * Swaps the values of two `Poly` objects.
483
+ */
484
+ void swap(Poly<I>& that) noexcept;
485
+ };
486
+
487
+ ////////////////////////////////////////////////////////////////////////////////
488
+ /**
489
+ * The implementation of `Poly` for when the interface type is
490
+ * reference-qualified, like `Poly<SemiRegular &>`.
491
+ */
492
+ template <class I>
493
+ struct PolyRef : private PolyImpl<I> {
494
+ private:
495
+ friend PolyAccess;
496
+
497
+ AddCvrefOf<PolyRoot<I>, I>& _polyRoot_() const noexcept;
498
+
499
+ Data* _data_() noexcept { return PolyAccess::data(*this); }
500
+ Data const* _data_() const noexcept { return PolyAccess::data(*this); }
501
+
502
+ static constexpr RefType refType() noexcept;
503
+
504
+ protected:
505
+ template <class That, class I2>
506
+ PolyRef(That&& that, Type<I2>);
507
+
508
+ public:
509
+ /**
510
+ * Copy constructor
511
+ * \post `&poly_cast<T>(*this) == &poly_cast<T>(that)`, where `T` is the
512
+ * type of the object held by `that`.
513
+ */
514
+ PolyRef(PolyRef const& that) noexcept;
515
+
516
+ /**
517
+ * Copy assignment
518
+ * \post `&poly_cast<T>(*this) == &poly_cast<T>(that)`, where `T` is the
519
+ * type of the object held by `that`.
520
+ */
521
+ Poly<I>& operator=(PolyRef const& that) noexcept;
522
+
523
+ /**
524
+ * Construct a `Poly<I>` from a concrete type that satisfies concept `I`.
525
+ * \post `!poly_empty(*this)`
526
+ */
527
+ template <class T, std::enable_if_t<ModelsInterface<T, I>::value, int> = 0>
528
+ /* implicit */ PolyRef(T&& t) noexcept;
529
+
530
+ /**
531
+ * Construct a `Poly<I>` from a compatible `Poly<I2>`.
532
+ */
533
+ template <
534
+ class I2,
535
+ std::enable_if_t<ReferenceCompatible<I, I2, I2&&>::value, int> = 0>
536
+ /* implicit */ PolyRef(Poly<I2>&& that) noexcept(
537
+ std::is_reference<I2>::value);
538
+
539
+ template <
540
+ class I2,
541
+ std::enable_if_t<ReferenceCompatible<I, I2, I2&>::value, int> = 0>
542
+ /* implicit */ PolyRef(Poly<I2>& that) noexcept(std::is_reference<I2>::value)
543
+ : PolyRef{that, Type<I2>{}} {}
544
+
545
+ template <
546
+ class I2,
547
+ std::enable_if_t<ReferenceCompatible<I, I2, I2 const&>::value, int> = 0>
548
+ /* implicit */ PolyRef(Poly<I2> const& that) noexcept(
549
+ std::is_reference<I2>::value)
550
+ : PolyRef{that, Type<I2>{}} {}
551
+
552
+ /**
553
+ * Assign to a `Poly<I>` from a concrete type that satisfies concept `I`.
554
+ * \post `!poly_empty(*this)`
555
+ */
556
+ template <class T, std::enable_if_t<ModelsInterface<T, I>::value, int> = 0>
557
+ Poly<I>& operator=(T&& t) noexcept;
558
+
559
+ /**
560
+ * Assign to `*this` from another compatible `Poly`.
561
+ */
562
+ template <
563
+ class I2,
564
+ std::enable_if_t<ReferenceCompatible<I, I2, I2&&>::value, int> = 0>
565
+ Poly<I>& operator=(Poly<I2>&& that) noexcept(std::is_reference<I2>::value);
566
+
567
+ /**
568
+ * \overload
569
+ */
570
+ template <
571
+ class I2,
572
+ std::enable_if_t<ReferenceCompatible<I, I2, I2&>::value, int> = 0>
573
+ Poly<I>& operator=(Poly<I2>& that) noexcept(std::is_reference<I2>::value);
574
+
575
+ /**
576
+ * \overload
577
+ */
578
+ template <
579
+ class I2,
580
+ std::enable_if_t<ReferenceCompatible<I, I2, I2 const&>::value, int> = 0>
581
+ Poly<I>& operator=(Poly<I2> const& that) noexcept(
582
+ std::is_reference<I2>::value);
583
+
584
+ /**
585
+ * Swap which object this `Poly` references ("shallow" swap).
586
+ */
587
+ void swap(Poly<I>& that) noexcept;
588
+
589
+ /**
590
+ * Get a reference to the interface, with correct `const`-ness applied.
591
+ */
592
+ AddCvrefOf<PolyImpl<I>, I>& get() const noexcept;
593
+
594
+ /**
595
+ * Get a reference to the interface, with correct `const`-ness applied.
596
+ */
597
+ AddCvrefOf<PolyImpl<I>, I>& operator*() const noexcept { return get(); }
598
+
599
+ /**
600
+ * Get a pointer to the interface, with correct `const`-ness applied.
601
+ */
602
+ auto operator->() const noexcept { return &get(); }
603
+ };
604
+
605
+ template <class I>
606
+ using PolyValOrRef = If<std::is_reference<I>::value, PolyRef<I>, PolyVal<I>>;
607
+ } // namespace detail
608
+ /// \endcond
609
+
610
+ /**
611
+ * `Poly` is a class template that makes it relatively easy to define a
612
+ * type-erasing polymorphic object wrapper.
613
+ *
614
+ * \par Type-erasure
615
+ *
616
+ * \par
617
+ * `std::function` is one example of a type-erasing polymorphic object wrapper;
618
+ * `folly::exception_wrapper` is another. Type-erasure is often used as an
619
+ * alternative to dynamic polymorphism via inheritance-based virtual dispatch.
620
+ * The distinguishing characteristic of type-erasing wrappers are:
621
+ * \li **Duck typing:** Types do not need to inherit from an abstract base
622
+ * class in order to be assignable to a type-erasing wrapper; they merely
623
+ * need to satisfy a particular interface.
624
+ * \li **Value semantics:** Type-erasing wrappers are objects that can be
625
+ * passed around _by value_. This is in contrast to abstract base classes
626
+ * which must be passed by reference or by pointer or else suffer from
627
+ * _slicing_, which causes them to lose their polymorphic behaviors.
628
+ * Reference semantics make it difficult to reason locally about code.
629
+ * \li **Automatic memory management:** When dealing with inheritance-based
630
+ * dynamic polymorphism, it is often necessary to allocate and manage
631
+ * objects on the heap. This leads to a proliferation of `shared_ptr`s and
632
+ * `unique_ptr`s in APIs, complicating their point-of-use. APIs that take
633
+ * type-erasing wrappers, on the other hand, can often store small objects
634
+ * in-situ, with no dynamic allocation. The memory management, if any, is
635
+ * handled for you, and leads to cleaner APIs: consumers of your API don't
636
+ * need to pass `shared_ptr<AbstractBase>`; they can simply pass any object
637
+ * that satisfies the interface you require. (`std::function` is a
638
+ * particularly compelling example of this benefit. Far worse would be an
639
+ * inheritance-based callable solution like
640
+ * `shared_ptr<ICallable<void(int)>>`. )
641
+ *
642
+ * \par Example: Defining a type-erasing function wrapper with `folly::Poly`
643
+ *
644
+ * \par
645
+ * Defining a polymorphic wrapper with `Poly` is a matter of defining two
646
+ * things:
647
+ * \li An *interface*, consisting of public member functions, and
648
+ * \li A *mapping* from a concrete type to a set of member function bindings.
649
+ *
650
+ * Below is a (heavily commented) example of a simple implementation of a
651
+ * `std::function`-like polymorphic wrapper. Its interface has only a single
652
+ * member function: `operator()`
653
+ *
654
+ * // An interface for a callable object of a particular signature, Fun
655
+ * // (most interfaces don't need to be templates, FWIW).
656
+ * template <class Fun>
657
+ * struct IFunction;
658
+ *
659
+ * template <class R, class... As>
660
+ * struct IFunction<R(As...)> {
661
+ * // An interface is defined as a nested class template called
662
+ * // Interface that takes a single template parameter, Base, from
663
+ * // which it inherits.
664
+ * template <class Base>
665
+ * struct Interface : Base {
666
+ * // The Interface has public member functions. These become the
667
+ * // public interface of the resulting Poly instantiation.
668
+ * // (Implementation note: Poly<IFunction<Sig>> will publicly
669
+ * // inherit from this struct, which is what gives it the right
670
+ * // member functions.)
671
+ * R operator()(As... as) const {
672
+ * // The definition of each member function in your interface will
673
+ * // always consist of a single line dispatching to
674
+ * // folly::poly_call<N>. The "N" corresponds to the N-th member
675
+ * // function in the list of member function bindings, Members,
676
+ * // defined below. The first argument will always be *this, and the
677
+ * // rest of the arguments should simply forward (if necessary) the
678
+ * // member function's arguments.
679
+ * return static_cast<R>(
680
+ * folly::poly_call<0>(*this, std::forward<As>(as)...));
681
+ * }
682
+ * };
683
+ *
684
+ * // The "Members" alias template is a comma-separated list of bound
685
+ * // member functions for a given concrete type "T". The
686
+ * // "FOLLY_POLY_MEMBERS" macro accepts a comma-separated list, and the
687
+ * // (optional) "FOLLY_POLY_MEMBER" macro lets you disambiguate overloads
688
+ * // by explicitly specifying the function signature the target member
689
+ * // function should have. In this case, we require "T" to have a
690
+ * // function call operator with the signature `R(As...) const`.
691
+ * //
692
+ * // If you are using a C++17-compatible compiler, you can do away with
693
+ * // the macros and write this as:
694
+ * //
695
+ * // template <class T>
696
+ * // using Members = folly::PolyMembers<
697
+ * // folly::sig<R(As...) const>(&T::operator())>;
698
+ * //
699
+ * // And since `folly::sig` is only needed for disambiguation in case of
700
+ * // overloads, if you are not concerned about objects with overloaded
701
+ * // function call operators, it could be further simplified to:
702
+ * //
703
+ * // template <class T>
704
+ * // using Members = folly::PolyMembers<&T::operator()>;
705
+ * //
706
+ * template <class T>
707
+ * using Members = FOLLY_POLY_MEMBERS(
708
+ * FOLLY_POLY_MEMBER(R(As...) const, &T::operator()));
709
+ * };
710
+ *
711
+ * // Now that we have defined the interface, we can pass it to Poly to
712
+ * // create our type-erasing wrapper:
713
+ * template <class Fun>
714
+ * using Function = Poly<IFunction<Fun>>;
715
+ *
716
+ * \par
717
+ * Given the above definition of `Function`, users can now initialize instances
718
+ * of (say) `Function<int(int, int)>` with function objects like
719
+ * `std::plus<int>` and `std::multiplies<int>`, as below:
720
+ *
721
+ * Function<int(int, int)> fun = std::plus<int>{};
722
+ * assert(5 == fun(2, 3));
723
+ * fun = std::multiplies<int>{};
724
+ * assert(6 = fun(2, 3));
725
+ *
726
+ * \par Defining an interface with C++17
727
+ *
728
+ * \par
729
+ * With C++17, defining an interface to be used with `Poly` is fairly
730
+ * straightforward. As in the `Function` example above, there is a struct with
731
+ * a nested `Interface` class template and a nested `Members` alias template.
732
+ * No macros are needed with C++17.
733
+ * \par
734
+ * Imagine we were defining something like a Java-style iterator. If we are
735
+ * using a C++17 compiler, our interface would look something like this:
736
+ *
737
+ * template <class Value>
738
+ * struct IJavaIterator {
739
+ * template <class Base>
740
+ * struct Interface : Base {
741
+ * bool Done() const { return folly::poly_call<0>(*this); }
742
+ * Value Current() const { return folly::poly_call<1>(*this); }
743
+ * void Next() { folly::poly_call<2>(*this); }
744
+ * };
745
+ * // NOTE: This works in C++17 only:
746
+ * template <class T>
747
+ * using Members = folly::PolyMembers<&T::Done, &T::Current, &T::Next>;
748
+ * };
749
+ *
750
+ * template <class Value>
751
+ * using JavaIterator = Poly<IJavaIterator>;
752
+ *
753
+ * \par
754
+ * Given the above definition, `JavaIterator<int>` can be used to hold instances
755
+ * of any type that has `Done`, `Current`, and `Next` member functions with the
756
+ * correct (or compatible) signatures.
757
+ *
758
+ * \par
759
+ * The presence of overloaded member functions complicates this picture. Often,
760
+ * property members are faked in C++ with `const` and non-`const` member
761
+ * function overloads, like in the interface specified below:
762
+ *
763
+ * struct IIntProperty {
764
+ * template <class Base>
765
+ * struct Interface : Base {
766
+ * int Value() const { return folly::poly_call<0>(*this); }
767
+ * void Value(int i) { folly::poly_call<1>(*this, i); }
768
+ * };
769
+ * // NOTE: This works in C++17 only:
770
+ * template <class T>
771
+ * using Members = folly::PolyMembers<
772
+ * folly::sig<int() const>(&T::Value),
773
+ * folly::sig<void(int)>(&T::Value)>;
774
+ * };
775
+ *
776
+ * using IntProperty = Poly<IIntProperty>;
777
+ *
778
+ * \par
779
+ * Now, any object that has `Value` members of compatible signatures can be
780
+ * assigned to instances of `IntProperty` object. Note how `folly::sig` is used
781
+ * to disambiguate the overloads of `&T::Value`.
782
+ *
783
+ * \par Defining an interface with C++14
784
+ *
785
+ * \par
786
+ * In C++14, the nice syntax above doesn't work, so we have to resort to macros.
787
+ * The two examples above would look like this:
788
+ *
789
+ * template <class Value>
790
+ * struct IJavaIterator {
791
+ * template <class Base>
792
+ * struct Interface : Base {
793
+ * bool Done() const { return folly::poly_call<0>(*this); }
794
+ * Value Current() const { return folly::poly_call<1>(*this); }
795
+ * void Next() { folly::poly_call<2>(*this); }
796
+ * };
797
+ * // NOTE: This works in C++14 and C++17:
798
+ * template <class T>
799
+ * using Members = FOLLY_POLY_MEMBERS(&T::Done, &T::Current, &T::Next);
800
+ * };
801
+ *
802
+ * template <class Value>
803
+ * using JavaIterator = Poly<IJavaIterator>;
804
+ *
805
+ * \par
806
+ * and
807
+ *
808
+ * struct IIntProperty {
809
+ * template <class Base>
810
+ * struct Interface : Base {
811
+ * int Value() const { return folly::poly_call<0>(*this); }
812
+ * void Value(int i) { return folly::poly_call<1>(*this, i); }
813
+ * };
814
+ * // NOTE: This works in C++14 and C++17:
815
+ * template <class T>
816
+ * using Members = FOLLY_POLY_MEMBERS(
817
+ * FOLLY_POLY_MEMBER(int() const, &T::Value),
818
+ * FOLLY_POLY_MEMBER(void(int), &T::Value));
819
+ * };
820
+ *
821
+ * using IntProperty = Poly<IIntProperty>;
822
+ *
823
+ * \par Extending interfaces
824
+ *
825
+ * \par
826
+ * One typical advantage of inheritance-based solutions to runtime polymorphism
827
+ * is that one polymorphic interface could extend another through inheritance.
828
+ * The same can be accomplished with type-erasing polymorphic wrappers. In
829
+ * the `Poly` library, you can use `folly::PolyExtends` to say that one
830
+ * interface extends another.
831
+ *
832
+ * struct IFoo {
833
+ * template <class Base>
834
+ * struct Interface : Base {
835
+ * void Foo() const { return folly::poly_call<0>(*this); }
836
+ * };
837
+ * template <class T>
838
+ * using Members = FOLLY_POLY_MEMBERS(&T::Foo);
839
+ * };
840
+ *
841
+ * // The IFooBar interface extends the IFoo interface
842
+ * struct IFooBar : PolyExtends<IFoo> {
843
+ * template <class Base>
844
+ * struct Interface : Base {
845
+ * void Bar() const { return folly::poly_call<0>(*this); }
846
+ * };
847
+ * template <class T>
848
+ * using Members = FOLLY_POLY_MEMBERS(&T::Bar);
849
+ * };
850
+ *
851
+ * using FooBar = Poly<IFooBar>;
852
+ *
853
+ * \par
854
+ * Given the above defintion, instances of type `FooBar` have both `Foo()` and
855
+ * `Bar()` member functions.
856
+ *
857
+ * \par
858
+ * The sensible conversions exist between a wrapped derived type and a wrapped
859
+ * base type. For instance, assuming `IDerived` extends `IBase` with
860
+ * `PolyExtends`:
861
+ *
862
+ * Poly<IDerived> derived = ...;
863
+ * Poly<IBase> base = derived; // This conversion is OK.
864
+ *
865
+ * \par
866
+ * As you would expect, there is no conversion in the other direction, and at
867
+ * present there is no `Poly` equivalent to `dynamic_cast`.
868
+ *
869
+ * \par Type-erasing polymorphic reference wrappers
870
+ *
871
+ * \par
872
+ * Sometimes you don't need to own a copy of an object; a reference will do. For
873
+ * that you can use `Poly` to capture a _reference_ to an object satisfying an
874
+ * interface rather than the whole object itself. The syntax is intuitive.
875
+ *
876
+ * int i = 42;
877
+ * // Capture a mutable reference to an object of any IRegular type:
878
+ * Poly<IRegular &> intRef = i;
879
+ * assert(42 == folly::poly_cast<int>(intRef));
880
+ * // Assert that we captured the address of "i":
881
+ * assert(&i == &folly::poly_cast<int>(intRef));
882
+ *
883
+ * \par
884
+ * A reference-like `Poly` has a different interface than a value-like `Poly`.
885
+ * Rather than calling member functions with the `obj.fun()` syntax, you would
886
+ * use the `obj->fun()` syntax. This is for the sake of `const`-correctness.
887
+ * For example, consider the code below:
888
+ *
889
+ * struct IFoo {
890
+ * template <class Base>
891
+ * struct Interface {
892
+ * void Foo() { folly::poly_call<0>(*this); }
893
+ * };
894
+ * template <class T>
895
+ * using Members = folly::PolyMembers<&T::Foo>;
896
+ * };
897
+ *
898
+ * struct SomeFoo {
899
+ * void Foo() { std::printf("SomeFoo::Foo\n"); }
900
+ * };
901
+ *
902
+ * SomeFoo foo;
903
+ * Poly<IFoo &> const anyFoo = foo;
904
+ * anyFoo->Foo(); // prints "SomeFoo::Foo"
905
+ *
906
+ * \par
907
+ * Notice in the above code that the `Foo` member function is non-`const`.
908
+ * Notice also that the `anyFoo` object is `const`. However, since it has
909
+ * captured a non-`const` reference to the `foo` object, it should still be
910
+ * possible to dispatch to the non-`const` `Foo` member function. When
911
+ * instantiated with a reference type, `Poly` has an overloaded `operator->`
912
+ * member that returns a pointer to the `IFoo` interface with the correct
913
+ * `const`-ness, which makes this work.
914
+ *
915
+ * \par
916
+ * The same mechanism also prevents users from calling non-`const` member
917
+ * functions on `Poly` objects that have captured `const` references, which
918
+ * would violate `const`-correctness.
919
+ *
920
+ * \par
921
+ * Sensible conversions exist between non-reference and reference `Poly`s. For
922
+ * instance:
923
+ *
924
+ * Poly<IRegular> value = 42;
925
+ * Poly<IRegular &> mutable_ref = value;
926
+ * Poly<IRegular const &> const_ref = mutable_ref;
927
+ *
928
+ * assert(&poly_cast<int>(value) == &poly_cast<int>(mutable_ref));
929
+ * assert(&poly_cast<int>(value) == &poly_cast<int>(const_ref));
930
+ *
931
+ * \par Non-member functions (C++17)
932
+ *
933
+ * \par
934
+ * If you wanted to write the interface `ILogicallyNegatable`, which captures
935
+ * all types that can be negated with unary `operator!`, you could do it
936
+ * as we've shown above, by binding `&T::operator!` in the nested `Members`
937
+ * alias template, but that has the problem that it won't work for types that
938
+ * have defined unary `operator!` as a free function. To handle this case,
939
+ * the `Poly` library lets you use a free function instead of a member function
940
+ * when creating a binding.
941
+ *
942
+ * \par
943
+ * With C++17 you may use a lambda to create a binding, as shown in the example
944
+ * below:
945
+ *
946
+ * struct ILogicallyNegatable {
947
+ * template <class Base>
948
+ * struct Interface : Base {
949
+ * bool operator!() const { return folly::poly_call<0>(*this); }
950
+ * };
951
+ * template <class T>
952
+ * using Members = folly::PolyMembers<
953
+ * +[](T const& t) -> decltype(!t) { return !t; }>;
954
+ * };
955
+ *
956
+ * \par
957
+ * This requires some explanation. The unary `operator+` in front of the lambda
958
+ * is necessary! It causes the lambda to decay to a C-style function pointer,
959
+ * which is one of the types that `folly::PolyMembers` accepts. The `decltype`
960
+ * in the lambda return type is also necessary. Through the magic of SFINAE, it
961
+ * will cause `Poly<ILogicallyNegatable>` to reject any types that don't support
962
+ * unary `operator!`.
963
+ *
964
+ * \par
965
+ * If you are using a free function to create a binding, the first parameter is
966
+ * implicitly the `this` parameter. It will receive the type-erased object.
967
+ *
968
+ * \par Non-member functions (C++14)
969
+ *
970
+ * \par
971
+ * If you are using a C++14 compiler, the defintion of `ILogicallyNegatable`
972
+ * above will fail because lambdas are not `constexpr`. We can get the same
973
+ * effect by writing the lambda as a named free function, as show below:
974
+ *
975
+ * struct ILogicallyNegatable {
976
+ * template <class Base>
977
+ * struct Interface : Base {
978
+ * bool operator!() const { return folly::poly_call<0>(*this); }
979
+ * };
980
+ *
981
+ * template <class T>
982
+ * static auto negate(T const& t) -> decltype(!t) { return !t; }
983
+ *
984
+ * template <class T>
985
+ * using Members = FOLLY_POLY_MEMBERS(&negate<T>);
986
+ * };
987
+ *
988
+ * \par
989
+ * As with the example that uses the lambda in the preceding section, the first
990
+ * parameter is implicitly the `this` parameter. It will receive the type-erased
991
+ * object.
992
+ *
993
+ * \par Multi-dispatch
994
+ *
995
+ * \par
996
+ * What if you want to create an `IAddable` interface for things that can be
997
+ * added? Adding requires _two_ objects, both of which are type-erased. This
998
+ * interface requires dispatching on both objects, doing the addition only
999
+ * if the types are the same. For this we make use of the `PolySelf` template
1000
+ * alias to define an interface that takes more than one object of the
1001
+ * erased type.
1002
+ *
1003
+ * struct IAddable {
1004
+ * template <class Base>
1005
+ * struct Interface : Base {
1006
+ * friend PolySelf<Base, Decay>
1007
+ * operator+(PolySelf<Base> const& a, PolySelf<Base> const& b) {
1008
+ * return folly::poly_call<0, IAddable>(a, b);
1009
+ * }
1010
+ * };
1011
+ *
1012
+ * template <class T>
1013
+ * using Members = folly::PolyMembers<
1014
+ * +[](T const& a, T const& b) -> decltype(a + b) { return a + b; }>;
1015
+ * };
1016
+ *
1017
+ * \par
1018
+ * Given the above defintion of `IAddable` we would be able to do the following:
1019
+ *
1020
+ * Poly<IAddable> a = 2, b = 3;
1021
+ * Poly<IAddable> c = a + b;
1022
+ * assert(poly_cast<int>(c) == 5);
1023
+ *
1024
+ * \par
1025
+ * If `a` and `b` stored objects of different types, a `BadPolyCast` exception
1026
+ * would be thrown.
1027
+ *
1028
+ * \par Move-only types
1029
+ *
1030
+ * \par
1031
+ * If you want to store move-only types, then your interface should extend the
1032
+ * `IMoveOnly` interface.
1033
+ *
1034
+ * \par Implementation notes
1035
+ * \par
1036
+ * `Poly` will store "small" objects in an internal buffer, avoiding the cost of
1037
+ * of dynamic allocations. At present, this size is not configurable; it is
1038
+ * pegged at the size of two `double`s.
1039
+ *
1040
+ * \par
1041
+ * `Poly` objects are always nothrow movable. If you store an object in one that
1042
+ * has a potentially throwing move contructor, the object will be stored on the
1043
+ * heap, even if it could fit in the internal storage of the `Poly` object.
1044
+ * (So be sure to give your objects nothrow move constructors!)
1045
+ *
1046
+ * \par
1047
+ * `Poly` implements type-erasure in a manner very similar to how the compiler
1048
+ * accomplishes virtual dispatch. Every `Poly` object contains a pointer to a
1049
+ * table of function pointers. Member function calls involve a double-
1050
+ * indirection: once through the v-pointer, and other indirect function call
1051
+ * through the function pointer.
1052
+ */
1053
+ template <class I>
1054
+ struct Poly final : detail::PolyValOrRef<I> {
1055
+ friend detail::PolyAccess;
1056
+ Poly() = default;
1057
+ using detail::PolyValOrRef<I>::PolyValOrRef;
1058
+ using detail::PolyValOrRef<I>::operator=;
1059
+ };
1060
+
1061
+ /**
1062
+ * Swap two `Poly<I>` instances.
1063
+ */
1064
+ template <class I>
1065
+ void swap(Poly<I>& left, Poly<I>& right) noexcept {
1066
+ left.swap(right);
1067
+ }
1068
+
1069
+ /**
1070
+ * Pseudo-function template handy for disambiguating function overloads.
1071
+ *
1072
+ * For example, given:
1073
+ * struct S {
1074
+ * int property() const;
1075
+ * void property(int);
1076
+ * };
1077
+ *
1078
+ * You can get a member function pointer to the first overload with:
1079
+ * folly::sig<int()const>(&S::property);
1080
+ *
1081
+ * This is arguably a nicer syntax that using the built-in `static_cast`:
1082
+ * static_cast<int (S::*)() const>(&S::property);
1083
+ *
1084
+ * `sig` is also more permissive than `static_cast` about `const`. For instance,
1085
+ * the following also works:
1086
+ * folly::sig<int()>(&S::property);
1087
+ *
1088
+ * The above is permitted
1089
+ */
1090
+ template <class Sig>
1091
+ inline constexpr detail::Sig<Sig> const sig = {};
1092
+
1093
+ } // namespace folly
1094
+
1095
+ #include <folly/Poly-inl.h>