react-native-windows 0.84.0-preview.9 → 0.84.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Common/unicode.cpp +36 -0
- package/Common/unicode.h +8 -0
- package/Directory.Build.props +2 -17
- package/Folly/ThreadNameStub.cpp +4 -6
- package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp +5 -0
- package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.cpp +91 -23
- package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.h +11 -0
- package/Microsoft.ReactNative/Fabric/Composition/ParagraphComponentView.cpp +6 -4
- package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp +28 -6
- package/Microsoft.ReactNative/Fabric/Composition/TextDrawing.cpp +1 -1
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +1 -1
- package/Microsoft.ReactNative/Fabric/Composition/TooltipService.cpp +80 -0
- package/Microsoft.ReactNative/Fabric/Composition/TooltipService.h +17 -0
- package/Microsoft.ReactNative/Fabric/platform/react/renderer/textlayoutmanager/WindowsTextLayoutManager.cpp +1 -1
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +4 -9
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj.filters +0 -3
- package/Microsoft.ReactNative/Utils/LocalBundleReader.cpp +33 -25
- package/Microsoft.ReactNative/Utils/LocalBundleReader.h +5 -3
- package/Microsoft.ReactNative/Utils/UwpScriptStore.cpp +2 -2
- package/Microsoft.ReactNative/Utils/UwpScriptStore.h +3 -2
- package/Microsoft.ReactNative.Managed/Microsoft.ReactNative.Managed.csproj +3 -3
- package/Microsoft.ReactNative.Managed.CodeGen/Microsoft.ReactNative.Managed.CodeGen.csproj +10 -10
- package/Microsoft.ReactNative.Managed.CodeGen/Properties/PublishProfiles/DeployAsTool-Debug.pubxml +1 -1
- package/Microsoft.ReactNative.Managed.CodeGen/Properties/PublishProfiles/DeployAsTool-Release.pubxml +1 -1
- package/PropertySheets/CIBuildOptimizations.props +2 -2
- package/PropertySheets/Generated/PackageVersion.g.props +3 -3
- package/PropertySheets/JSEngine.props +1 -1
- package/PropertySheets/NuGet.LockFile.props +10 -1
- package/PropertySheets/React.Cpp.props +7 -6
- package/PropertySheets/WinUI.props +2 -2
- package/ReactCommon/ReactCommon.vcxproj +0 -5
- package/Scripts/JustMyXaml.ps1 +8 -8
- package/Scripts/NuGetRestoreForceEvaluateAllSolutions.ps1 +61 -6
- package/Scripts/Tfs/Layout-Desktop-Headers.ps1 +4 -37
- package/Scripts/UnitTest.ps1 +3 -1
- package/Scripts/UpdateNightlyDependencies.ps1 +47 -0
- package/Scripts/creaternwapp.cmd +5 -8
- package/Scripts/creaternwlib.cmd +10 -23
- package/Scripts/rnw-dependencies.ps1 +15 -16
- package/Shared/DevSupportManager.cpp +55 -48
- package/Shared/DevSupportManager.h +0 -1
- package/Shared/Modules/IWebSocketModuleContentHandler.h +15 -0
- package/Shared/Modules/WebSocketModule.cpp +8 -3
- package/Shared/Networking/DefaultBlobResource.cpp +37 -0
- package/Shared/Networking/DefaultBlobResource.h +12 -0
- package/Shared/Networking/WinRTWebSocketResource.h +5 -1
- package/Shared/Shared.vcxitems +2 -0
- package/{Folly → external}/.clang-format +0 -1
- package/external/External.vcxitems +10 -0
- package/external/fast-float/.syncignore +10 -0
- package/external/fast-float/LICENSE-APACHE +190 -0
- package/external/fast-float/LICENSE-BOOST +23 -0
- package/external/fast-float/LICENSE-MIT +27 -0
- package/external/fast-float/README.md +545 -0
- package/external/fast-float/cgmanifest.json +15 -0
- package/external/fast-float/fast-float.vcxitems +14 -0
- package/external/fast-float/include/fast_float/ascii_number.h +588 -0
- package/external/fast-float/include/fast_float/bigint.h +638 -0
- package/external/fast-float/include/fast_float/constexpr_feature_detect.h +46 -0
- package/external/fast-float/include/fast_float/decimal_to_binary.h +212 -0
- package/external/fast-float/include/fast_float/digit_comparison.h +457 -0
- package/external/fast-float/include/fast_float/fast_float.h +59 -0
- package/external/fast-float/include/fast_float/fast_table.h +708 -0
- package/external/fast-float/include/fast_float/float_common.h +1240 -0
- package/external/fast-float/include/fast_float/parse_number.h +399 -0
- package/external/fast-float/sync-config.json +8 -0
- package/external/fmt/.syncignore +10 -0
- package/external/fmt/CONTRIBUTING.md +20 -0
- package/external/fmt/LICENSE +27 -0
- package/external/fmt/README.md +484 -0
- package/external/fmt/doc/ChangeLog-old.md +3290 -0
- package/external/fmt/doc/api.md +650 -0
- package/external/fmt/doc/fmt.css +61 -0
- package/external/fmt/doc/fmt.js +4 -0
- package/external/fmt/doc/get-started.md +222 -0
- package/external/fmt/doc/index.md +151 -0
- package/external/fmt/doc/perf.svg +1 -0
- package/external/fmt/doc/python-license.txt +290 -0
- package/external/fmt/doc/syntax.md +887 -0
- package/external/fmt/fmt.vcxitems +28 -0
- package/external/fmt/include/fmt/args.h +228 -0
- package/external/fmt/include/fmt/base.h +3077 -0
- package/external/fmt/include/fmt/chrono.h +2432 -0
- package/external/fmt/include/fmt/color.h +612 -0
- package/external/fmt/include/fmt/compile.h +529 -0
- package/external/fmt/include/fmt/core.h +5 -0
- package/external/fmt/include/fmt/format-inl.h +1928 -0
- package/external/fmt/include/fmt/format.h +4427 -0
- package/external/fmt/include/fmt/os.h +439 -0
- package/external/fmt/include/fmt/ostream.h +211 -0
- package/external/fmt/include/fmt/printf.h +656 -0
- package/external/fmt/include/fmt/ranges.h +882 -0
- package/external/fmt/include/fmt/std.h +699 -0
- package/external/fmt/include/fmt/xchar.h +322 -0
- package/external/fmt/src/fmt.cc +135 -0
- package/external/fmt/src/format.cc +43 -0
- package/external/fmt/src/os.cc +403 -0
- package/external/fmt/sync-config.json +8 -0
- package/external/folly/.syncignore +60 -0
- package/external/folly/LICENSE +200 -0
- package/external/folly/README.md +263 -0
- package/{fmt → external/folly/folly}/.clang-format +0 -1
- package/external/folly/folly/AtomicHashArray-inl.h +546 -0
- package/external/folly/folly/AtomicHashArray.h +431 -0
- package/external/folly/folly/AtomicHashMap-inl.h +653 -0
- package/external/folly/folly/AtomicHashMap.h +484 -0
- package/external/folly/folly/AtomicIntrusiveLinkedList.h +206 -0
- package/external/folly/folly/AtomicLinkedList.h +110 -0
- package/external/folly/folly/AtomicUnorderedMap.h +522 -0
- package/external/folly/folly/BUCK +1631 -0
- package/external/folly/folly/BUILD_MODE.bzl +72 -0
- package/external/folly/folly/Benchmark.cpp +986 -0
- package/external/folly/folly/Benchmark.h +680 -0
- package/external/folly/folly/BenchmarkUtil.h +47 -0
- package/external/folly/folly/Bits.h +17 -0
- package/external/folly/folly/CMakeLists.txt +110 -0
- package/external/folly/folly/CPortability.h +338 -0
- package/external/folly/folly/CancellationToken-inl.h +449 -0
- package/external/folly/folly/CancellationToken.cpp +250 -0
- package/external/folly/folly/CancellationToken.h +365 -0
- package/external/folly/folly/Chrono.h +132 -0
- package/external/folly/folly/ClockGettimeWrappers.cpp +93 -0
- package/external/folly/folly/ClockGettimeWrappers.h +29 -0
- package/external/folly/folly/ConcurrentBitSet.h +157 -0
- package/external/folly/folly/ConcurrentLazy.h +74 -0
- package/external/folly/folly/ConcurrentSkipList-inl.h +341 -0
- package/external/folly/folly/ConcurrentSkipList.h +824 -0
- package/external/folly/folly/ConstructorCallbackList.h +158 -0
- package/external/folly/folly/Conv.h +2026 -0
- package/external/folly/folly/CppAttributes.h +170 -0
- package/external/folly/folly/CpuId.h +297 -0
- package/external/folly/folly/DefaultKeepAliveExecutor.h +172 -0
- package/external/folly/folly/Demangle.cpp +255 -0
- package/external/folly/folly/Demangle.h +73 -0
- package/external/folly/folly/DiscriminatedPtr.h +236 -0
- package/external/folly/folly/DynamicConverter.h +17 -0
- package/external/folly/folly/Exception.h +150 -0
- package/external/folly/folly/ExceptionString.cpp +51 -0
- package/external/folly/folly/ExceptionString.h +33 -0
- package/external/folly/folly/ExceptionWrapper-inl.h +264 -0
- package/external/folly/folly/ExceptionWrapper.cpp +37 -0
- package/external/folly/folly/ExceptionWrapper.h +377 -0
- package/external/folly/folly/Executor.cpp +111 -0
- package/external/folly/folly/Executor.h +351 -0
- package/external/folly/folly/Expected.h +1725 -0
- package/external/folly/folly/FBString.h +2888 -0
- package/external/folly/folly/FBVector.h +17 -0
- package/external/folly/folly/File.cpp +180 -0
- package/external/folly/folly/File.h +177 -0
- package/external/folly/folly/FileUtil.cpp +378 -0
- package/external/folly/folly/FileUtil.h +332 -0
- package/external/folly/folly/Fingerprint.cpp +135 -0
- package/external/folly/folly/Fingerprint.h +289 -0
- package/external/folly/folly/FixedString.h +2965 -0
- package/external/folly/folly/FollyMemcpy.cpp +30 -0
- package/external/folly/folly/FollyMemcpy.h +23 -0
- package/external/folly/folly/FollyMemset.cpp +29 -0
- package/external/folly/folly/FollyMemset.h +25 -0
- package/external/folly/folly/Format-inl.h +1152 -0
- package/external/folly/folly/Format.cpp +429 -0
- package/external/folly/folly/Format.h +463 -0
- package/external/folly/folly/FormatArg.h +285 -0
- package/external/folly/folly/FormatTraits.h +65 -0
- package/external/folly/folly/Function.h +1159 -0
- package/external/folly/folly/GLog.h +85 -0
- package/external/folly/folly/GroupVarint.cpp +153 -0
- package/external/folly/folly/GroupVarint.h +630 -0
- package/external/folly/folly/Hash.h +20 -0
- package/external/folly/folly/IPAddress.cpp +490 -0
- package/external/folly/folly/IPAddress.h +667 -0
- package/external/folly/folly/IPAddressException.h +82 -0
- package/external/folly/folly/IPAddressV4.cpp +305 -0
- package/external/folly/folly/IPAddressV4.h +495 -0
- package/external/folly/folly/IPAddressV6.cpp +541 -0
- package/external/folly/folly/IPAddressV6.h +627 -0
- package/external/folly/folly/Indestructible.h +164 -0
- package/external/folly/folly/IndexedMemPool.h +550 -0
- package/external/folly/folly/IntrusiveList.h +17 -0
- package/external/folly/folly/Lazy.h +142 -0
- package/external/folly/folly/Likely.h +76 -0
- package/external/folly/folly/MPMCPipeline.h +280 -0
- package/external/folly/folly/MPMCQueue.h +1556 -0
- package/external/folly/folly/MacAddress.cpp +188 -0
- package/external/folly/folly/MacAddress.h +260 -0
- package/external/folly/folly/MapUtil.h +17 -0
- package/external/folly/folly/Math.h +258 -0
- package/external/folly/folly/MaybeManagedPtr.h +120 -0
- package/external/folly/folly/Memory.h +900 -0
- package/external/folly/folly/MicroLock.cpp +76 -0
- package/external/folly/folly/MicroLock.h +354 -0
- package/external/folly/folly/MicroSpinLock.h +17 -0
- package/external/folly/folly/MoveWrapper.h +76 -0
- package/external/folly/folly/ObserverContainer.h +1026 -0
- package/external/folly/folly/Optional.h +743 -0
- package/external/folly/folly/Overload.h +325 -0
- package/external/folly/folly/PackedSyncPtr.h +147 -0
- package/external/folly/folly/Padded.h +464 -0
- package/external/folly/folly/Poly-inl.h +230 -0
- package/external/folly/folly/Poly.h +1095 -0
- package/external/folly/folly/PolyException.h +43 -0
- package/external/folly/folly/Portability.h +644 -0
- package/external/folly/folly/Preprocessor.h +236 -0
- package/external/folly/folly/ProducerConsumerQueue.h +182 -0
- package/external/folly/folly/RWSpinLock.h +17 -0
- package/external/folly/folly/Random-inl.h +86 -0
- package/external/folly/folly/Random.cpp +184 -0
- package/external/folly/folly/Random.h +434 -0
- package/external/folly/folly/Range.h +1772 -0
- package/external/folly/folly/Replaceable.h +636 -0
- package/external/folly/folly/ScopeGuard.cpp +29 -0
- package/external/folly/folly/ScopeGuard.h +420 -0
- package/external/folly/folly/SharedMutex.cpp +81 -0
- package/external/folly/folly/SharedMutex.h +1751 -0
- package/external/folly/folly/Singleton-inl.h +332 -0
- package/external/folly/folly/Singleton.cpp +512 -0
- package/external/folly/folly/Singleton.h +891 -0
- package/external/folly/folly/SingletonThreadLocal.cpp +53 -0
- package/external/folly/folly/SingletonThreadLocal.h +263 -0
- package/external/folly/folly/SocketAddress.cpp +786 -0
- package/external/folly/folly/SocketAddress.h +768 -0
- package/external/folly/folly/SpinLock.h +55 -0
- package/external/folly/folly/String-inl.h +668 -0
- package/external/folly/folly/String.cpp +777 -0
- package/external/folly/folly/String.h +767 -0
- package/external/folly/folly/Subprocess.cpp +1142 -0
- package/external/folly/folly/Subprocess.h +1055 -0
- package/external/folly/folly/Synchronized.h +1833 -0
- package/external/folly/folly/SynchronizedPtr.h +106 -0
- package/external/folly/folly/ThreadCachedInt.h +175 -0
- package/external/folly/folly/ThreadLocal.h +478 -0
- package/external/folly/folly/TimeoutQueue.cpp +78 -0
- package/external/folly/folly/TimeoutQueue.h +123 -0
- package/external/folly/folly/TokenBucket.h +673 -0
- package/external/folly/folly/Traits.h +1442 -0
- package/external/folly/folly/Try-inl.h +372 -0
- package/external/folly/folly/Try.cpp +23 -0
- package/external/folly/folly/Try.h +728 -0
- package/external/folly/folly/UTF8String.h +56 -0
- package/external/folly/folly/Unicode.cpp +201 -0
- package/external/folly/folly/Unicode.h +94 -0
- package/external/folly/folly/Unit.h +65 -0
- package/external/folly/folly/Uri-inl.h +101 -0
- package/external/folly/folly/Uri.cpp +190 -0
- package/external/folly/folly/Uri.h +142 -0
- package/external/folly/folly/Utility.h +932 -0
- package/external/folly/folly/VERSION +1 -0
- package/external/folly/folly/Varint.h +230 -0
- package/external/folly/folly/VirtualExecutor.h +17 -0
- package/external/folly/folly/algorithm/simd/BUCK +47 -0
- package/external/folly/folly/algorithm/simd/Contains.cpp +42 -0
- package/external/folly/folly/algorithm/simd/Contains.h +116 -0
- package/external/folly/folly/algorithm/simd/FindFixed.h +301 -0
- package/external/folly/folly/algorithm/simd/Ignore.h +52 -0
- package/external/folly/folly/algorithm/simd/Movemask.h +207 -0
- package/external/folly/folly/algorithm/simd/detail/BUCK +70 -0
- package/external/folly/folly/algorithm/simd/detail/ContainsImpl.h +91 -0
- package/external/folly/folly/algorithm/simd/detail/SimdAnyOf.h +83 -0
- package/external/folly/folly/algorithm/simd/detail/SimdForEach.h +209 -0
- package/external/folly/folly/algorithm/simd/detail/SimdPlatform.h +445 -0
- package/external/folly/folly/algorithm/simd/detail/Traits.h +125 -0
- package/external/folly/folly/algorithm/simd/detail/UnrollUtils.h +126 -0
- package/external/folly/folly/base64.h +264 -0
- package/external/folly/folly/chrono/BUCK +29 -0
- package/external/folly/folly/chrono/Clock.h +65 -0
- package/external/folly/folly/chrono/Conv.h +712 -0
- package/external/folly/folly/chrono/test/BUCK +26 -0
- package/external/folly/folly/chrono/test/ClockTest.cpp +68 -0
- package/external/folly/folly/chrono/test/ConvTest.cpp +652 -0
- package/external/folly/folly/concurrency/AtomicSharedPtr.h +387 -0
- package/external/folly/folly/concurrency/BUCK +170 -0
- package/external/folly/folly/concurrency/CacheLocality.h +460 -0
- package/external/folly/folly/concurrency/ConcurrentHashMap.h +822 -0
- package/external/folly/folly/concurrency/CoreCachedSharedPtr.h +232 -0
- package/external/folly/folly/concurrency/DeadlockDetector.cpp +27 -0
- package/external/folly/folly/concurrency/DeadlockDetector.h +44 -0
- package/external/folly/folly/concurrency/DynamicBoundedQueue.h +751 -0
- package/external/folly/folly/concurrency/PriorityUnboundedQueueSet.h +207 -0
- package/external/folly/folly/concurrency/ProcessLocalUniqueId.cpp +46 -0
- package/external/folly/folly/concurrency/ProcessLocalUniqueId.h +38 -0
- package/external/folly/folly/concurrency/SingletonRelaxedCounter.h +325 -0
- package/external/folly/folly/concurrency/ThreadCachedSynchronized.h +227 -0
- package/external/folly/folly/concurrency/UnboundedQueue.h +891 -0
- package/external/folly/folly/concurrency/container/BUCK +77 -0
- package/external/folly/folly/concurrency/container/FlatCombiningPriorityQueue.h +426 -0
- package/external/folly/folly/concurrency/container/LockFreeRingBuffer.h +306 -0
- package/external/folly/folly/concurrency/container/RelaxedConcurrentPriorityQueue.h +1212 -0
- package/external/folly/folly/concurrency/container/SingleWriterFixedHashMap.h +322 -0
- package/external/folly/folly/concurrency/container/atomic_grow_array.h +564 -0
- package/external/folly/folly/concurrency/container/test/BUCK +75 -0
- package/external/folly/folly/concurrency/container/test/FlatCombiningPriorityQueueTest.cpp +570 -0
- package/external/folly/folly/concurrency/container/test/LockFreeRingBufferTest.cpp +276 -0
- package/external/folly/folly/concurrency/container/test/RelaxedConcurrentPriorityQueueTest.cpp +1570 -0
- package/external/folly/folly/concurrency/container/test/SingleWriterFixedHashMapTest.cpp +401 -0
- package/external/folly/folly/concurrency/container/test/atomic_grow_array_test.cpp +187 -0
- package/external/folly/folly/concurrency/detail/AtomicSharedPtr-detail.h +212 -0
- package/external/folly/folly/concurrency/detail/ConcurrentHashMap-detail.h +1911 -0
- package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.cpp +43 -0
- package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.h +190 -0
- package/external/folly/folly/concurrency/memory/BUCK +53 -0
- package/external/folly/folly/concurrency/memory/PrimaryPtr.h +338 -0
- package/external/folly/folly/concurrency/memory/ReadMostlySharedPtr.h +511 -0
- package/external/folly/folly/concurrency/memory/TLRefCount.h +228 -0
- package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrBenchmark.cpp +56 -0
- package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrTest.cpp +454 -0
- package/external/folly/folly/concurrency/memory/test/BUCK +95 -0
- package/external/folly/folly/concurrency/memory/test/PrimaryPtrTest.cpp +303 -0
- package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrBenchmark.cpp +138 -0
- package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrStressTest.cpp +75 -0
- package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrTest.cpp +378 -0
- package/external/folly/folly/concurrency/memory/test/RefCountBenchmark.cpp +90 -0
- package/external/folly/folly/concurrency/memory/test/RefCountTest.cpp +168 -0
- package/external/folly/folly/concurrency/test/AtomicSharedPtrCounted.h +156 -0
- package/external/folly/folly/concurrency/test/AtomicSharedPtrPerformance.cpp +255 -0
- package/external/folly/folly/concurrency/test/AtomicSharedPtrTest.cpp +257 -0
- package/external/folly/folly/concurrency/test/BUCK +229 -0
- package/external/folly/folly/concurrency/test/CacheLocalityBenchmark.cpp +392 -0
- package/external/folly/folly/concurrency/test/CacheLocalityTest.cpp +1229 -0
- package/external/folly/folly/concurrency/test/ConcurrentHashMapBench.cpp +260 -0
- package/external/folly/folly/concurrency/test/ConcurrentHashMapTest.cpp +1242 -0
- package/external/folly/folly/concurrency/test/CoreCachedSharedPtrTest.cpp +408 -0
- package/external/folly/folly/concurrency/test/DynamicBoundedQueueTest.cpp +984 -0
- package/external/folly/folly/concurrency/test/PriorityUnboundedQueueSetTest.cpp +73 -0
- package/external/folly/folly/concurrency/test/ProcessLocalUniqueIdTest.cpp +66 -0
- package/external/folly/folly/concurrency/test/SingletonRelaxedCounterBench.cpp +101 -0
- package/external/folly/folly/concurrency/test/SingletonRelaxedCounterTest.cpp +185 -0
- package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedBench.cpp +76 -0
- package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedTest.cpp +93 -0
- package/external/folly/folly/concurrency/test/UnboundedQueueTest.cpp +1302 -0
- package/external/folly/folly/container/Access.h +57 -0
- package/external/folly/folly/container/Array.h +87 -0
- package/external/folly/folly/container/BUCK +353 -0
- package/external/folly/folly/container/BitIterator.h +203 -0
- package/external/folly/folly/container/Enumerate.h +162 -0
- package/external/folly/folly/container/EvictingCacheMap.h +730 -0
- package/external/folly/folly/container/F14.md +300 -0
- package/external/folly/folly/container/F14Map-fwd.h +113 -0
- package/external/folly/folly/container/F14Map.h +2108 -0
- package/external/folly/folly/container/F14Set-fwd.h +95 -0
- package/external/folly/folly/container/F14Set.h +1603 -0
- package/external/folly/folly/container/FBVector.h +1711 -0
- package/external/folly/folly/container/Foreach-inl.h +316 -0
- package/external/folly/folly/container/Foreach.h +209 -0
- package/external/folly/folly/container/HeterogeneousAccess-fwd.h +33 -0
- package/external/folly/folly/container/HeterogeneousAccess.h +171 -0
- package/external/folly/folly/container/IntrusiveHeap.h +268 -0
- package/external/folly/folly/container/IntrusiveList.h +131 -0
- package/external/folly/folly/container/Iterator.h +843 -0
- package/external/folly/folly/container/MapUtil.h +376 -0
- package/external/folly/folly/container/Merge.h +90 -0
- package/external/folly/folly/container/RegexMatchCache.cpp +521 -0
- package/external/folly/folly/container/RegexMatchCache.h +699 -0
- package/external/folly/folly/container/Reserve.h +109 -0
- package/external/folly/folly/container/SparseByteSet.h +123 -0
- package/external/folly/folly/container/View.h +81 -0
- package/external/folly/folly/container/WeightedEvictingCacheMap.h +651 -0
- package/external/folly/folly/container/detail/BUCK +115 -0
- package/external/folly/folly/container/detail/BitIteratorDetail.h +87 -0
- package/external/folly/folly/container/detail/F14Defaults.h +34 -0
- package/external/folly/folly/container/detail/F14IntrinsicsAvailability.h +67 -0
- package/external/folly/folly/container/detail/F14MapFallback.h +717 -0
- package/external/folly/folly/container/detail/F14Mask.h +235 -0
- package/external/folly/folly/container/detail/F14Policy.h +1523 -0
- package/external/folly/folly/container/detail/F14SetFallback.h +528 -0
- package/external/folly/folly/container/detail/F14Table.cpp +71 -0
- package/external/folly/folly/container/detail/F14Table.h +2680 -0
- package/external/folly/folly/container/detail/Util.h +303 -0
- package/external/folly/folly/container/detail/tape_detail.h +135 -0
- package/external/folly/folly/container/detail/test/BUCK +14 -0
- package/external/folly/folly/container/detail/test/F14DetailTest.cpp +47 -0
- package/external/folly/folly/container/heap_vector_types.h +1683 -0
- package/external/folly/folly/container/range_traits.h +81 -0
- package/external/folly/folly/container/small_vector.h +1476 -0
- package/external/folly/folly/container/sorted_vector_types.h +1652 -0
- package/external/folly/folly/container/span.h +408 -0
- package/external/folly/folly/container/tape.h +608 -0
- package/external/folly/folly/container/test/.clang-tidy +12 -0
- package/external/folly/folly/container/test/AccessTest.cpp +138 -0
- package/external/folly/folly/container/test/ArrayTest.cpp +84 -0
- package/external/folly/folly/container/test/BUCK +568 -0
- package/external/folly/folly/container/test/BitIteratorBench.cpp +112 -0
- package/external/folly/folly/container/test/BitIteratorTest.cpp +109 -0
- package/external/folly/folly/container/test/EnumerateTest.cpp +294 -0
- package/external/folly/folly/container/test/EvictingCacheMapBench.cpp +80 -0
- package/external/folly/folly/container/test/EvictingCacheMapTest.cpp +842 -0
- package/external/folly/folly/container/test/F14AsanSupportTest.cpp +143 -0
- package/external/folly/folly/container/test/F14FwdTest.cpp +37 -0
- package/external/folly/folly/container/test/F14InterprocessTest.cpp +404 -0
- package/external/folly/folly/container/test/F14MapTest.cpp +2543 -0
- package/external/folly/folly/container/test/F14PolicyTest.cpp +49 -0
- package/external/folly/folly/container/test/F14SetTest.cpp +1738 -0
- package/external/folly/folly/container/test/F14SmallOverheads.cpp +215 -0
- package/external/folly/folly/container/test/F14TestUtil.h +117 -0
- package/external/folly/folly/container/test/FBVectorBenchmark.cpp +380 -0
- package/external/folly/folly/container/test/FBVectorBenchmarks.cpp.h +100 -0
- package/external/folly/folly/container/test/FBVectorTest.cpp +326 -0
- package/external/folly/folly/container/test/FBVectorTests.cpp.h +304 -0
- package/external/folly/folly/container/test/ForeachBenchmark.cpp +388 -0
- package/external/folly/folly/container/test/ForeachTest.cpp +338 -0
- package/external/folly/folly/container/test/HashMapsBench.cpp +458 -0
- package/external/folly/folly/container/test/HeterogeneousAccessTest.cpp +242 -0
- package/external/folly/folly/container/test/IntrusiveHeapTest.cpp +262 -0
- package/external/folly/folly/container/test/IteratorTest.cpp +989 -0
- package/external/folly/folly/container/test/MapUtilTest.cpp +365 -0
- package/external/folly/folly/container/test/MergeTest.cpp +66 -0
- package/external/folly/folly/container/test/RegexMatchCacheTest.cpp +634 -0
- package/external/folly/folly/container/test/ReserveTest.cpp +173 -0
- package/external/folly/folly/container/test/SparseByteSetBenchmark.cpp +153 -0
- package/external/folly/folly/container/test/SparseByteSetTest.cpp +117 -0
- package/external/folly/folly/container/test/TrackingTypes.h +584 -0
- package/external/folly/folly/container/test/UtilTest.cpp +609 -0
- package/external/folly/folly/container/test/WeightedEvictingCacheMapTest.cpp +800 -0
- package/external/folly/folly/container/test/heap_vector_types_test.cpp +1774 -0
- package/external/folly/folly/container/test/range_traits_test.cpp +59 -0
- package/external/folly/folly/container/test/small_vector_test.cpp +1571 -0
- package/external/folly/folly/container/test/sorted_vector_test.cpp +1589 -0
- package/external/folly/folly/container/test/span_test.cpp +520 -0
- package/external/folly/folly/container/test/tape_bench.cpp +200 -0
- package/external/folly/folly/container/test/tape_test.cpp +590 -0
- package/external/folly/folly/defs.bzl +238 -0
- package/external/folly/folly/detail/AsyncTrace.cpp +36 -0
- package/external/folly/folly/detail/AsyncTrace.h +44 -0
- package/external/folly/folly/detail/AtomicHashUtils.h +42 -0
- package/external/folly/folly/detail/AtomicUnorderedMapUtils.h +80 -0
- package/external/folly/folly/detail/BUCK +406 -0
- package/external/folly/folly/detail/DiscriminatedPtrDetail.h +172 -0
- package/external/folly/folly/detail/FileUtilDetail.cpp +63 -0
- package/external/folly/folly/detail/FileUtilDetail.h +85 -0
- package/external/folly/folly/detail/FileUtilVectorDetail.h +81 -0
- package/external/folly/folly/detail/FingerprintPolynomial.h +132 -0
- package/external/folly/folly/detail/Futex-inl.h +123 -0
- package/external/folly/folly/detail/Futex.cpp +273 -0
- package/external/folly/folly/detail/Futex.h +109 -0
- package/external/folly/folly/detail/GroupVarintDetail.h +101 -0
- package/external/folly/folly/detail/IPAddress.cpp +37 -0
- package/external/folly/folly/detail/IPAddress.h +57 -0
- package/external/folly/folly/detail/IPAddressSource.h +278 -0
- package/external/folly/folly/detail/Iterators.h +156 -0
- package/external/folly/folly/detail/MPMCPipelineDetail.h +122 -0
- package/external/folly/folly/detail/MemoryIdler.cpp +233 -0
- package/external/folly/folly/detail/MemoryIdler.h +216 -0
- package/external/folly/folly/detail/PerfScoped.cpp +112 -0
- package/external/folly/folly/detail/PerfScoped.h +70 -0
- package/external/folly/folly/detail/PolyDetail.h +921 -0
- package/external/folly/folly/detail/RangeCommon.cpp +55 -0
- package/external/folly/folly/detail/RangeCommon.h +93 -0
- package/external/folly/folly/detail/RangeSse42.cpp +198 -0
- package/external/folly/folly/detail/RangeSse42.h +30 -0
- package/external/folly/folly/detail/SimpleSimdStringUtils.cpp +31 -0
- package/external/folly/folly/detail/SimpleSimdStringUtils.h +27 -0
- package/external/folly/folly/detail/SimpleSimdStringUtilsImpl.h +63 -0
- package/external/folly/folly/detail/Singleton.h +34 -0
- package/external/folly/folly/detail/SlowFingerprint.h +90 -0
- package/external/folly/folly/detail/SocketFastOpen.cpp +175 -0
- package/external/folly/folly/detail/SocketFastOpen.h +89 -0
- package/external/folly/folly/detail/SplitStringSimd.cpp +84 -0
- package/external/folly/folly/detail/SplitStringSimd.h +151 -0
- package/external/folly/folly/detail/SplitStringSimdImpl.h +149 -0
- package/external/folly/folly/detail/Sse.cpp +35 -0
- package/external/folly/folly/detail/Sse.h +45 -0
- package/external/folly/folly/detail/StaticSingletonManager.cpp +119 -0
- package/external/folly/folly/detail/StaticSingletonManager.h +298 -0
- package/external/folly/folly/detail/ThreadLocalDetail.cpp +492 -0
- package/external/folly/folly/detail/ThreadLocalDetail.h +800 -0
- package/external/folly/folly/detail/TrapOnAvx512.cpp +41 -0
- package/external/folly/folly/detail/TrapOnAvx512.h +21 -0
- package/external/folly/folly/detail/TurnSequencer.h +295 -0
- package/external/folly/folly/detail/TypeList.h +551 -0
- package/external/folly/folly/detail/UniqueInstance.cpp +136 -0
- package/external/folly/folly/detail/UniqueInstance.h +68 -0
- package/external/folly/folly/detail/base64_detail/BUCK +102 -0
- package/external/folly/folly/detail/base64_detail/Base64Api.cpp +40 -0
- package/external/folly/folly/detail/base64_detail/Base64Api.h +101 -0
- package/external/folly/folly/detail/base64_detail/Base64Common.h +80 -0
- package/external/folly/folly/detail/base64_detail/Base64Constants.h +79 -0
- package/external/folly/folly/detail/base64_detail/Base64HiddenConstants.h +129 -0
- package/external/folly/folly/detail/base64_detail/Base64SWAR.cpp +161 -0
- package/external/folly/folly/detail/base64_detail/Base64SWAR.h +32 -0
- package/external/folly/folly/detail/base64_detail/Base64Scalar.h +262 -0
- package/external/folly/folly/detail/base64_detail/Base64Simd.h +102 -0
- package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.cpp +42 -0
- package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.h +33 -0
- package/external/folly/folly/detail/base64_detail/Base64_SSE4_2_Platform.h +167 -0
- package/external/folly/folly/detail/base64_detail/README.md +392 -0
- package/external/folly/folly/detail/base64_detail/tests/BUCK +36 -0
- package/external/folly/folly/detail/base64_detail/tests/Base64AgainstScalarTest.cpp +141 -0
- package/external/folly/folly/detail/base64_detail/tests/Base64PlatformTest.cpp +273 -0
- package/external/folly/folly/detail/base64_detail/tests/Base64SpecialCasesTest.cpp +555 -0
- package/external/folly/folly/detail/test/AsyncTraceTest.cpp +43 -0
- package/external/folly/folly/detail/test/BUCK +118 -0
- package/external/folly/folly/detail/test/FileUtilDetailTest.cpp +56 -0
- package/external/folly/folly/detail/test/PerfScopedTest.cpp +107 -0
- package/external/folly/folly/detail/test/SimpleSimdStringUtilsTest.cpp +92 -0
- package/external/folly/folly/detail/test/SplitStringSimdTest.cpp +242 -0
- package/external/folly/folly/detail/test/StaticSingletonManagerTest.cpp +121 -0
- package/external/folly/folly/detail/test/ThreadLocalBenchmark.cpp +116 -0
- package/external/folly/folly/detail/test/ThreadLocalDetailTest.cpp +194 -0
- package/external/folly/folly/detail/test/TrapOnAvx512TestNegative.cpp +29 -0
- package/external/folly/folly/detail/test/UniqueInstanceTest.cpp +60 -0
- package/external/folly/folly/detail/thread_local_globals.cpp +69 -0
- package/external/folly/folly/detail/thread_local_globals.h +36 -0
- package/external/folly/folly/docs/AtomicHashMap.md +134 -0
- package/external/folly/folly/docs/Benchmark.md +310 -0
- package/external/folly/folly/docs/Conv.md +291 -0
- package/external/folly/folly/docs/Dynamic.md +220 -0
- package/external/folly/folly/docs/DynamicConverter.md +71 -0
- package/external/folly/folly/docs/Executors.md +63 -0
- package/external/folly/folly/docs/FBString.md +46 -0
- package/external/folly/folly/docs/FBVector.md +200 -0
- package/external/folly/folly/docs/Fbvector--graphical_solutions.png +0 -0
- package/external/folly/folly/docs/Format.md +177 -0
- package/external/folly/folly/docs/Function.md +92 -0
- package/external/folly/folly/docs/Futures.md +263 -0
- package/external/folly/folly/docs/GroupVarint.md +46 -0
- package/external/folly/folly/docs/Histogram.md +104 -0
- package/external/folly/folly/docs/MapUtils.md +80 -0
- package/external/folly/folly/docs/Overview.md +263 -0
- package/external/folly/folly/docs/PackedSyncPtr.md +77 -0
- package/external/folly/folly/docs/Poly.md +500 -0
- package/external/folly/folly/docs/ProducerConsumerQueue.md +82 -0
- package/external/folly/folly/docs/Rcu.md +218 -0
- package/external/folly/folly/docs/SmallLocks.md +24 -0
- package/external/folly/folly/docs/Synchronized.md +793 -0
- package/external/folly/folly/docs/ThreadCachedInt.md +98 -0
- package/external/folly/folly/docs/ThreadLocal.md +105 -0
- package/external/folly/folly/docs/Traits.md +161 -0
- package/external/folly/folly/docs/small_vector.md +64 -0
- package/external/folly/folly/docs/style.css +23 -0
- package/external/folly/folly/dynamic-inl.h +17 -0
- package/external/folly/folly/dynamic.h +17 -0
- package/external/folly/folly/folly_extended_library.bzl +28 -0
- package/external/folly/folly/functional/ApplyTuple.h +204 -0
- package/external/folly/folly/functional/BUCK +57 -0
- package/external/folly/folly/functional/Invoke.h +880 -0
- package/external/folly/folly/functional/Partial.h +130 -0
- package/external/folly/folly/functional/protocol.h +203 -0
- package/external/folly/folly/functional/test/ApplyTupleTest.cpp +549 -0
- package/external/folly/folly/functional/test/BUCK +57 -0
- package/external/folly/folly/functional/test/InvokeTest.cpp +483 -0
- package/external/folly/folly/functional/test/PartialTest.cpp +141 -0
- package/external/folly/folly/functional/test/protocol_test.cpp +177 -0
- package/external/folly/folly/functional/test/traits_test.cpp +551 -0
- package/external/folly/folly/functional/traits.h +675 -0
- package/external/folly/folly/hash/BUCK +86 -0
- package/external/folly/folly/hash/Checksum.cpp +275 -0
- package/external/folly/folly/hash/Checksum.h +94 -0
- package/external/folly/folly/hash/FarmHash.h +46 -0
- package/external/folly/folly/hash/Hash.h +1045 -0
- package/external/folly/folly/hash/MurmurHash.h +86 -0
- package/external/folly/folly/hash/SpookyHashV1.cpp +391 -0
- package/external/folly/folly/hash/SpookyHashV1.h +307 -0
- package/external/folly/folly/hash/SpookyHashV2.cpp +392 -0
- package/external/folly/folly/hash/SpookyHashV2.h +339 -0
- package/external/folly/folly/hash/detail/BUCK +26 -0
- package/external/folly/folly/hash/detail/ChecksumDetail.cpp +296 -0
- package/external/folly/folly/hash/detail/ChecksumDetail.h +137 -0
- package/external/folly/folly/hash/detail/Crc32CombineDetail.cpp +191 -0
- package/external/folly/folly/hash/detail/Crc32cDetail.cpp +303 -0
- package/external/folly/folly/hash/test/BUCK +132 -0
- package/external/folly/folly/hash/test/ChecksumBenchmark.cpp +91 -0
- package/external/folly/folly/hash/test/ChecksumTest.cpp +587 -0
- package/external/folly/folly/hash/test/FarmHashTest.cpp +41 -0
- package/external/folly/folly/hash/test/HashBenchmark.cpp +238 -0
- package/external/folly/folly/hash/test/HashTest.cpp +997 -0
- package/external/folly/folly/hash/test/MurmurHashTest.cpp +76 -0
- package/external/folly/folly/hash/test/SpookyHashV1Test.cpp +559 -0
- package/external/folly/folly/hash/test/SpookyHashV2Test.cpp +549 -0
- package/external/folly/folly/hash/test/traits_test.cpp +69 -0
- package/external/folly/folly/hash/traits.h +115 -0
- package/external/folly/folly/json/BUCK +155 -0
- package/external/folly/folly/json/DynamicConverter.h +464 -0
- package/external/folly/folly/json/DynamicParser-inl.h +316 -0
- package/external/folly/folly/json/DynamicParser.cpp +198 -0
- package/external/folly/folly/json/DynamicParser.h +394 -0
- package/external/folly/folly/json/JSONSchema.cpp +1030 -0
- package/external/folly/folly/json/JSONSchema.h +73 -0
- package/external/folly/folly/json/JsonMockUtil.h +73 -0
- package/external/folly/folly/json/JsonTestUtil.cpp +167 -0
- package/external/folly/folly/json/JsonTestUtil.h +88 -0
- package/external/folly/folly/json/bser/BUCK +24 -0
- package/external/folly/folly/json/bser/Bser.h +107 -0
- package/external/folly/folly/json/bser/Dump.cpp +253 -0
- package/external/folly/folly/json/bser/Load.cpp +246 -0
- package/external/folly/folly/json/bser/test/BUCK +14 -0
- package/external/folly/folly/json/bser/test/BserTest.cpp +149 -0
- package/external/folly/folly/json/dynamic.cpp +552 -0
- package/external/folly/folly/json/dynamic.h +1346 -0
- package/external/folly/folly/json/json.h +238 -0
- package/external/folly/folly/json/json_patch.cpp +325 -0
- package/external/folly/folly/json/json_patch.h +126 -0
- package/external/folly/folly/json/json_pointer.cpp +114 -0
- package/external/folly/folly/json/json_pointer.h +87 -0
- package/external/folly/folly/json/test/BUCK +147 -0
- package/external/folly/folly/json/test/DynamicBenchmark.cpp +146 -0
- package/external/folly/folly/json/test/DynamicConverterTest.cpp +518 -0
- package/external/folly/folly/json/test/DynamicOtherTest.cpp +344 -0
- package/external/folly/folly/json/test/DynamicParserTest.cpp +443 -0
- package/external/folly/folly/json/test/DynamicTest.cpp +1647 -0
- package/external/folly/folly/json/test/JSONSchemaTest.cpp +450 -0
- package/external/folly/folly/json/test/JsonBenchmark.cpp +264 -0
- package/external/folly/folly/json/test/JsonOtherTest.cpp +51 -0
- package/external/folly/folly/json/test/JsonTest.cpp +1153 -0
- package/external/folly/folly/json/test/JsonTestUtilTest.cpp +97 -0
- package/external/folly/folly/json/test/json_patch_test.cpp +361 -0
- package/external/folly/folly/json/test/json_pointer_test.cpp +58 -0
- package/external/folly/folly/json/tool/BUCK +13 -0
- package/external/folly/folly/json/tool/JSONSchemaTester.cpp +58 -0
- package/external/folly/folly/json.h +17 -0
- package/external/folly/folly/json_patch.h +17 -0
- package/external/folly/folly/json_pointer.h +17 -0
- package/external/folly/folly/lang/Access.h +29 -0
- package/external/folly/folly/lang/Align.h +240 -0
- package/external/folly/folly/lang/Aligned.h +92 -0
- package/external/folly/folly/lang/Assume.h +82 -0
- package/external/folly/folly/lang/BUCK +287 -0
- package/external/folly/folly/lang/Badge.h +108 -0
- package/external/folly/folly/lang/Bits.h +570 -0
- package/external/folly/folly/lang/BitsClass.h +312 -0
- package/external/folly/folly/lang/Builtin.h +74 -0
- package/external/folly/folly/lang/CArray.h +34 -0
- package/external/folly/folly/lang/CString.cpp +86 -0
- package/external/folly/folly/lang/CString.h +55 -0
- package/external/folly/folly/lang/Cast.h +51 -0
- package/external/folly/folly/lang/CheckedMath.h +253 -0
- package/external/folly/folly/lang/CustomizationPoint.h +58 -0
- package/external/folly/folly/lang/Exception.cpp +822 -0
- package/external/folly/folly/lang/Exception.h +716 -0
- package/external/folly/folly/lang/Extern.h +55 -0
- package/external/folly/folly/lang/Hint-inl.h +144 -0
- package/external/folly/folly/lang/Hint.h +238 -0
- package/external/folly/folly/lang/Keep.h +98 -0
- package/external/folly/folly/lang/New.h +124 -0
- package/external/folly/folly/lang/Ordering.h +140 -0
- package/external/folly/folly/lang/Pretty.h +159 -0
- package/external/folly/folly/lang/PropagateConst.h +413 -0
- package/external/folly/folly/lang/RValueReferenceWrapper.h +152 -0
- package/external/folly/folly/lang/SafeAssert.cpp +589 -0
- package/external/folly/folly/lang/StaticConst.h +33 -0
- package/external/folly/folly/lang/Thunk.h +100 -0
- package/external/folly/folly/lang/TypeInfo.h +58 -0
- package/external/folly/folly/lang/UncaughtExceptions.cpp +17 -0
- package/external/folly/folly/lang/UncaughtExceptions.h +19 -0
- package/external/folly/folly/lang/test/AlignTest.cpp +87 -0
- package/external/folly/folly/lang/test/AlignedTest.cpp +130 -0
- package/external/folly/folly/lang/test/BUCK +258 -0
- package/external/folly/folly/lang/test/BadgeTest.cpp +89 -0
- package/external/folly/folly/lang/test/BitsBenchmark.cpp +164 -0
- package/external/folly/folly/lang/test/BitsClassBenchmark.cpp +122 -0
- package/external/folly/folly/lang/test/BitsClassTest.cpp +379 -0
- package/external/folly/folly/lang/test/BitsTest.cpp +577 -0
- package/external/folly/folly/lang/test/CStringTest.cpp +60 -0
- package/external/folly/folly/lang/test/CastTest.cpp +47 -0
- package/external/folly/folly/lang/test/CheckedMathTest.cpp +394 -0
- package/external/folly/folly/lang/test/ExceptionBench.cpp +427 -0
- package/external/folly/folly/lang/test/ExceptionTest.cpp +413 -0
- package/external/folly/folly/lang/test/ExternTest.cpp +39 -0
- package/external/folly/folly/lang/test/HintTest.cpp +100 -0
- package/external/folly/folly/lang/test/NewTest.cpp +38 -0
- package/external/folly/folly/lang/test/OrderingTest.cpp +105 -0
- package/external/folly/folly/lang/test/PrettyTest.cpp +44 -0
- package/external/folly/folly/lang/test/PropagateConstTest.cpp +356 -0
- package/external/folly/folly/lang/test/RValueReferenceWrapperTest.cpp +85 -0
- package/external/folly/folly/lang/test/SafeAssertTest.cpp +75 -0
- package/external/folly/folly/lang/test/ThunkTest.cpp +105 -0
- package/external/folly/folly/lang/test/ToAsciiBench.cpp +466 -0
- package/external/folly/folly/lang/test/ToAsciiTest.cpp +266 -0
- package/external/folly/folly/lang/test/TypeInfoTest.cpp +56 -0
- package/external/folly/folly/memcpy.S +292 -0
- package/external/folly/folly/memcpy_select_aarch64.cpp +145 -0
- package/external/folly/folly/memory/Arena-inl.h +83 -0
- package/external/folly/folly/memory/Arena.h +325 -0
- package/external/folly/folly/memory/BUCK +191 -0
- package/external/folly/folly/memory/JemallocHugePageAllocator.cpp +449 -0
- package/external/folly/folly/memory/JemallocHugePageAllocator.h +105 -0
- package/external/folly/folly/memory/JemallocHugePageAllocatorTest.cpp +341 -0
- package/external/folly/folly/memory/JemallocNodumpAllocator.cpp +176 -0
- package/external/folly/folly/memory/JemallocNodumpAllocator.h +119 -0
- package/external/folly/folly/memory/JemallocNodumpAllocatorTest.cpp +61 -0
- package/external/folly/folly/memory/MallctlHelper.cpp +37 -0
- package/external/folly/folly/memory/MallctlHelper.h +167 -0
- package/external/folly/folly/memory/Malloc.h +551 -0
- package/external/folly/folly/memory/MemoryResource.h +57 -0
- package/external/folly/folly/memory/ReentrantAllocator.cpp +162 -0
- package/external/folly/folly/memory/ReentrantAllocator.h +261 -0
- package/external/folly/folly/memory/SanitizeAddress.cpp +75 -0
- package/external/folly/folly/memory/SanitizeAddress.h +117 -0
- package/external/folly/folly/memory/SanitizeLeak.cpp +119 -0
- package/external/folly/folly/memory/SanitizeLeak.h +108 -0
- package/external/folly/folly/memory/ThreadCachedArena.cpp +53 -0
- package/external/folly/folly/memory/ThreadCachedArena.h +90 -0
- package/external/folly/folly/memory/UninitializedMemoryHacks.h +426 -0
- package/external/folly/folly/memory/detail/BUCK +10 -0
- package/external/folly/folly/memory/detail/MallocImpl.cpp +52 -0
- package/external/folly/folly/memory/detail/MallocImpl.h +97 -0
- package/external/folly/folly/memory/not_null-inl.h +522 -0
- package/external/folly/folly/memory/not_null.h +449 -0
- package/external/folly/folly/memory/test/ArenaTest.cpp +354 -0
- package/external/folly/folly/memory/test/BUCK +146 -0
- package/external/folly/folly/memory/test/MallctlHelperTest.cpp +169 -0
- package/external/folly/folly/memory/test/MallocBenchmark.cpp +91 -0
- package/external/folly/folly/memory/test/MallocTest.cpp +78 -0
- package/external/folly/folly/memory/test/MemoryResourceTest.cpp +31 -0
- package/external/folly/folly/memory/test/ReentrantAllocatorTest.cpp +144 -0
- package/external/folly/folly/memory/test/SanitizeAddressTest.cpp +67 -0
- package/external/folly/folly/memory/test/SanitizeLeakTest.cpp +139 -0
- package/external/folly/folly/memory/test/ThreadCachedArenaTest.cpp +276 -0
- package/external/folly/folly/memory/test/UninitializedMemoryHacksODR.cpp +21 -0
- package/external/folly/folly/memory/test/UninitializedMemoryHacksTest.cpp +327 -0
- package/external/folly/folly/memory/test/not_null_test.cpp +608 -0
- package/external/folly/folly/memset.S +245 -0
- package/external/folly/folly/memset_select_aarch64.cpp +72 -0
- package/external/folly/folly/portability/Asm.h +50 -0
- package/external/folly/folly/portability/Atomic.h +31 -0
- package/external/folly/folly/portability/BUCK +456 -0
- package/external/folly/folly/portability/Builtins.cpp +31 -0
- package/external/folly/folly/portability/Builtins.h +161 -0
- package/external/folly/folly/portability/Config.h +43 -0
- package/external/folly/folly/portability/Constexpr.h +145 -0
- package/external/folly/folly/portability/Dirent.cpp +140 -0
- package/external/folly/folly/portability/Dirent.h +41 -0
- package/external/folly/folly/portability/Event.h +44 -0
- package/external/folly/folly/portability/Fcntl.cpp +120 -0
- package/external/folly/folly/portability/Fcntl.h +67 -0
- package/external/folly/folly/portability/Filesystem.cpp +67 -0
- package/external/folly/folly/portability/Filesystem.h +114 -0
- package/external/folly/folly/portability/FmtCompile.h +40 -0
- package/external/folly/folly/portability/GFlags.h +139 -0
- package/external/folly/folly/portability/GMock.h +35 -0
- package/external/folly/folly/portability/GTest.h +35 -0
- package/external/folly/folly/portability/IOVec.h +34 -0
- package/external/folly/folly/portability/Libgen.cpp +59 -0
- package/external/folly/folly/portability/Libgen.h +29 -0
- package/external/folly/folly/portability/Libunwind.h +21 -0
- package/external/folly/folly/portability/Malloc.cpp +31 -0
- package/external/folly/folly/portability/Malloc.h +53 -0
- package/external/folly/folly/portability/Math.h +90 -0
- package/external/folly/folly/portability/Memory.h +26 -0
- package/external/folly/folly/portability/OpenSSL.cpp +17 -0
- package/external/folly/folly/portability/OpenSSL.h +102 -0
- package/external/folly/folly/portability/PThread.cpp +697 -0
- package/external/folly/folly/portability/PThread.h +148 -0
- package/external/folly/folly/portability/README.md +21 -0
- package/external/folly/folly/portability/Sched.cpp +41 -0
- package/external/folly/folly/portability/Sched.h +45 -0
- package/external/folly/folly/portability/Sockets.cpp +245 -0
- package/external/folly/folly/portability/Sockets.h +155 -0
- package/external/folly/folly/portability/SourceLocation.h +49 -0
- package/external/folly/folly/portability/Stdio.cpp +77 -0
- package/external/folly/folly/portability/Stdio.h +32 -0
- package/external/folly/folly/portability/Stdlib.cpp +172 -0
- package/external/folly/folly/portability/Stdlib.h +64 -0
- package/external/folly/folly/portability/String.cpp +53 -0
- package/external/folly/folly/portability/String.h +39 -0
- package/external/folly/folly/portability/SysFile.cpp +46 -0
- package/external/folly/folly/portability/SysFile.h +27 -0
- package/external/folly/folly/portability/SysMembarrier.cpp +104 -0
- package/external/folly/folly/portability/SysMembarrier.h +26 -0
- package/external/folly/folly/portability/SysMman.cpp +242 -0
- package/external/folly/folly/portability/SysMman.h +68 -0
- package/external/folly/folly/portability/SysResource.cpp +108 -0
- package/external/folly/folly/portability/SysResource.h +71 -0
- package/external/folly/folly/portability/SysStat.cpp +66 -0
- package/external/folly/folly/portability/SysStat.h +52 -0
- package/external/folly/folly/portability/SysSyscall.h +73 -0
- package/external/folly/folly/portability/SysTime.cpp +62 -0
- package/external/folly/folly/portability/SysTime.h +50 -0
- package/external/folly/folly/portability/SysTypes.h +44 -0
- package/external/folly/folly/portability/SysUio.cpp +179 -0
- package/external/folly/folly/portability/SysUio.h +51 -0
- package/external/folly/folly/portability/Syslog.h +39 -0
- package/external/folly/folly/portability/Time.cpp +357 -0
- package/external/folly/folly/portability/Time.h +74 -0
- package/external/folly/folly/portability/Unistd.h +111 -0
- package/external/folly/folly/portability/Windows.h +108 -0
- package/external/folly/folly/portability/openat2.c +30 -0
- package/external/folly/folly/portability/openat2.h +39 -0
- package/external/folly/folly/portability/test/BUCK +59 -0
- package/external/folly/folly/portability/test/ConstexprTest.cpp +102 -0
- package/external/folly/folly/portability/test/FilesystemTest.cpp +35 -0
- package/external/folly/folly/portability/test/LibgenTest.cpp +35 -0
- package/external/folly/folly/portability/test/OpenSSLPortabilityTest.cpp +108 -0
- package/external/folly/folly/portability/test/PThreadTest.cpp +80 -0
- package/external/folly/folly/portability/test/TimeTest.cpp +90 -0
- package/external/folly/folly/small_vector.h +17 -0
- package/external/folly/folly/somerge_defs.bzl +399 -0
- package/external/folly/folly/sorted_vector_types.h +17 -0
- package/external/folly/folly/stop_watch.h +317 -0
- package/external/folly/folly/synchronization/AsymmetricThreadFence.cpp +91 -0
- package/external/folly/folly/synchronization/AsymmetricThreadFence.h +60 -0
- package/external/folly/folly/synchronization/AtomicNotification-inl.h +146 -0
- package/external/folly/folly/synchronization/AtomicNotification.cpp +34 -0
- package/external/folly/folly/synchronization/AtomicNotification.h +117 -0
- package/external/folly/folly/synchronization/AtomicRef.h +181 -0
- package/external/folly/folly/synchronization/AtomicStruct.h +150 -0
- package/external/folly/folly/synchronization/AtomicUtil-inl.h +482 -0
- package/external/folly/folly/synchronization/AtomicUtil.h +179 -0
- package/external/folly/folly/synchronization/BUCK +418 -0
- package/external/folly/folly/synchronization/Baton.h +419 -0
- package/external/folly/folly/synchronization/CallOnce.h +263 -0
- package/external/folly/folly/synchronization/DelayedInit.h +179 -0
- package/external/folly/folly/synchronization/DistributedMutex-inl.h +1744 -0
- package/external/folly/folly/synchronization/DistributedMutex.cpp +27 -0
- package/external/folly/folly/synchronization/DistributedMutex.h +342 -0
- package/external/folly/folly/synchronization/EventCount.h +200 -0
- package/external/folly/folly/synchronization/FlatCombining.h +629 -0
- package/external/folly/folly/synchronization/Hazptr-fwd.h +217 -0
- package/external/folly/folly/synchronization/Hazptr.cpp +36 -0
- package/external/folly/folly/synchronization/Hazptr.h +209 -0
- package/external/folly/folly/synchronization/HazptrDomain.cpp +68 -0
- package/external/folly/folly/synchronization/HazptrDomain.h +832 -0
- package/external/folly/folly/synchronization/HazptrHolder.h +431 -0
- package/external/folly/folly/synchronization/HazptrObj.h +533 -0
- package/external/folly/folly/synchronization/HazptrObjLinked.h +315 -0
- package/external/folly/folly/synchronization/HazptrRec.h +68 -0
- package/external/folly/folly/synchronization/HazptrThrLocal.h +180 -0
- package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.cpp +46 -0
- package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.h +25 -0
- package/external/folly/folly/synchronization/Latch.h +160 -0
- package/external/folly/folly/synchronization/LifoSem.h +767 -0
- package/external/folly/folly/synchronization/Lock.h +887 -0
- package/external/folly/folly/synchronization/MicroSpinLock.h +154 -0
- package/external/folly/folly/synchronization/NativeSemaphore.h +187 -0
- package/external/folly/folly/synchronization/ParkingLot.cpp +37 -0
- package/external/folly/folly/synchronization/ParkingLot.h +330 -0
- package/external/folly/folly/synchronization/PicoSpinLock.h +167 -0
- package/external/folly/folly/synchronization/RWSpinLock.h +549 -0
- package/external/folly/folly/synchronization/Rcu.cpp +26 -0
- package/external/folly/folly/synchronization/Rcu.h +553 -0
- package/external/folly/folly/synchronization/RelaxedAtomic.h +336 -0
- package/external/folly/folly/synchronization/SanitizeThread.cpp +141 -0
- package/external/folly/folly/synchronization/SanitizeThread.h +166 -0
- package/external/folly/folly/synchronization/SaturatingSemaphore.h +324 -0
- package/external/folly/folly/synchronization/SmallLocks.h +36 -0
- package/external/folly/folly/synchronization/ThrottledLifoSem.h +362 -0
- package/external/folly/folly/synchronization/WaitOptions.cpp +25 -0
- package/external/folly/folly/synchronization/WaitOptions.h +75 -0
- package/external/folly/folly/synchronization/detail/AtomicUtils.h +59 -0
- package/external/folly/folly/synchronization/detail/BUCK +104 -0
- package/external/folly/folly/synchronization/detail/Hardware.cpp +192 -0
- package/external/folly/folly/synchronization/detail/Hardware.h +75 -0
- package/external/folly/folly/synchronization/detail/HazptrUtils.h +339 -0
- package/external/folly/folly/synchronization/detail/InlineFunctionRef.h +229 -0
- package/external/folly/folly/synchronization/detail/Sleeper.cpp +27 -0
- package/external/folly/folly/synchronization/detail/Sleeper.h +62 -0
- package/external/folly/folly/synchronization/detail/Spin.h +96 -0
- package/external/folly/folly/synchronization/detail/ThreadCachedLists.h +174 -0
- package/external/folly/folly/synchronization/detail/ThreadCachedReaders.h +189 -0
- package/external/folly/folly/synchronization/detail/ThreadCachedTag.h +26 -0
- package/external/folly/folly/synchronization/detail/test/BUCK +28 -0
- package/external/folly/folly/synchronization/detail/test/HardwareTest.cpp +74 -0
- package/external/folly/folly/synchronization/detail/test/InlineFunctionRefTest.cpp +286 -0
- package/external/folly/folly/synchronization/example/BUCK +27 -0
- package/external/folly/folly/synchronization/example/HazptrLockFreeLIFO.h +88 -0
- package/external/folly/folly/synchronization/example/HazptrSWMRSet.h +133 -0
- package/external/folly/folly/synchronization/example/HazptrWideCAS.h +62 -0
- package/external/folly/folly/synchronization/test/AtomicNotificationTest.cpp +236 -0
- package/external/folly/folly/synchronization/test/AtomicRefTest.cpp +170 -0
- package/external/folly/folly/synchronization/test/AtomicStructTest.cpp +65 -0
- package/external/folly/folly/synchronization/test/AtomicUtilBench.cpp +457 -0
- package/external/folly/folly/synchronization/test/AtomicUtilTest.cpp +650 -0
- package/external/folly/folly/synchronization/test/BUCK +495 -0
- package/external/folly/folly/synchronization/test/Barrier.h +52 -0
- package/external/folly/folly/synchronization/test/BarrierTest.cpp +56 -0
- package/external/folly/folly/synchronization/test/BatonBenchmark.cpp +77 -0
- package/external/folly/folly/synchronization/test/BatonTest.cpp +164 -0
- package/external/folly/folly/synchronization/test/BatonTestHelpers.h +118 -0
- package/external/folly/folly/synchronization/test/CallOnceBenchmark.cpp +72 -0
- package/external/folly/folly/synchronization/test/CallOnceTest.cpp +153 -0
- package/external/folly/folly/synchronization/test/DelayedInitTest.cpp +281 -0
- package/external/folly/folly/synchronization/test/DistributedMutexTest.cpp +2074 -0
- package/external/folly/folly/synchronization/test/EventCountTest.cpp +124 -0
- package/external/folly/folly/synchronization/test/FlatCombiningBenchmark.cpp +1789 -0
- package/external/folly/folly/synchronization/test/FlatCombiningExamples.h +222 -0
- package/external/folly/folly/synchronization/test/FlatCombiningTest.cpp +121 -0
- package/external/folly/folly/synchronization/test/FlatCombiningTestHelpers.h +227 -0
- package/external/folly/folly/synchronization/test/HazptrTest.cpp +1689 -0
- package/external/folly/folly/synchronization/test/LatchTest.cpp +224 -0
- package/external/folly/folly/synchronization/test/LifoSemBench.cpp +185 -0
- package/external/folly/folly/synchronization/test/LifoSemTests.cpp +353 -0
- package/external/folly/folly/synchronization/test/LockTest.cpp +1239 -0
- package/external/folly/folly/synchronization/test/NativeSemaphoreTest.cpp +37 -0
- package/external/folly/folly/synchronization/test/ParkingLotBenchmark.cpp +239 -0
- package/external/folly/folly/synchronization/test/ParkingLotTest.cpp +170 -0
- package/external/folly/folly/synchronization/test/RWSpinLockTest.cpp +235 -0
- package/external/folly/folly/synchronization/test/RcuBench.cpp +66 -0
- package/external/folly/folly/synchronization/test/RcuTest.cpp +330 -0
- package/external/folly/folly/synchronization/test/RelaxedAtomicTest.cpp +389 -0
- package/external/folly/folly/synchronization/test/SaturatingSemaphoreTest.cpp +166 -0
- package/external/folly/folly/synchronization/test/Semaphore.h +242 -0
- package/external/folly/folly/synchronization/test/SemaphoreTest.cpp +271 -0
- package/external/folly/folly/synchronization/test/SmallLocksBenchmark.cpp +1296 -0
- package/external/folly/folly/synchronization/test/SmallLocksTest.cpp +510 -0
- package/external/folly/folly/synchronization/test/ThreadCachedEpochBench.h +67 -0
- package/external/folly/folly/synchronization/test/ThreadCachedReadersBench.cpp +42 -0
- package/external/folly/folly/synchronization/test/ThreadCachedReadersTest.cpp +52 -0
- package/external/folly/folly/synchronization/test/ThrottledLifoSemTest.cpp +243 -0
- package/external/folly/folly/system/AtFork.cpp +205 -0
- package/external/folly/folly/system/AtFork.h +116 -0
- package/external/folly/folly/system/AuxVector.h +198 -0
- package/external/folly/folly/system/BUCK +144 -0
- package/external/folly/folly/system/EnvUtil.cpp +93 -0
- package/external/folly/folly/system/EnvUtil.h +113 -0
- package/external/folly/folly/system/HardwareConcurrency.cpp +39 -0
- package/external/folly/folly/system/HardwareConcurrency.h +23 -0
- package/external/folly/folly/system/MemoryMapping.cpp +477 -0
- package/external/folly/folly/system/MemoryMapping.h +287 -0
- package/external/folly/folly/system/Pid.cpp +87 -0
- package/external/folly/folly/system/Pid.h +34 -0
- package/external/folly/folly/system/Shell.cpp +33 -0
- package/external/folly/folly/system/Shell.h +93 -0
- package/external/folly/folly/system/ThreadId.cpp +89 -0
- package/external/folly/folly/system/ThreadId.h +62 -0
- package/external/folly/folly/system/ThreadName.cpp +330 -0
- package/external/folly/folly/system/ThreadName.h +72 -0
- package/external/folly/folly/system/test/AtForkTest.cpp +309 -0
- package/external/folly/folly/system/test/AuxVectorTest.cpp +55 -0
- package/external/folly/folly/system/test/BUCK +120 -0
- package/external/folly/folly/system/test/EnvUtilSubprocess.cpp +26 -0
- package/external/folly/folly/system/test/EnvUtilTest.cpp +197 -0
- package/external/folly/folly/system/test/MemoryMappingTest.cpp +179 -0
- package/external/folly/folly/system/test/PidTest.cpp +46 -0
- package/external/folly/folly/system/test/ShellTest.cpp +66 -0
- package/external/folly/folly/system/test/ThreadIdTest.cpp +114 -0
- package/external/folly/folly/system/test/ThreadNameTest.cpp +85 -0
- package/external/folly/folly.vcxitems +164 -0
- package/external/folly/static/logo.svg +1 -0
- package/external/folly/sync-config.json +8 -0
- package/just-task.js +13 -2
- package/package.json +7 -7
- package/template/cpp-lib/proj/MyLib.sln +0 -33
- package/template/cs-lib/proj/MyLib.sln +0 -33
- package/templates/cpp-app/windows/MyApp/MyApp.vcxproj +1 -1
- package/templates/cpp-app/windows/MyApp.sln +0 -33
- package/templates/cpp-lib/example/metro.config.js +30 -4
- package/templates/cpp-lib/windows/MyLib/MyLib.vcxproj +1 -1
- package/templates/cpp-lib/windows/MyLib.sln +0 -33
- package/Folly/Folly.vcxproj +0 -378
- package/Folly/Folly.vcxproj.filters +0 -558
- package/fmt/fmt.vcxproj +0 -153
- package/fmt/fmt.vcxproj.filters +0 -59
- package/fmt/pch.cpp +0 -4
- package/fmt/pch.h +0 -2
- /package/{fmt → external/fmt}/cgmanifest.json +0 -0
- /package/{Folly → external/folly}/Folly.natvis +0 -0
- /package/{Folly → external/folly}/cgmanifest.json +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/ConstexprMath.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/Conv.cpp +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/chrono/Hardware.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/concurrency/CacheLocality.cpp +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/json/dynamic-inl.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/json/json.cpp +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/SafeAssert.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/ToAscii.cpp +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/ToAscii.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/portability/Unistd.cpp +0 -0
|
@@ -0,0 +1,921 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#pragma once
|
|
18
|
+
|
|
19
|
+
#include <functional>
|
|
20
|
+
#include <new>
|
|
21
|
+
#include <tuple>
|
|
22
|
+
#include <type_traits>
|
|
23
|
+
#include <typeinfo>
|
|
24
|
+
#include <utility>
|
|
25
|
+
|
|
26
|
+
#include <folly/PolyException.h>
|
|
27
|
+
#include <folly/Portability.h>
|
|
28
|
+
#include <folly/Traits.h>
|
|
29
|
+
#include <folly/Utility.h>
|
|
30
|
+
#include <folly/detail/TypeList.h>
|
|
31
|
+
#include <folly/functional/Invoke.h>
|
|
32
|
+
#include <folly/lang/Exception.h>
|
|
33
|
+
#include <folly/lang/StaticConst.h>
|
|
34
|
+
|
|
35
|
+
namespace folly {
|
|
36
|
+
/// \cond
|
|
37
|
+
namespace detail {
|
|
38
|
+
template <class I>
|
|
39
|
+
struct PolyRoot;
|
|
40
|
+
|
|
41
|
+
using RRef_ = MetaQuoteTrait<std::add_rvalue_reference>;
|
|
42
|
+
using LRef_ = MetaQuoteTrait<std::add_lvalue_reference>;
|
|
43
|
+
|
|
44
|
+
template <typename T>
|
|
45
|
+
struct XRef_ : Type<MetaQuoteTrait<Type>> {};
|
|
46
|
+
template <typename T>
|
|
47
|
+
using XRef = _t<XRef_<T>>;
|
|
48
|
+
template <typename T>
|
|
49
|
+
struct XRef_<T&&> : Type<MetaCompose<RRef_, XRef<T>>> {};
|
|
50
|
+
template <typename T>
|
|
51
|
+
struct XRef_<T&> : Type<MetaCompose<LRef_, XRef<T>>> {};
|
|
52
|
+
template <typename T>
|
|
53
|
+
struct XRef_<T const> : Type<MetaQuoteTrait<std::add_const>> {};
|
|
54
|
+
|
|
55
|
+
template <class A, class B>
|
|
56
|
+
using AddCvrefOf = MetaApply<XRef<B>, A>;
|
|
57
|
+
} // namespace detail
|
|
58
|
+
/// \endcond
|
|
59
|
+
|
|
60
|
+
template <class I>
|
|
61
|
+
struct Poly;
|
|
62
|
+
|
|
63
|
+
template <class T, class I>
|
|
64
|
+
detail::AddCvrefOf<T, I>& poly_cast(detail::PolyRoot<I>&);
|
|
65
|
+
|
|
66
|
+
template <class T, class I>
|
|
67
|
+
detail::AddCvrefOf<T, I> const& poly_cast(detail::PolyRoot<I> const&);
|
|
68
|
+
|
|
69
|
+
template <auto...>
|
|
70
|
+
struct PolyMembers;
|
|
71
|
+
|
|
72
|
+
/// \cond
|
|
73
|
+
namespace detail {
|
|
74
|
+
/* *****************************************************************************
|
|
75
|
+
* IMPLEMENTATION NOTES
|
|
76
|
+
*
|
|
77
|
+
|
|
78
|
+
Building the Interface
|
|
79
|
+
----------------------
|
|
80
|
+
|
|
81
|
+
Here is a high-level description of how Poly works. Users write an interface
|
|
82
|
+
such as:
|
|
83
|
+
|
|
84
|
+
struct Mine {
|
|
85
|
+
template <class Base>
|
|
86
|
+
struct Interface {
|
|
87
|
+
int Exec() const {
|
|
88
|
+
return folly::poly_call<0>(*this);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
template <class T>
|
|
92
|
+
using Members = folly::PolyMembers<&T::Exec>;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
Then they instantiate Poly<Mine>, which will have an Exec member function
|
|
96
|
+
of the correct signature. The Exec member function comes from
|
|
97
|
+
Mine::Interface<PolyNode<Mine, PolyRoot<Mine>>>, from which Poly<Mine> inherits.
|
|
98
|
+
Here's what each piece means:
|
|
99
|
+
|
|
100
|
+
- PolyRoot<I>: stores Data, which is a union of a void* (used when the Poly is
|
|
101
|
+
storing an object on the heap or a reference) and some aligned storage (used
|
|
102
|
+
when the Poly is storing an object in-situ). PolyRoot also stores a vtable
|
|
103
|
+
pointer for interface I, which is a pointer to a struct containing function
|
|
104
|
+
pointers. The function pointers are bound member functions (e.g.,
|
|
105
|
+
SomeType::Exec). More on the vtable pointer and how it is generated below.
|
|
106
|
+
|
|
107
|
+
- PolyNode: provides the hooks used by folly::poly_call to dispatch to the
|
|
108
|
+
correctly bound member function for this interface. In the context of an
|
|
109
|
+
interface I, folly::poly_call<K>(*this, args...) will:
|
|
110
|
+
1. Fetch the vtable pointer from PolyRoot,
|
|
111
|
+
2. Select the I portion of that vtable (which, in the case of interface
|
|
112
|
+
extension, may only be a part of the total vtable),
|
|
113
|
+
3. Fetch the K-th function pointer from that vtable part,
|
|
114
|
+
4. Call through that function pointer, passing Data (from PolyRoot) and any
|
|
115
|
+
additional arguments in the folly::poly_call<K> invocation.
|
|
116
|
+
|
|
117
|
+
In the case of interface extension -- for instance, if interface Mine extended
|
|
118
|
+
interface Yours by inheriting from PolyExtends<Yours> -- then interface Mine
|
|
119
|
+
will have a list of base interfaces in a typelist called "Subsumptions".
|
|
120
|
+
Poly<Mine> will fold all the subsumed interfaces together, linearly inheriting
|
|
121
|
+
from them. To take the example of an interface Mine that extends Yours,
|
|
122
|
+
Poly<Mine> would inherit from this type:
|
|
123
|
+
|
|
124
|
+
Mine::Interface<
|
|
125
|
+
PolyNode<Mine,
|
|
126
|
+
Your::Interface<
|
|
127
|
+
PolyNode<Your, PolyRoot<Mine>>>>>
|
|
128
|
+
|
|
129
|
+
Through linear inheritance, Poly<Mine> ends up with the public member functions
|
|
130
|
+
of both interfaces, Mine and Yours.
|
|
131
|
+
|
|
132
|
+
VTables
|
|
133
|
+
-------
|
|
134
|
+
|
|
135
|
+
As mentioned above, PolyRoot<I> stores a vtable pointer for interface I. The
|
|
136
|
+
vtable is a struct whose members are function pointers. How are the types of
|
|
137
|
+
those function pointers computed from the interface? A dummy type is created,
|
|
138
|
+
Archetype<I>, in much the same way that Poly<I>'s base type is computed. Instead
|
|
139
|
+
of PolyNode and PolyRoot, there is ArchetypeNode and ArchetypeRoot. These types
|
|
140
|
+
also provide hooks for folly::poly_call, but they are dummy hooks that do
|
|
141
|
+
nothing. (Actually, they call std::terminate; they will never be called.) Once
|
|
142
|
+
Archetype<I> has been constructed, it is a concrete type that has all the
|
|
143
|
+
member functions of the interface and its subsumed interfaces. That type is
|
|
144
|
+
passed to Mine::Members, which takes the address of Archetype<I>::Exec and
|
|
145
|
+
inspects the resulting member function type. This is done for each member in the
|
|
146
|
+
interface. From a list of [member] function pointers, it is a simple matter of
|
|
147
|
+
metaprogramming to build a struct of function pointers. std::tuple is used for
|
|
148
|
+
this.
|
|
149
|
+
|
|
150
|
+
An extra field is added to the tuple for a function that handles all of the
|
|
151
|
+
"special" operations: destruction, copying, moving, getting the type
|
|
152
|
+
information, getting the address of the stored object, and fetching a fixed-up
|
|
153
|
+
vtable pointer for reference conversions (e.g., I -> I&, I& -> I const&, etc).
|
|
154
|
+
|
|
155
|
+
Subsumed interfaces are handled by having VTable<IDerived> inherit from
|
|
156
|
+
BasePtr<IBase>, where BasePtr<IBase> has only one member of type
|
|
157
|
+
VTable<IBase> const*.
|
|
158
|
+
|
|
159
|
+
Now that the type of VTable<I> is computed, how are the fields populated?
|
|
160
|
+
Poly<I> default-constructs to an empty state. Its vtable pointer points to a
|
|
161
|
+
vtable whose fields are initialized with the addresses of functions that do
|
|
162
|
+
nothing but throw a BadPolyAccess exception. That way, if you call a member
|
|
163
|
+
function on an empty Poly, you get an exception. The function pointer
|
|
164
|
+
corresponding to the "special" operations points to a no-op function; copying,
|
|
165
|
+
moving and destroying an empty Poly does nothing.
|
|
166
|
+
|
|
167
|
+
On the other hand, when you pass an object of type T satisfying interface I to
|
|
168
|
+
Poly<I>'s constructor or assignment operator, a vtable for {I,T} is reified by
|
|
169
|
+
passing type T to I::Members, thereby creating a list of bindings for T's member
|
|
170
|
+
functions. The address of this vtable gets stored in the PolyRoot<I> subobject,
|
|
171
|
+
imbuing the Poly object with the behaviors of type T. The T object itself gets
|
|
172
|
+
stored either on the heap or in the aligned storage within the Poly object
|
|
173
|
+
itself, depending on the size of T and whether or not it has a noexcept move
|
|
174
|
+
constructor.
|
|
175
|
+
*/
|
|
176
|
+
|
|
177
|
+
template <class T, template <class...> class U>
|
|
178
|
+
struct IsInstanceOf : std::false_type {};
|
|
179
|
+
|
|
180
|
+
template <class... Ts, template <class...> class U>
|
|
181
|
+
struct IsInstanceOf<U<Ts...>, U> : std::true_type {};
|
|
182
|
+
|
|
183
|
+
template <class Then>
|
|
184
|
+
decltype(auto) if_constexpr(std::true_type, Then then) {
|
|
185
|
+
return then(Identity{});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
template <class Then>
|
|
189
|
+
void if_constexpr(std::false_type, Then) {}
|
|
190
|
+
|
|
191
|
+
template <class Then, class Else>
|
|
192
|
+
decltype(auto) if_constexpr(std::true_type, Then then, Else) {
|
|
193
|
+
return then(Identity{});
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
template <class Then, class Else>
|
|
197
|
+
decltype(auto) if_constexpr(std::false_type, Then, Else else_) {
|
|
198
|
+
return else_(Identity{});
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
enum class Op : short { eNuke, eMove, eCopy, eType, eAddr, eRefr };
|
|
202
|
+
|
|
203
|
+
enum class RefType : std::uintptr_t { eRvalue, eLvalue, eConstLvalue };
|
|
204
|
+
|
|
205
|
+
struct Data;
|
|
206
|
+
|
|
207
|
+
template <class I>
|
|
208
|
+
struct PolyVal;
|
|
209
|
+
|
|
210
|
+
template <class I>
|
|
211
|
+
struct PolyRef;
|
|
212
|
+
|
|
213
|
+
struct PolyAccess;
|
|
214
|
+
|
|
215
|
+
template <class T>
|
|
216
|
+
using IsPoly = IsInstanceOf<remove_cvref_t<T>, Poly>;
|
|
217
|
+
|
|
218
|
+
// Given an interface I and a concrete type T that satisfies the interface
|
|
219
|
+
// I, create a list of member function bindings from members of T to members
|
|
220
|
+
// of I.
|
|
221
|
+
template <class I, class T>
|
|
222
|
+
using MembersOf = typename I::template Members<remove_cvref_t<T>>;
|
|
223
|
+
|
|
224
|
+
// Given an interface I and a base type T, create a type that implements
|
|
225
|
+
// the interface I in terms of the capabilities of T.
|
|
226
|
+
template <class I, class T>
|
|
227
|
+
using InterfaceOf = typename I::template Interface<T>;
|
|
228
|
+
|
|
229
|
+
struct PolyBase {};
|
|
230
|
+
|
|
231
|
+
template <class I, class = void>
|
|
232
|
+
struct SubsumptionsOf_ {
|
|
233
|
+
using type = TypeList<>;
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
template <class I>
|
|
237
|
+
using InclusiveSubsumptionsOf = TypePushFront<_t<SubsumptionsOf_<I>>, I>;
|
|
238
|
+
|
|
239
|
+
template <class I>
|
|
240
|
+
struct SubsumptionsOf_<I, void_t<typename I::Subsumptions>> {
|
|
241
|
+
using type = TypeJoin<TypeTransform<
|
|
242
|
+
typename I::Subsumptions,
|
|
243
|
+
MetaQuote<InclusiveSubsumptionsOf>>>;
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
template <class I>
|
|
247
|
+
using SubsumptionsOf = TypeReverseUnique<_t<SubsumptionsOf_<I>>>;
|
|
248
|
+
|
|
249
|
+
struct Bottom {
|
|
250
|
+
template <class T>
|
|
251
|
+
[[noreturn]] /* implicit */ operator T&&() const {
|
|
252
|
+
std::terminate();
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
using ArchetypeNode = MetaQuote<InterfaceOf>;
|
|
257
|
+
|
|
258
|
+
template <class I>
|
|
259
|
+
struct ArchetypeRoot;
|
|
260
|
+
|
|
261
|
+
template <class I>
|
|
262
|
+
using Archetype =
|
|
263
|
+
TypeFold<InclusiveSubsumptionsOf<I>, ArchetypeRoot<I>, ArchetypeNode>;
|
|
264
|
+
|
|
265
|
+
struct ArchetypeBase : Bottom {
|
|
266
|
+
ArchetypeBase() = default;
|
|
267
|
+
template <class T>
|
|
268
|
+
/* implicit */ ArchetypeBase(T&&);
|
|
269
|
+
template <std::size_t, class... As>
|
|
270
|
+
[[noreturn]] Bottom _polyCall_(As&&...) const {
|
|
271
|
+
std::terminate();
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
friend bool operator==(ArchetypeBase const&, ArchetypeBase const&);
|
|
275
|
+
friend bool operator!=(ArchetypeBase const&, ArchetypeBase const&);
|
|
276
|
+
friend bool operator<(ArchetypeBase const&, ArchetypeBase const&);
|
|
277
|
+
friend bool operator<=(ArchetypeBase const&, ArchetypeBase const&);
|
|
278
|
+
friend bool operator>(ArchetypeBase const&, ArchetypeBase const&);
|
|
279
|
+
friend bool operator>=(ArchetypeBase const&, ArchetypeBase const&);
|
|
280
|
+
friend Bottom operator++(ArchetypeBase const&);
|
|
281
|
+
friend Bottom operator++(ArchetypeBase const&, int);
|
|
282
|
+
friend Bottom operator--(ArchetypeBase const&);
|
|
283
|
+
friend Bottom operator--(ArchetypeBase const&, int);
|
|
284
|
+
friend Bottom operator+(ArchetypeBase const&, ArchetypeBase const&);
|
|
285
|
+
friend Bottom operator+=(ArchetypeBase const&, ArchetypeBase const&);
|
|
286
|
+
friend Bottom operator-(ArchetypeBase const&, ArchetypeBase const&);
|
|
287
|
+
friend Bottom operator-=(ArchetypeBase const&, ArchetypeBase const&);
|
|
288
|
+
friend Bottom operator*(ArchetypeBase const&, ArchetypeBase const&);
|
|
289
|
+
friend Bottom operator*=(ArchetypeBase const&, ArchetypeBase const&);
|
|
290
|
+
friend Bottom operator/(ArchetypeBase const&, ArchetypeBase const&);
|
|
291
|
+
friend Bottom operator/=(ArchetypeBase const&, ArchetypeBase const&);
|
|
292
|
+
friend Bottom operator%(ArchetypeBase const&, ArchetypeBase const&);
|
|
293
|
+
friend Bottom operator%=(ArchetypeBase const&, ArchetypeBase const&);
|
|
294
|
+
friend Bottom operator<<(ArchetypeBase const&, ArchetypeBase const&);
|
|
295
|
+
friend Bottom operator<<=(ArchetypeBase const&, ArchetypeBase const&);
|
|
296
|
+
friend Bottom operator>>(ArchetypeBase const&, ArchetypeBase const&);
|
|
297
|
+
friend Bottom operator>>=(ArchetypeBase const&, ArchetypeBase const&);
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
template <class I>
|
|
301
|
+
struct ArchetypeRoot : ArchetypeBase {
|
|
302
|
+
template <class Node, class Tfx>
|
|
303
|
+
using _polySelf_ = Archetype<AddCvrefOf<MetaApply<Tfx, I>, Node>>;
|
|
304
|
+
using _polyInterface_ = I;
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
struct Data {
|
|
308
|
+
Data() = default;
|
|
309
|
+
// Suppress compiler-generated copy ops to not copy anything:
|
|
310
|
+
Data(Data const&) {}
|
|
311
|
+
Data& operator=(Data const&) { return *this; }
|
|
312
|
+
union {
|
|
313
|
+
void* pobj_ = nullptr;
|
|
314
|
+
folly::aligned_storage_for_t<double[2]> buff_;
|
|
315
|
+
};
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
template <class U, class I>
|
|
319
|
+
using Arg =
|
|
320
|
+
If<std::is_same<remove_cvref_t<U>, Archetype<I>>::value,
|
|
321
|
+
Poly<AddCvrefOf<I, U const&>>,
|
|
322
|
+
U>;
|
|
323
|
+
|
|
324
|
+
template <class U, class I>
|
|
325
|
+
using Ret =
|
|
326
|
+
If<std::is_same<remove_cvref_t<U>, Archetype<I>>::value,
|
|
327
|
+
AddCvrefOf<Poly<I>, U>,
|
|
328
|
+
U>;
|
|
329
|
+
|
|
330
|
+
template <class Member, class I>
|
|
331
|
+
struct SignatureOf_;
|
|
332
|
+
|
|
333
|
+
template <class R, class C, class... As, class I>
|
|
334
|
+
struct SignatureOf_<R (C::*)(As...), I> {
|
|
335
|
+
using type = Ret<R, I> (*)(Data&, Arg<As, I>...);
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
template <class R, class C, class... As, class I>
|
|
339
|
+
struct SignatureOf_<R (C::*)(As...) const, I> {
|
|
340
|
+
using type = Ret<R, I> (*)(Data const&, Arg<As, I>...);
|
|
341
|
+
};
|
|
342
|
+
|
|
343
|
+
template <class R, class C, class... As, class I>
|
|
344
|
+
struct SignatureOf_<R (C::*)(As...) noexcept, I> {
|
|
345
|
+
using type = std::add_pointer_t<Ret<R, I>(Data&, Arg<As, I>...) noexcept>;
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
template <class R, class C, class... As, class I>
|
|
349
|
+
struct SignatureOf_<R (C::*)(As...) const noexcept, I> {
|
|
350
|
+
using type =
|
|
351
|
+
std::add_pointer_t<Ret<R, I>(Data const&, Arg<As, I>...) noexcept>;
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
template <class R, class This, class... As, class I>
|
|
355
|
+
struct SignatureOf_<R (*)(This&, As...), I> {
|
|
356
|
+
using type = Ret<R, I> (*)(Data&, Arg<As, I>...);
|
|
357
|
+
};
|
|
358
|
+
|
|
359
|
+
template <class R, class This, class... As, class I>
|
|
360
|
+
struct SignatureOf_<R (*)(This const&, As...), I> {
|
|
361
|
+
using type = Ret<R, I> (*)(Data const&, Arg<As, I>...);
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
template <auto Arch, class I>
|
|
365
|
+
using SignatureOf = _t<SignatureOf_<decltype(Arch), I>>;
|
|
366
|
+
|
|
367
|
+
template <auto User, class I, class Sig = SignatureOf<User, I>>
|
|
368
|
+
struct ArgTypes_;
|
|
369
|
+
|
|
370
|
+
template <auto User, class I, class Ret, class Data, class... Args>
|
|
371
|
+
struct ArgTypes_<User, I, Ret (*)(Data, Args...)> {
|
|
372
|
+
using type = TypeList<Args...>;
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
template <auto User, class I, class Ret, class Data, class... Args>
|
|
376
|
+
struct ArgTypes_<User, I, Ret (*)(Data, Args...) noexcept> {
|
|
377
|
+
using type = TypeList<Args...>;
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
template <auto User, class I>
|
|
381
|
+
using ArgTypes = _t<ArgTypes_<User, I>>;
|
|
382
|
+
|
|
383
|
+
template <class R, class... Args>
|
|
384
|
+
using FnPtr = R (*)(Args...);
|
|
385
|
+
|
|
386
|
+
struct ThrowThunk {
|
|
387
|
+
template <class R, class... Args>
|
|
388
|
+
constexpr /* implicit */ operator FnPtr<R, Args...>() const noexcept {
|
|
389
|
+
struct _ {
|
|
390
|
+
static R call(Args...) { throw_exception<BadPolyAccess>(); }
|
|
391
|
+
};
|
|
392
|
+
return &_::call;
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
|
|
396
|
+
inline constexpr ThrowThunk throw_() noexcept {
|
|
397
|
+
return ThrowThunk{};
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
template <class T>
|
|
401
|
+
inline constexpr bool inSitu() noexcept {
|
|
402
|
+
return !std::is_reference<T>::value &&
|
|
403
|
+
sizeof(std::decay_t<T>) <= sizeof(Data) &&
|
|
404
|
+
std::is_nothrow_move_constructible<std::decay_t<T>>::value;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
template <class T>
|
|
408
|
+
T& get(Data& d) noexcept {
|
|
409
|
+
if (inSitu<T>()) {
|
|
410
|
+
return *(std::add_pointer_t<T>)static_cast<void*>(&d.buff_);
|
|
411
|
+
} else {
|
|
412
|
+
return *static_cast<std::add_pointer_t<T>>(d.pobj_);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
template <class T>
|
|
417
|
+
T const& get(Data const& d) noexcept {
|
|
418
|
+
if (inSitu<T>()) {
|
|
419
|
+
return *(std::add_pointer_t<T const>)static_cast<void const*>(&d.buff_);
|
|
420
|
+
} else {
|
|
421
|
+
return *static_cast<std::add_pointer_t<T const>>(d.pobj_);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
enum class State : short { eEmpty, eInSitu, eOnHeap };
|
|
426
|
+
|
|
427
|
+
template <class T>
|
|
428
|
+
struct IsPolyRef : std::false_type {};
|
|
429
|
+
|
|
430
|
+
template <class T>
|
|
431
|
+
struct IsPolyRef<Poly<T&>> : std::true_type {};
|
|
432
|
+
|
|
433
|
+
template <class Arg, class U>
|
|
434
|
+
decltype(auto) convert(U&& u) {
|
|
435
|
+
return detail::if_constexpr(
|
|
436
|
+
StrictConjunction<
|
|
437
|
+
IsPolyRef<remove_cvref_t<U>>,
|
|
438
|
+
Negation<std::is_convertible<U, Arg>>>(),
|
|
439
|
+
[&](auto id) -> decltype(auto) {
|
|
440
|
+
return poly_cast<remove_cvref_t<Arg>>(id(u).get());
|
|
441
|
+
},
|
|
442
|
+
[&](auto id) -> U&& { return static_cast<U&&>(id(u)); });
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
template <class Fun>
|
|
446
|
+
struct IsConstMember : std::false_type {};
|
|
447
|
+
|
|
448
|
+
template <class R, class C, class... As>
|
|
449
|
+
struct IsConstMember<R (C::*)(As...) const> : std::true_type {};
|
|
450
|
+
|
|
451
|
+
template <class R, class C, class... As>
|
|
452
|
+
struct IsConstMember<R (*)(C const&, As...)> : std::true_type {};
|
|
453
|
+
|
|
454
|
+
template <class R, class C, class... As>
|
|
455
|
+
struct IsConstMember<R (C::*)(As...) const noexcept> : std::true_type {};
|
|
456
|
+
|
|
457
|
+
template <class R, class C, class... As>
|
|
458
|
+
struct IsConstMember<R (*)(C const&, As...) noexcept> : std::true_type {};
|
|
459
|
+
|
|
460
|
+
template <
|
|
461
|
+
class T,
|
|
462
|
+
auto User,
|
|
463
|
+
class I,
|
|
464
|
+
class = ArgTypes<User, I>,
|
|
465
|
+
class = Bool<true>>
|
|
466
|
+
struct ThunkFn {
|
|
467
|
+
template <class R, class D, class... As>
|
|
468
|
+
constexpr /* implicit */ operator FnPtr<R, D&, As...>() const noexcept {
|
|
469
|
+
return nullptr;
|
|
470
|
+
}
|
|
471
|
+
};
|
|
472
|
+
|
|
473
|
+
template <class T, auto User, class I, class... Args>
|
|
474
|
+
struct ThunkFn<
|
|
475
|
+
T,
|
|
476
|
+
User,
|
|
477
|
+
I,
|
|
478
|
+
TypeList<Args...>,
|
|
479
|
+
Bool<
|
|
480
|
+
!std::is_const<std::remove_reference_t<T>>::value ||
|
|
481
|
+
IsConstMember<decltype(User)>::value>> {
|
|
482
|
+
template <class R, class D, class... As>
|
|
483
|
+
constexpr /* implicit */ operator FnPtr<R, D&, As...>() const noexcept {
|
|
484
|
+
struct _ {
|
|
485
|
+
static R call(D& d, As... as) {
|
|
486
|
+
return folly::invoke(
|
|
487
|
+
User, get<T>(d), convert<Args>(static_cast<As&&>(as))...);
|
|
488
|
+
}
|
|
489
|
+
};
|
|
490
|
+
return &_::call;
|
|
491
|
+
}
|
|
492
|
+
};
|
|
493
|
+
|
|
494
|
+
template <
|
|
495
|
+
class I,
|
|
496
|
+
class = MembersOf<I, Archetype<I>>,
|
|
497
|
+
class = SubsumptionsOf<I>>
|
|
498
|
+
struct VTable;
|
|
499
|
+
|
|
500
|
+
template <class T, auto User, class I>
|
|
501
|
+
inline constexpr ThunkFn<T, User, I> thunk_() noexcept {
|
|
502
|
+
return ThunkFn<T, User, I>{};
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
template <class I>
|
|
506
|
+
constexpr VTable<I> const* vtable() noexcept {
|
|
507
|
+
return &StaticConst<VTable<I>>::value;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
template <class I, class T>
|
|
511
|
+
struct VTableFor : VTable<I> {
|
|
512
|
+
constexpr VTableFor() noexcept : VTable<I>{Type<T>{}} {}
|
|
513
|
+
};
|
|
514
|
+
|
|
515
|
+
template <class I, class T>
|
|
516
|
+
constexpr VTable<I> const* vtableFor() noexcept {
|
|
517
|
+
return &StaticConst<VTableFor<I, T>>::value;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
template <class I, class T>
|
|
521
|
+
constexpr void* vtableForRef(RefType ref) {
|
|
522
|
+
switch (ref) {
|
|
523
|
+
case RefType::eRvalue:
|
|
524
|
+
return const_cast<VTable<I>*>(vtableFor<I, T&&>());
|
|
525
|
+
case RefType::eLvalue:
|
|
526
|
+
return const_cast<VTable<I>*>(vtableFor<I, T&>());
|
|
527
|
+
case RefType::eConstLvalue:
|
|
528
|
+
return const_cast<VTable<I>*>(vtableFor<I, T const&>());
|
|
529
|
+
}
|
|
530
|
+
return nullptr;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
template <
|
|
534
|
+
class I,
|
|
535
|
+
class T,
|
|
536
|
+
std::enable_if_t<std::is_reference<T>::value, int> = 0>
|
|
537
|
+
void* execOnHeap(Op op, Data* from, void* to) {
|
|
538
|
+
switch (op) {
|
|
539
|
+
case Op::eNuke:
|
|
540
|
+
break;
|
|
541
|
+
case Op::eMove:
|
|
542
|
+
case Op::eCopy:
|
|
543
|
+
static_cast<Data*>(to)->pobj_ = from->pobj_;
|
|
544
|
+
break;
|
|
545
|
+
case Op::eType:
|
|
546
|
+
return const_cast<void*>(static_cast<void const*>(&typeid(T)));
|
|
547
|
+
case Op::eAddr:
|
|
548
|
+
if (*static_cast<std::type_info const*>(to) == typeid(T)) {
|
|
549
|
+
return from->pobj_;
|
|
550
|
+
}
|
|
551
|
+
throw_exception<BadPolyCast>();
|
|
552
|
+
case Op::eRefr:
|
|
553
|
+
return vtableForRef<I, remove_cvref_t<T>>(
|
|
554
|
+
static_cast<RefType>(reinterpret_cast<std::uintptr_t>(to)));
|
|
555
|
+
}
|
|
556
|
+
return nullptr;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
template <
|
|
560
|
+
class I,
|
|
561
|
+
class T,
|
|
562
|
+
std::enable_if_t<Negation<std::is_reference<T>>::value, int> = 0>
|
|
563
|
+
void* execOnHeap(Op op, Data* from, void* to) {
|
|
564
|
+
switch (op) {
|
|
565
|
+
case Op::eNuke:
|
|
566
|
+
delete &get<T>(*from);
|
|
567
|
+
break;
|
|
568
|
+
case Op::eMove:
|
|
569
|
+
static_cast<Data*>(to)->pobj_ = std::exchange(from->pobj_, nullptr);
|
|
570
|
+
break;
|
|
571
|
+
case Op::eCopy:
|
|
572
|
+
detail::if_constexpr(std::is_copy_constructible<T>(), [&](auto id) {
|
|
573
|
+
static_cast<Data*>(to)->pobj_ = new T(id(get<T>(*from)));
|
|
574
|
+
});
|
|
575
|
+
break;
|
|
576
|
+
case Op::eType:
|
|
577
|
+
return const_cast<void*>(static_cast<void const*>(&typeid(T)));
|
|
578
|
+
case Op::eAddr:
|
|
579
|
+
if (*static_cast<std::type_info const*>(to) == typeid(T)) {
|
|
580
|
+
return from->pobj_;
|
|
581
|
+
}
|
|
582
|
+
throw_exception<BadPolyCast>();
|
|
583
|
+
case Op::eRefr:
|
|
584
|
+
return vtableForRef<I, remove_cvref_t<T>>(
|
|
585
|
+
static_cast<RefType>(reinterpret_cast<std::uintptr_t>(to)));
|
|
586
|
+
}
|
|
587
|
+
return nullptr;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
template <class I, class T>
|
|
591
|
+
void* execInSitu(Op op, Data* from, void* to) {
|
|
592
|
+
switch (op) {
|
|
593
|
+
case Op::eNuke:
|
|
594
|
+
get<T>(*from).~T();
|
|
595
|
+
break;
|
|
596
|
+
case Op::eMove:
|
|
597
|
+
::new (static_cast<void*>(&static_cast<Data*>(to)->buff_))
|
|
598
|
+
T(std::move(get<T>(*from)));
|
|
599
|
+
get<T>(*from).~T();
|
|
600
|
+
break;
|
|
601
|
+
case Op::eCopy:
|
|
602
|
+
detail::if_constexpr(std::is_copy_constructible<T>(), [&](auto id) {
|
|
603
|
+
::new (static_cast<void*>(&static_cast<Data*>(to)->buff_))
|
|
604
|
+
T(id(get<T>(*from)));
|
|
605
|
+
});
|
|
606
|
+
break;
|
|
607
|
+
case Op::eType:
|
|
608
|
+
return const_cast<void*>(static_cast<void const*>(&typeid(T)));
|
|
609
|
+
case Op::eAddr:
|
|
610
|
+
if (*static_cast<std::type_info const*>(to) == typeid(T)) {
|
|
611
|
+
return &from->buff_;
|
|
612
|
+
}
|
|
613
|
+
throw_exception<BadPolyCast>();
|
|
614
|
+
case Op::eRefr:
|
|
615
|
+
return vtableForRef<I, remove_cvref_t<T>>(
|
|
616
|
+
static_cast<RefType>(reinterpret_cast<std::uintptr_t>(to)));
|
|
617
|
+
}
|
|
618
|
+
return nullptr;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
inline void* noopExec(Op op, Data*, void*) {
|
|
622
|
+
if (op == Op::eAddr)
|
|
623
|
+
throw_exception<BadPolyAccess>();
|
|
624
|
+
return const_cast<void*>(static_cast<void const*>(&typeid(void)));
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
template <class I>
|
|
628
|
+
struct BasePtr {
|
|
629
|
+
VTable<I> const* vptr_;
|
|
630
|
+
};
|
|
631
|
+
|
|
632
|
+
template <class I, class T>
|
|
633
|
+
constexpr void* (*getOpsImpl(std::true_type) noexcept)(Op, Data*, void*) {
|
|
634
|
+
return &execInSitu<I, T>;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
template <class I, class T>
|
|
638
|
+
constexpr void* (*getOpsImpl(std::false_type) noexcept)(Op, Data*, void*) {
|
|
639
|
+
return &execOnHeap<I, T>;
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
template <class I, class T>
|
|
643
|
+
constexpr void* (*getOps() noexcept)(Op, Data*, void*) {
|
|
644
|
+
return getOpsImpl<I, T>(std::integral_constant<bool, inSitu<T>()>{});
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
template <class I, auto... Arch, class... S>
|
|
648
|
+
struct VTable<I, PolyMembers<Arch...>, TypeList<S...>>
|
|
649
|
+
: BasePtr<S>..., std::tuple<SignatureOf<Arch, I>...> {
|
|
650
|
+
private:
|
|
651
|
+
template <class T, auto... User>
|
|
652
|
+
constexpr VTable(Type<T>, PolyMembers<User...>) noexcept
|
|
653
|
+
: BasePtr<S>{vtableFor<S, T>()}...,
|
|
654
|
+
std::tuple<SignatureOf<Arch, I>...>{thunk_<T, User, I>()...},
|
|
655
|
+
state_{inSitu<T>() ? State::eInSitu : State::eOnHeap},
|
|
656
|
+
ops_{getOps<I, T>()} {}
|
|
657
|
+
|
|
658
|
+
public:
|
|
659
|
+
constexpr VTable() noexcept
|
|
660
|
+
: BasePtr<S>{vtable<S>()}...,
|
|
661
|
+
std::tuple<SignatureOf<Arch, I>...>{
|
|
662
|
+
static_cast<SignatureOf<Arch, I>>(throw_())...},
|
|
663
|
+
state_{State::eEmpty},
|
|
664
|
+
ops_{&noopExec} {}
|
|
665
|
+
|
|
666
|
+
template <class T>
|
|
667
|
+
explicit constexpr VTable(Type<T>) noexcept
|
|
668
|
+
: VTable{Type<T>{}, MembersOf<I, T>{}} {}
|
|
669
|
+
|
|
670
|
+
State state_;
|
|
671
|
+
void* (*ops_)(Op, Data*, void*);
|
|
672
|
+
|
|
673
|
+
std::tuple<SignatureOf<Arch, I>...>& tuple() { return *this; }
|
|
674
|
+
const std::tuple<SignatureOf<Arch, I>...>& tuple() const { return *this; }
|
|
675
|
+
};
|
|
676
|
+
|
|
677
|
+
template <class I>
|
|
678
|
+
constexpr VTable<I> const& select(VTable<_t<Type<I>>> const& vtbl) noexcept {
|
|
679
|
+
return vtbl;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
template <class I>
|
|
683
|
+
constexpr VTable<I> const& select(BasePtr<_t<Type<I>>> const& base) noexcept {
|
|
684
|
+
return *base.vptr_;
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
struct PolyAccess {
|
|
688
|
+
template <std::size_t N, typename This, typename... As>
|
|
689
|
+
static auto call(This&& _this, As&&... args)
|
|
690
|
+
-> decltype(static_cast<This&&>(_this).template _polyCall_<N>(
|
|
691
|
+
static_cast<As&&>(args)...)) {
|
|
692
|
+
static_assert(
|
|
693
|
+
!IsInstanceOf<std::decay_t<This>, Poly>::value,
|
|
694
|
+
"When passing a Poly<> object to call(), you must explicitly "
|
|
695
|
+
"say which Interface to dispatch to, as in "
|
|
696
|
+
"call<0, MyInterface>(self, args...)");
|
|
697
|
+
return static_cast<This&&>(_this).template _polyCall_<N>(
|
|
698
|
+
static_cast<As&&>(args)...);
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
template <class Poly>
|
|
702
|
+
using Iface = typename remove_cvref_t<Poly>::_polyInterface_;
|
|
703
|
+
|
|
704
|
+
template <class Node, class Tfx = MetaIdentity>
|
|
705
|
+
static typename remove_cvref_t<Node>::template _polySelf_<Node, Tfx> self_();
|
|
706
|
+
|
|
707
|
+
template <class T, class Poly, class I = Iface<Poly>>
|
|
708
|
+
static decltype(auto) cast(Poly&& _this) {
|
|
709
|
+
using Ret = AddCvrefOf<AddCvrefOf<T, I>, Poly&&>;
|
|
710
|
+
return static_cast<Ret>(
|
|
711
|
+
*static_cast<std::add_pointer_t<Ret>>(_this.vptr_->ops_(
|
|
712
|
+
Op::eAddr,
|
|
713
|
+
const_cast<Data*>(static_cast<Data const*>(&_this)),
|
|
714
|
+
const_cast<void*>(static_cast<void const*>(&typeid(T))))));
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
template <class Poly>
|
|
718
|
+
static decltype(auto) root(Poly&& _this) noexcept {
|
|
719
|
+
return static_cast<Poly&&>(_this)._polyRoot_();
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
template <class I>
|
|
723
|
+
static std::type_info const& type(PolyRoot<I> const& _this) noexcept {
|
|
724
|
+
return *static_cast<std::type_info const*>(
|
|
725
|
+
_this.vptr_->ops_(Op::eType, nullptr, nullptr));
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
template <class I>
|
|
729
|
+
static VTable<remove_cvref_t<I>> const* vtable(
|
|
730
|
+
PolyRoot<I> const& _this) noexcept {
|
|
731
|
+
return _this.vptr_;
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
template <class I>
|
|
735
|
+
static Data* data(PolyRoot<I>& _this) noexcept {
|
|
736
|
+
return &_this;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
template <class I>
|
|
740
|
+
static Data const* data(PolyRoot<I> const& _this) noexcept {
|
|
741
|
+
return &_this;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
template <class I>
|
|
745
|
+
static Poly<I&&> move(PolyRoot<I&> const& _this) noexcept {
|
|
746
|
+
return Poly<I&&>{_this, Type<I&>{}};
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
template <class I>
|
|
750
|
+
static Poly<I const&> move(PolyRoot<I const&> const& _this) noexcept {
|
|
751
|
+
return Poly<I const&>{_this, Type<I const&>{}};
|
|
752
|
+
}
|
|
753
|
+
};
|
|
754
|
+
|
|
755
|
+
template <class I, class Tail>
|
|
756
|
+
struct PolyNode : Tail {
|
|
757
|
+
private:
|
|
758
|
+
friend PolyAccess;
|
|
759
|
+
using Tail::Tail;
|
|
760
|
+
|
|
761
|
+
template <std::size_t K, typename... As>
|
|
762
|
+
decltype(auto) _polyCall_(As&&... as) {
|
|
763
|
+
// Convert VTable to tuple explicitly to workaround an MSVC bug.
|
|
764
|
+
return std::get<K>(select<I>(*PolyAccess::vtable(*this)).tuple())(
|
|
765
|
+
*PolyAccess::data(*this), static_cast<As&&>(as)...);
|
|
766
|
+
}
|
|
767
|
+
template <std::size_t K, typename... As>
|
|
768
|
+
decltype(auto) _polyCall_(As&&... as) const {
|
|
769
|
+
return std::get<K>(select<I>(*PolyAccess::vtable(*this)).tuple())(
|
|
770
|
+
*PolyAccess::data(*this), static_cast<As&&>(as)...);
|
|
771
|
+
}
|
|
772
|
+
};
|
|
773
|
+
|
|
774
|
+
struct MakePolyNode {
|
|
775
|
+
template <class I, class State>
|
|
776
|
+
using apply = InterfaceOf<I, PolyNode<I, State>>;
|
|
777
|
+
};
|
|
778
|
+
|
|
779
|
+
template <class I>
|
|
780
|
+
struct PolyRoot : private PolyBase, private Data {
|
|
781
|
+
friend PolyAccess;
|
|
782
|
+
friend Poly<I>;
|
|
783
|
+
friend PolyVal<I>;
|
|
784
|
+
friend PolyRef<I>;
|
|
785
|
+
template <class Node, class Tfx>
|
|
786
|
+
using _polySelf_ = Poly<AddCvrefOf<MetaApply<Tfx, I>, Node>>;
|
|
787
|
+
using _polyInterface_ = I;
|
|
788
|
+
|
|
789
|
+
private:
|
|
790
|
+
PolyRoot& _polyRoot_() noexcept { return *this; }
|
|
791
|
+
PolyRoot const& _polyRoot_() const noexcept { return *this; }
|
|
792
|
+
VTable<std::decay_t<I>> const* vptr_ = vtable<std::decay_t<I>>();
|
|
793
|
+
};
|
|
794
|
+
|
|
795
|
+
template <class I>
|
|
796
|
+
using PolyImpl = TypeFold<
|
|
797
|
+
InclusiveSubsumptionsOf<remove_cvref_t<I>>,
|
|
798
|
+
PolyRoot<I>,
|
|
799
|
+
MakePolyNode>;
|
|
800
|
+
|
|
801
|
+
// A const-qualified function type means the user is trying to disambiguate
|
|
802
|
+
// a member function pointer.
|
|
803
|
+
template <class Fun> // Fun = R(As...) const
|
|
804
|
+
struct Sig {
|
|
805
|
+
template <class T>
|
|
806
|
+
constexpr Fun T::*operator()(Fun T::*t) const /* nolint */ volatile noexcept {
|
|
807
|
+
return t;
|
|
808
|
+
}
|
|
809
|
+
template <class F, class T>
|
|
810
|
+
constexpr F T::*operator()(F T::*t) const /* nolint */ volatile noexcept {
|
|
811
|
+
return t;
|
|
812
|
+
}
|
|
813
|
+
};
|
|
814
|
+
|
|
815
|
+
// A function type with no arguments means the user is trying to disambiguate
|
|
816
|
+
// a member function pointer.
|
|
817
|
+
template <class R>
|
|
818
|
+
struct Sig<R()> : Sig<R() const> {
|
|
819
|
+
using Fun = R();
|
|
820
|
+
using Sig<R() const>::operator();
|
|
821
|
+
|
|
822
|
+
template <class T>
|
|
823
|
+
constexpr Fun T::*operator()(Fun T::*t) const noexcept {
|
|
824
|
+
return t;
|
|
825
|
+
}
|
|
826
|
+
};
|
|
827
|
+
|
|
828
|
+
template <class R, class... As>
|
|
829
|
+
struct SigImpl : Sig<R(As...) const> {
|
|
830
|
+
using Fun = R(As...);
|
|
831
|
+
using Sig<R(As...) const>::operator();
|
|
832
|
+
|
|
833
|
+
template <class T>
|
|
834
|
+
constexpr Fun T::*operator()(Fun T::*t) const noexcept {
|
|
835
|
+
return t;
|
|
836
|
+
}
|
|
837
|
+
constexpr Fun* operator()(Fun* t) const noexcept { return t; }
|
|
838
|
+
template <class F>
|
|
839
|
+
constexpr F* operator()(F* t) const noexcept {
|
|
840
|
+
return t;
|
|
841
|
+
}
|
|
842
|
+
};
|
|
843
|
+
|
|
844
|
+
// The user could be trying to disambiguate either a member or a free function.
|
|
845
|
+
template <class R, class... As>
|
|
846
|
+
struct Sig<R(As...)> : SigImpl<R, As...> {};
|
|
847
|
+
|
|
848
|
+
// This case is like the one above, except we want to add an overload that
|
|
849
|
+
// handles the case of a free function where the first argument is more
|
|
850
|
+
// const-qualified than the user explicitly specified.
|
|
851
|
+
template <class R, class A, class... As>
|
|
852
|
+
struct Sig<R(A&, As...)> : SigImpl<R, A&, As...> {
|
|
853
|
+
using CCFun = R(A const&, As...);
|
|
854
|
+
using SigImpl<R, A&, As...>::operator();
|
|
855
|
+
|
|
856
|
+
constexpr CCFun* operator()(CCFun* t) const /* nolint */ volatile noexcept {
|
|
857
|
+
return t;
|
|
858
|
+
}
|
|
859
|
+
};
|
|
860
|
+
|
|
861
|
+
template <bool>
|
|
862
|
+
struct ModelsInterfaceFalse0_;
|
|
863
|
+
template <>
|
|
864
|
+
struct ModelsInterfaceFalse0_<false> {
|
|
865
|
+
template <typename... T>
|
|
866
|
+
using apply = std::bool_constant<(!require_sizeof<T> || ...)>;
|
|
867
|
+
};
|
|
868
|
+
template <>
|
|
869
|
+
struct ModelsInterfaceFalse0_<true> {
|
|
870
|
+
template <typename...>
|
|
871
|
+
using apply = std::false_type;
|
|
872
|
+
};
|
|
873
|
+
template <typename... T>
|
|
874
|
+
using ModelsInterfaceFalse_ = typename ModelsInterfaceFalse0_<(
|
|
875
|
+
std::is_function_v<remove_cvref_t<T>> || ...)>::template apply<T...>;
|
|
876
|
+
|
|
877
|
+
template <class T, class I, class = void>
|
|
878
|
+
struct ModelsInterface2_ : ModelsInterfaceFalse_<T, I> {};
|
|
879
|
+
|
|
880
|
+
template <class T, class I>
|
|
881
|
+
struct ModelsInterface2_<
|
|
882
|
+
T,
|
|
883
|
+
I,
|
|
884
|
+
void_t<
|
|
885
|
+
std::enable_if_t<
|
|
886
|
+
std::is_constructible<AddCvrefOf<std::decay_t<T>, I>, T>::value>,
|
|
887
|
+
MembersOf<std::decay_t<I>, std::decay_t<T>>>> : std::true_type {};
|
|
888
|
+
|
|
889
|
+
template <class T, class I, class = void>
|
|
890
|
+
struct ModelsInterface_ : ModelsInterfaceFalse_<T, I> {};
|
|
891
|
+
|
|
892
|
+
template <class T, class I>
|
|
893
|
+
struct ModelsInterface_<
|
|
894
|
+
T,
|
|
895
|
+
I,
|
|
896
|
+
std::enable_if_t<
|
|
897
|
+
Negation<std::is_base_of<PolyBase, std::decay_t<T>>>::value>>
|
|
898
|
+
: ModelsInterface2_<T, I> {};
|
|
899
|
+
|
|
900
|
+
template <class T, class I>
|
|
901
|
+
struct ModelsInterface : ModelsInterface_<T, I> {};
|
|
902
|
+
|
|
903
|
+
template <class I1, class I2>
|
|
904
|
+
struct ValueCompatible : std::is_base_of<I1, I2> {};
|
|
905
|
+
|
|
906
|
+
// This prevents PolyRef's converting constructors and assignment operators
|
|
907
|
+
// from being considered as copy constructors and assignment operators:
|
|
908
|
+
template <class I1>
|
|
909
|
+
struct ValueCompatible<I1, I1> : std::false_type {};
|
|
910
|
+
|
|
911
|
+
template <class I1, class I2, class I2Ref>
|
|
912
|
+
struct ReferenceCompatible : std::is_constructible<I1, I2Ref> {};
|
|
913
|
+
|
|
914
|
+
// This prevents PolyRef's converting constructors and assignment operators
|
|
915
|
+
// from being considered as copy constructors and assignment operators:
|
|
916
|
+
template <class I1, class I2Ref>
|
|
917
|
+
struct ReferenceCompatible<I1, I1, I2Ref> : std::false_type {};
|
|
918
|
+
|
|
919
|
+
} // namespace detail
|
|
920
|
+
/// \endcond
|
|
921
|
+
} // namespace folly
|