react-native-windows 0.85.0-preview.1 → 0.85.0
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/Directory.Build.props +1 -1
- package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp +28 -46
- package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.h +0 -3
- package/Microsoft.ReactNative/Fabric/Composition/CompositionViewComponentView.cpp +19 -13
- package/Microsoft.ReactNative/Fabric/Composition/Modal/WindowsModalHostViewComponentView.cpp +107 -0
- package/Microsoft.ReactNative/Fabric/Composition/SelectionItemAutomationEvent.h +73 -0
- package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.cpp +105 -32
- package/Microsoft.ReactNative/Fabric/Composition/UiaHelpers.h +7 -2
- package/PropertySheets/CIBuildOptimizations.props +2 -2
- package/PropertySheets/Generated/PackageVersion.g.props +2 -2
- package/PropertySheets/JSEngine.props +1 -1
- package/PropertySheets/NuGet.LockFile.props +2 -9
- package/Scripts/NuGetRestoreForceEvaluateAllSolutions.ps1 +54 -5
- package/Scripts/UpdateNightlyDependencies.ps1 +47 -0
- package/Scripts/creaternwapp.cmd +29 -9
- package/Scripts/creaternwlib.cmd +31 -15
- package/external/.clang-format +1 -0
- 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/cgmanifest.json +15 -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/Folly.natvis +25 -0
- package/external/folly/LICENSE +200 -0
- package/external/folly/README.md +263 -0
- package/external/folly/cgmanifest.json +25 -0
- package/external/folly/folly/.clang-format +1 -0
- 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/ConstexprMath.h +978 -0
- package/external/folly/folly/ConstructorCallbackList.h +158 -0
- package/external/folly/folly/Conv.cpp +1205 -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/Hardware.h +155 -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.cpp +633 -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-inl.h +1438 -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.cpp +1118 -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/SafeAssert.h +188 -0
- package/external/folly/folly/lang/StaticConst.h +33 -0
- package/external/folly/folly/lang/Thunk.h +100 -0
- package/external/folly/folly/lang/ToAscii.cpp +348 -0
- package/external/folly/folly/lang/ToAscii.h +182 -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.cpp +33 -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/package.json +8 -8
- package/templates/cpp-lib/example/metro.config.js +18 -2
|
@@ -0,0 +1,1095 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
// TODO: [x] "cast" from Poly<C&> to Poly<C&&>
|
|
18
|
+
// TODO: [ ] copy/move from Poly<C&>/Poly<C&&> to Poly<C>
|
|
19
|
+
// TODO: [ ] copy-on-write?
|
|
20
|
+
// TODO: [ ] down- and cross-casting? (Possible?)
|
|
21
|
+
// TODO: [ ] shared ownership? (Dubious.)
|
|
22
|
+
// TODO: [ ] can games be played with making the VTable a member of a struct
|
|
23
|
+
// with strange alignment such that the address of the VTable can
|
|
24
|
+
// be used to tell whether the object is stored in-situ or not?
|
|
25
|
+
|
|
26
|
+
#pragma once
|
|
27
|
+
|
|
28
|
+
#include <cassert>
|
|
29
|
+
#include <new>
|
|
30
|
+
#include <type_traits>
|
|
31
|
+
#include <typeinfo>
|
|
32
|
+
#include <utility>
|
|
33
|
+
|
|
34
|
+
#include <folly/CPortability.h>
|
|
35
|
+
#include <folly/CppAttributes.h>
|
|
36
|
+
#include <folly/Traits.h>
|
|
37
|
+
#include <folly/detail/TypeList.h>
|
|
38
|
+
#include <folly/lang/Assume.h>
|
|
39
|
+
|
|
40
|
+
#include <folly/PolyException.h>
|
|
41
|
+
#include <folly/detail/PolyDetail.h>
|
|
42
|
+
|
|
43
|
+
namespace folly {
|
|
44
|
+
template <class I>
|
|
45
|
+
struct Poly;
|
|
46
|
+
|
|
47
|
+
// MSVC workaround
|
|
48
|
+
template <class Node, class Tfx, class Access>
|
|
49
|
+
struct PolySelf_ {
|
|
50
|
+
using type = decltype(Access::template self_<Node, Tfx>());
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Within the definition of interface `I`, `PolySelf<Base>` is an alias for
|
|
55
|
+
* the instance of `Poly` that is currently being instantiated. It is
|
|
56
|
+
* one of: `Poly<J>`, `Poly<J&&>`, `Poly<J&>`, or `Poly<J const&>`; where
|
|
57
|
+
* `J` is either `I` or some interface that extends `I`.
|
|
58
|
+
*
|
|
59
|
+
* It can be used within interface definitions to declare members that accept
|
|
60
|
+
* other `Poly` objects of the same type as `*this`.
|
|
61
|
+
*
|
|
62
|
+
* The first parameter may optionally be cv- and/or reference-qualified, in
|
|
63
|
+
* which case, the qualification is applies to the type of the interface in the
|
|
64
|
+
* resulting `Poly<>` instance. The second template parameter controls whether
|
|
65
|
+
* or not the interface is decayed before the cv-ref qualifiers of the first
|
|
66
|
+
* argument are applied. For example, given the following:
|
|
67
|
+
*
|
|
68
|
+
* struct Foo {
|
|
69
|
+
* template <class Base>
|
|
70
|
+
* struct Interface : Base {
|
|
71
|
+
* using A = PolySelf<Base>;
|
|
72
|
+
* using B = PolySelf<Base &>;
|
|
73
|
+
* using C = PolySelf<Base const &>;
|
|
74
|
+
* using X = PolySelf<Base, PolyDecay>;
|
|
75
|
+
* using Y = PolySelf<Base &, PolyDecay>;
|
|
76
|
+
* using Z = PolySelf<Base const &, PolyDecay>;
|
|
77
|
+
* };
|
|
78
|
+
* // ...
|
|
79
|
+
* };
|
|
80
|
+
* struct Bar : PolyExtends<Foo> {
|
|
81
|
+
* // ...
|
|
82
|
+
* };
|
|
83
|
+
*
|
|
84
|
+
* Then for `Poly<Bar>`, the typedefs are aliases for the following types:
|
|
85
|
+
* - `A` is `Poly<Bar>`
|
|
86
|
+
* - `B` is `Poly<Bar &>`
|
|
87
|
+
* - `C` is `Poly<Bar const &>`
|
|
88
|
+
* - `X` is `Poly<Bar>`
|
|
89
|
+
* - `Y` is `Poly<Bar &>`
|
|
90
|
+
* - `Z` is `Poly<Bar const &>`
|
|
91
|
+
*
|
|
92
|
+
* And for `Poly<Bar &>`, the typedefs are aliases for the following types:
|
|
93
|
+
* - `A` is `Poly<Bar &>`
|
|
94
|
+
* - `B` is `Poly<Bar &>`
|
|
95
|
+
* - `C` is `Poly<Bar &>`
|
|
96
|
+
* - `X` is `Poly<Bar>`
|
|
97
|
+
* - `Y` is `Poly<Bar &>`
|
|
98
|
+
* - `Z` is `Poly<Bar const &>`
|
|
99
|
+
*/
|
|
100
|
+
template <
|
|
101
|
+
class Node,
|
|
102
|
+
class Tfx = detail::MetaIdentity,
|
|
103
|
+
class Access = detail::PolyAccess>
|
|
104
|
+
using PolySelf = _t<PolySelf_<Node, Tfx, Access>>;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* When used in conjunction with `PolySelf`, controls how to construct `Poly`
|
|
108
|
+
* types related to the one currently being instantiated.
|
|
109
|
+
*
|
|
110
|
+
* \sa PolySelf
|
|
111
|
+
*/
|
|
112
|
+
using PolyDecay = detail::MetaQuote<std::decay_t>;
|
|
113
|
+
|
|
114
|
+
#define FOLLY_POLY_MEMBER(SIG, MEM) ::folly::sig<SIG>(MEM)
|
|
115
|
+
#define FOLLY_POLY_MEMBERS(...) ::folly::PolyMembers<__VA_ARGS__>
|
|
116
|
+
|
|
117
|
+
template <auto... Ps>
|
|
118
|
+
struct PolyMembers {};
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Used in the definition of a `Poly` interface to say that the current
|
|
122
|
+
* interface is an extension of a set of zero or more interfaces.
|
|
123
|
+
*
|
|
124
|
+
* Example:
|
|
125
|
+
*
|
|
126
|
+
* struct IFoo {
|
|
127
|
+
* template <class Base> struct Interface : Base {
|
|
128
|
+
* void foo() { folly::poly_call<0>(*this); }
|
|
129
|
+
* };
|
|
130
|
+
* template <class T> using Members = FOLLY_POLY_MEMBERS(&T::foo);
|
|
131
|
+
* }
|
|
132
|
+
* struct IBar : PolyExtends<IFoo> {
|
|
133
|
+
* template <class Base> struct Interface : Base {
|
|
134
|
+
* void bar(int i) { folly::poly_call<0>(*this, i); }
|
|
135
|
+
* };
|
|
136
|
+
* template <class T> using Members = FOLLY_POLY_MEMBERS(&T::bar);
|
|
137
|
+
* }
|
|
138
|
+
*/
|
|
139
|
+
template <class... I>
|
|
140
|
+
struct PolyExtends : virtual I... {
|
|
141
|
+
using Subsumptions = detail::TypeList<I...>;
|
|
142
|
+
|
|
143
|
+
template <class Base>
|
|
144
|
+
struct Interface : Base {
|
|
145
|
+
Interface() = default;
|
|
146
|
+
using Base::Base;
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
template <class...>
|
|
150
|
+
using Members = PolyMembers<>;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
154
|
+
/**
|
|
155
|
+
* Call the N-th member of the currently-being-defined interface. When the
|
|
156
|
+
* first parameter is an object of type `PolySelf<Base>` (as opposed to `*this`)
|
|
157
|
+
* you must explicitly specify which interface through which to dispatch.
|
|
158
|
+
* For instance:
|
|
159
|
+
*
|
|
160
|
+
* struct IAddable {
|
|
161
|
+
* template <class Base>
|
|
162
|
+
* struct Interface : Base {
|
|
163
|
+
* friend folly::PolySelf<Base, folly::PolyDecay>
|
|
164
|
+
* operator+(
|
|
165
|
+
* folly::PolySelf<Base> const& a,
|
|
166
|
+
* folly::PolySelf<Base> const& b) {
|
|
167
|
+
* return folly::poly_call<0, IAddable>(a, b);
|
|
168
|
+
* }
|
|
169
|
+
* };
|
|
170
|
+
* template <class T>
|
|
171
|
+
* static auto plus_(T const& a, T const& b) -> decltype(a + b) {
|
|
172
|
+
* return a + b;
|
|
173
|
+
* }
|
|
174
|
+
* template <class T>
|
|
175
|
+
* using Members = FOLLY_POLY_MEMBERS(&plus_<std::decay_t<T>>);
|
|
176
|
+
* };
|
|
177
|
+
*
|
|
178
|
+
* \sa PolySelf
|
|
179
|
+
*/
|
|
180
|
+
template <std::size_t N, typename This, typename... As>
|
|
181
|
+
auto poly_call(This&& _this, As&&... as)
|
|
182
|
+
-> decltype(detail::PolyAccess::call<N>(
|
|
183
|
+
static_cast<This&&>(_this), static_cast<As&&>(as)...)) {
|
|
184
|
+
return detail::PolyAccess::call<N>(
|
|
185
|
+
static_cast<This&&>(_this), static_cast<As&&>(as)...);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/// \overload
|
|
189
|
+
template <std::size_t N, class I, class Tail, typename... As>
|
|
190
|
+
decltype(auto) poly_call(detail::PolyNode<I, Tail>&& _this, As&&... as) {
|
|
191
|
+
using This = detail::InterfaceOf<I, detail::PolyNode<I, Tail>>;
|
|
192
|
+
return detail::PolyAccess::call<N>(
|
|
193
|
+
static_cast<This&&>(_this), static_cast<As&&>(as)...);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/// \overload
|
|
197
|
+
template <std::size_t N, class I, class Tail, typename... As>
|
|
198
|
+
decltype(auto) poly_call(detail::PolyNode<I, Tail>& _this, As&&... as) {
|
|
199
|
+
using This = detail::InterfaceOf<I, detail::PolyNode<I, Tail>>;
|
|
200
|
+
return detail::PolyAccess::call<N>(
|
|
201
|
+
static_cast<This&>(_this), static_cast<As&&>(as)...);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/// \overload
|
|
205
|
+
template <std::size_t N, class I, class Tail, typename... As>
|
|
206
|
+
decltype(auto) poly_call(detail::PolyNode<I, Tail> const& _this, As&&... as) {
|
|
207
|
+
using This = detail::InterfaceOf<I, detail::PolyNode<I, Tail>>;
|
|
208
|
+
return detail::PolyAccess::call<N>(
|
|
209
|
+
static_cast<This const&>(_this), static_cast<As&&>(as)...);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/// \overload
|
|
213
|
+
template <
|
|
214
|
+
std::size_t N,
|
|
215
|
+
class I,
|
|
216
|
+
class Poly,
|
|
217
|
+
typename... As,
|
|
218
|
+
std::enable_if_t<detail::IsPoly<Poly>::value, int> = 0>
|
|
219
|
+
auto poly_call(Poly&& _this, As&&... as) -> decltype(poly_call<N, I>(
|
|
220
|
+
static_cast<Poly&&>(_this).get(),
|
|
221
|
+
static_cast<As&&>(as)...)) {
|
|
222
|
+
return poly_call<N, I>(
|
|
223
|
+
static_cast<Poly&&>(_this).get(), static_cast<As&&>(as)...);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/// \cond
|
|
227
|
+
/// \overload
|
|
228
|
+
template <std::size_t N, class I, typename... As>
|
|
229
|
+
[[noreturn]] detail::Bottom poly_call(detail::ArchetypeBase const&, As&&...) {
|
|
230
|
+
assume_unreachable();
|
|
231
|
+
}
|
|
232
|
+
/// \endcond
|
|
233
|
+
|
|
234
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
235
|
+
/**
|
|
236
|
+
* Try to cast the `Poly` object to the requested type. If the `Poly` stores an
|
|
237
|
+
* object of that type, return a reference to the object; otherwise, throw an
|
|
238
|
+
* exception.
|
|
239
|
+
* \tparam T The (unqualified) type to which to cast the `Poly` object.
|
|
240
|
+
* \tparam Poly The type of the `Poly` object.
|
|
241
|
+
* \param that The `Poly` object to be cast.
|
|
242
|
+
* \return A reference to the `T` object stored in or referred to by `that`.
|
|
243
|
+
* \throw BadPolyAccess if `that` is empty.
|
|
244
|
+
* \throw BadPolyCast if `that` does not store or refer to an object of type
|
|
245
|
+
* `T`.
|
|
246
|
+
*/
|
|
247
|
+
template <class T, class I>
|
|
248
|
+
detail::AddCvrefOf<T, I>&& poly_cast(detail::PolyRoot<I>&& that) {
|
|
249
|
+
return detail::PolyAccess::cast<T>(std::move(that));
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/// \overload
|
|
253
|
+
template <class T, class I>
|
|
254
|
+
detail::AddCvrefOf<T, I>& poly_cast(detail::PolyRoot<I>& that) {
|
|
255
|
+
return detail::PolyAccess::cast<T>(that);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/// \overload
|
|
259
|
+
template <class T, class I>
|
|
260
|
+
detail::AddCvrefOf<T, I> const& poly_cast(detail::PolyRoot<I> const& that) {
|
|
261
|
+
return detail::PolyAccess::cast<T>(that);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/// \cond
|
|
265
|
+
/// \overload
|
|
266
|
+
template <class T, class I>
|
|
267
|
+
[[noreturn]] detail::AddCvrefOf<T, I>&& poly_cast(detail::ArchetypeRoot<I>&&) {
|
|
268
|
+
assume_unreachable();
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/// \overload
|
|
272
|
+
template <class T, class I>
|
|
273
|
+
[[noreturn]] detail::AddCvrefOf<T, I>& poly_cast(detail::ArchetypeRoot<I>&) {
|
|
274
|
+
assume_unreachable();
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/// \overload
|
|
278
|
+
template <class T, class I>
|
|
279
|
+
[[noreturn]] detail::AddCvrefOf<T, I> const& poly_cast(
|
|
280
|
+
detail::ArchetypeRoot<I> const&) {
|
|
281
|
+
assume_unreachable();
|
|
282
|
+
}
|
|
283
|
+
/// \endcond
|
|
284
|
+
|
|
285
|
+
/// \overload
|
|
286
|
+
template <
|
|
287
|
+
class T,
|
|
288
|
+
class Poly,
|
|
289
|
+
std::enable_if_t<detail::IsPoly<Poly>::value, int> = 0>
|
|
290
|
+
constexpr auto poly_cast(Poly&& that)
|
|
291
|
+
-> decltype(poly_cast<T>(std::declval<Poly>().get())) {
|
|
292
|
+
return poly_cast<T>(static_cast<Poly&&>(that).get());
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
296
|
+
/**
|
|
297
|
+
* Returns a reference to the `std::type_info` object corresponding to the
|
|
298
|
+
* object currently stored in `that`. If `that` is empty, returns
|
|
299
|
+
* `typeid(void)`.
|
|
300
|
+
*/
|
|
301
|
+
template <class I>
|
|
302
|
+
std::type_info const& poly_type(detail::PolyRoot<I> const& that) noexcept {
|
|
303
|
+
return detail::PolyAccess::type(that);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/// \cond
|
|
307
|
+
/// \overload
|
|
308
|
+
[[noreturn]] inline std::type_info const& poly_type(
|
|
309
|
+
detail::ArchetypeBase const&) noexcept {
|
|
310
|
+
assume_unreachable();
|
|
311
|
+
}
|
|
312
|
+
/// \endcond
|
|
313
|
+
|
|
314
|
+
/// \overload
|
|
315
|
+
template <class Poly, std::enable_if_t<detail::IsPoly<Poly>::value, int> = 0>
|
|
316
|
+
constexpr auto poly_type(Poly const& that) noexcept
|
|
317
|
+
-> decltype(poly_type(that.get())) {
|
|
318
|
+
return poly_type(that.get());
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
322
|
+
/**
|
|
323
|
+
* Returns `true` if `that` is not currently storing an object; `false`,
|
|
324
|
+
* otherwise.
|
|
325
|
+
*/
|
|
326
|
+
template <class I>
|
|
327
|
+
bool poly_empty(detail::PolyRoot<I> const& that) noexcept {
|
|
328
|
+
return detail::State::eEmpty == detail::PolyAccess::vtable(that)->state_;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/// \overload
|
|
332
|
+
template <class I>
|
|
333
|
+
constexpr bool poly_empty(detail::PolyRoot<I&&> const&) noexcept {
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/// \overload
|
|
338
|
+
template <class I>
|
|
339
|
+
constexpr bool poly_empty(detail::PolyRoot<I&> const&) noexcept {
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/// \overload
|
|
344
|
+
template <class I>
|
|
345
|
+
constexpr bool poly_empty(Poly<I&&> const&) noexcept {
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/// \overload
|
|
350
|
+
template <class I>
|
|
351
|
+
constexpr bool poly_empty(Poly<I&> const&) noexcept {
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/// \cond
|
|
356
|
+
[[noreturn]] inline bool poly_empty(detail::ArchetypeBase const&) noexcept {
|
|
357
|
+
assume_unreachable();
|
|
358
|
+
}
|
|
359
|
+
/// \endcond
|
|
360
|
+
|
|
361
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
362
|
+
/**
|
|
363
|
+
* Given a `Poly<I&>`, return a `Poly<I&&>`. Otherwise, when `I` is not a
|
|
364
|
+
* reference type, returns a `Poly<I>&&` when given a `Poly<I>&`, like
|
|
365
|
+
* `std::move`.
|
|
366
|
+
*/
|
|
367
|
+
template <
|
|
368
|
+
class I,
|
|
369
|
+
std::enable_if_t<Negation<std::is_reference<I>>::value, int> = 0>
|
|
370
|
+
constexpr Poly<I>&& poly_move(detail::PolyRoot<I>& that) noexcept {
|
|
371
|
+
return static_cast<Poly<I>&&>(static_cast<Poly<I>&>(that));
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/// \overload
|
|
375
|
+
template <class I, std::enable_if_t<Negation<std::is_const<I>>::value, int> = 0>
|
|
376
|
+
Poly<I&&> poly_move(detail::PolyRoot<I&> const& that) noexcept {
|
|
377
|
+
return detail::PolyAccess::move(that);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/// \overload
|
|
381
|
+
template <class I>
|
|
382
|
+
Poly<I const&> poly_move(detail::PolyRoot<I const&> const& that) noexcept {
|
|
383
|
+
return detail::PolyAccess::move(that);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/// \cond
|
|
387
|
+
/// \overload
|
|
388
|
+
[[noreturn]] inline detail::ArchetypeBase poly_move(
|
|
389
|
+
detail::ArchetypeBase const&) noexcept {
|
|
390
|
+
assume_unreachable();
|
|
391
|
+
}
|
|
392
|
+
/// \endcond
|
|
393
|
+
|
|
394
|
+
/// \overload
|
|
395
|
+
template <class Poly, std::enable_if_t<detail::IsPoly<Poly>::value, int> = 0>
|
|
396
|
+
constexpr auto poly_move(Poly& that) noexcept
|
|
397
|
+
-> decltype(poly_move(that.get())) {
|
|
398
|
+
return poly_move(that.get());
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/// \cond
|
|
402
|
+
namespace detail {
|
|
403
|
+
/**
|
|
404
|
+
* The implementation for `Poly` for when the interface type is not
|
|
405
|
+
* reference-like qualified, as in `Poly<SemiRegular>`.
|
|
406
|
+
*/
|
|
407
|
+
template <class I>
|
|
408
|
+
struct PolyVal : PolyImpl<I> {
|
|
409
|
+
private:
|
|
410
|
+
friend PolyAccess;
|
|
411
|
+
|
|
412
|
+
struct NoneSuch {};
|
|
413
|
+
using Copyable = std::is_copy_constructible<PolyImpl<I>>;
|
|
414
|
+
using PolyOrNonesuch = If<Copyable::value, PolyVal, NoneSuch>;
|
|
415
|
+
|
|
416
|
+
using PolyRoot<I>::vptr_;
|
|
417
|
+
|
|
418
|
+
PolyRoot<I>& _polyRoot_() noexcept { return *this; }
|
|
419
|
+
PolyRoot<I> const& _polyRoot_() const noexcept { return *this; }
|
|
420
|
+
|
|
421
|
+
Data* _data_() noexcept { return PolyAccess::data(*this); }
|
|
422
|
+
Data const* _data_() const noexcept { return PolyAccess::data(*this); }
|
|
423
|
+
|
|
424
|
+
public:
|
|
425
|
+
/**
|
|
426
|
+
* Default constructor.
|
|
427
|
+
* \post `poly_empty(*this) == true`
|
|
428
|
+
*/
|
|
429
|
+
PolyVal() = default;
|
|
430
|
+
/**
|
|
431
|
+
* Move constructor.
|
|
432
|
+
* \post `poly_empty(that) == true`
|
|
433
|
+
*/
|
|
434
|
+
PolyVal(PolyVal&& that) noexcept;
|
|
435
|
+
/**
|
|
436
|
+
* A copy constructor if `I` is copyable; otherwise, a useless constructor
|
|
437
|
+
* from a private, incomplete type.
|
|
438
|
+
*/
|
|
439
|
+
/* implicit */ PolyVal(PolyOrNonesuch const& that);
|
|
440
|
+
|
|
441
|
+
~PolyVal();
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* Inherit any constructors defined by any of the interfaces.
|
|
445
|
+
*/
|
|
446
|
+
using PolyImpl<I>::PolyImpl;
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* Copy assignment, destroys the object currently held (if any) and makes
|
|
450
|
+
* `*this` equal to `that` by stealing its guts.
|
|
451
|
+
*/
|
|
452
|
+
Poly<I>& operator=(PolyVal that) noexcept;
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* Construct a Poly<I> from a concrete type that satisfies the I concept
|
|
456
|
+
*/
|
|
457
|
+
template <class T, std::enable_if_t<ModelsInterface<T, I>::value, int> = 0>
|
|
458
|
+
/* implicit */ PolyVal(T&& t);
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
* Construct a `Poly` from a compatible `Poly`. "Compatible" here means: the
|
|
462
|
+
* other interface extends this one either directly or indirectly.
|
|
463
|
+
*/
|
|
464
|
+
template <class I2, std::enable_if_t<ValueCompatible<I, I2>::value, int> = 0>
|
|
465
|
+
/* implicit */ PolyVal(Poly<I2> that);
|
|
466
|
+
|
|
467
|
+
/**
|
|
468
|
+
* Assign to this `Poly<I>` from a concrete type that satisfies the `I`
|
|
469
|
+
* concept.
|
|
470
|
+
*/
|
|
471
|
+
template <class T, std::enable_if_t<ModelsInterface<T, I>::value, int> = 0>
|
|
472
|
+
Poly<I>& operator=(T&& t);
|
|
473
|
+
|
|
474
|
+
/**
|
|
475
|
+
* Assign a compatible `Poly` to `*this`. "Compatible" here means: the
|
|
476
|
+
* other interface extends this one either directly or indirectly.
|
|
477
|
+
*/
|
|
478
|
+
template <class I2, std::enable_if_t<ValueCompatible<I, I2>::value, int> = 0>
|
|
479
|
+
Poly<I>& operator=(Poly<I2> that);
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Swaps the values of two `Poly` objects.
|
|
483
|
+
*/
|
|
484
|
+
void swap(Poly<I>& that) noexcept;
|
|
485
|
+
};
|
|
486
|
+
|
|
487
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
488
|
+
/**
|
|
489
|
+
* The implementation of `Poly` for when the interface type is
|
|
490
|
+
* reference-qualified, like `Poly<SemiRegular &>`.
|
|
491
|
+
*/
|
|
492
|
+
template <class I>
|
|
493
|
+
struct PolyRef : private PolyImpl<I> {
|
|
494
|
+
private:
|
|
495
|
+
friend PolyAccess;
|
|
496
|
+
|
|
497
|
+
AddCvrefOf<PolyRoot<I>, I>& _polyRoot_() const noexcept;
|
|
498
|
+
|
|
499
|
+
Data* _data_() noexcept { return PolyAccess::data(*this); }
|
|
500
|
+
Data const* _data_() const noexcept { return PolyAccess::data(*this); }
|
|
501
|
+
|
|
502
|
+
static constexpr RefType refType() noexcept;
|
|
503
|
+
|
|
504
|
+
protected:
|
|
505
|
+
template <class That, class I2>
|
|
506
|
+
PolyRef(That&& that, Type<I2>);
|
|
507
|
+
|
|
508
|
+
public:
|
|
509
|
+
/**
|
|
510
|
+
* Copy constructor
|
|
511
|
+
* \post `&poly_cast<T>(*this) == &poly_cast<T>(that)`, where `T` is the
|
|
512
|
+
* type of the object held by `that`.
|
|
513
|
+
*/
|
|
514
|
+
PolyRef(PolyRef const& that) noexcept;
|
|
515
|
+
|
|
516
|
+
/**
|
|
517
|
+
* Copy assignment
|
|
518
|
+
* \post `&poly_cast<T>(*this) == &poly_cast<T>(that)`, where `T` is the
|
|
519
|
+
* type of the object held by `that`.
|
|
520
|
+
*/
|
|
521
|
+
Poly<I>& operator=(PolyRef const& that) noexcept;
|
|
522
|
+
|
|
523
|
+
/**
|
|
524
|
+
* Construct a `Poly<I>` from a concrete type that satisfies concept `I`.
|
|
525
|
+
* \post `!poly_empty(*this)`
|
|
526
|
+
*/
|
|
527
|
+
template <class T, std::enable_if_t<ModelsInterface<T, I>::value, int> = 0>
|
|
528
|
+
/* implicit */ PolyRef(T&& t) noexcept;
|
|
529
|
+
|
|
530
|
+
/**
|
|
531
|
+
* Construct a `Poly<I>` from a compatible `Poly<I2>`.
|
|
532
|
+
*/
|
|
533
|
+
template <
|
|
534
|
+
class I2,
|
|
535
|
+
std::enable_if_t<ReferenceCompatible<I, I2, I2&&>::value, int> = 0>
|
|
536
|
+
/* implicit */ PolyRef(Poly<I2>&& that) noexcept(
|
|
537
|
+
std::is_reference<I2>::value);
|
|
538
|
+
|
|
539
|
+
template <
|
|
540
|
+
class I2,
|
|
541
|
+
std::enable_if_t<ReferenceCompatible<I, I2, I2&>::value, int> = 0>
|
|
542
|
+
/* implicit */ PolyRef(Poly<I2>& that) noexcept(std::is_reference<I2>::value)
|
|
543
|
+
: PolyRef{that, Type<I2>{}} {}
|
|
544
|
+
|
|
545
|
+
template <
|
|
546
|
+
class I2,
|
|
547
|
+
std::enable_if_t<ReferenceCompatible<I, I2, I2 const&>::value, int> = 0>
|
|
548
|
+
/* implicit */ PolyRef(Poly<I2> const& that) noexcept(
|
|
549
|
+
std::is_reference<I2>::value)
|
|
550
|
+
: PolyRef{that, Type<I2>{}} {}
|
|
551
|
+
|
|
552
|
+
/**
|
|
553
|
+
* Assign to a `Poly<I>` from a concrete type that satisfies concept `I`.
|
|
554
|
+
* \post `!poly_empty(*this)`
|
|
555
|
+
*/
|
|
556
|
+
template <class T, std::enable_if_t<ModelsInterface<T, I>::value, int> = 0>
|
|
557
|
+
Poly<I>& operator=(T&& t) noexcept;
|
|
558
|
+
|
|
559
|
+
/**
|
|
560
|
+
* Assign to `*this` from another compatible `Poly`.
|
|
561
|
+
*/
|
|
562
|
+
template <
|
|
563
|
+
class I2,
|
|
564
|
+
std::enable_if_t<ReferenceCompatible<I, I2, I2&&>::value, int> = 0>
|
|
565
|
+
Poly<I>& operator=(Poly<I2>&& that) noexcept(std::is_reference<I2>::value);
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* \overload
|
|
569
|
+
*/
|
|
570
|
+
template <
|
|
571
|
+
class I2,
|
|
572
|
+
std::enable_if_t<ReferenceCompatible<I, I2, I2&>::value, int> = 0>
|
|
573
|
+
Poly<I>& operator=(Poly<I2>& that) noexcept(std::is_reference<I2>::value);
|
|
574
|
+
|
|
575
|
+
/**
|
|
576
|
+
* \overload
|
|
577
|
+
*/
|
|
578
|
+
template <
|
|
579
|
+
class I2,
|
|
580
|
+
std::enable_if_t<ReferenceCompatible<I, I2, I2 const&>::value, int> = 0>
|
|
581
|
+
Poly<I>& operator=(Poly<I2> const& that) noexcept(
|
|
582
|
+
std::is_reference<I2>::value);
|
|
583
|
+
|
|
584
|
+
/**
|
|
585
|
+
* Swap which object this `Poly` references ("shallow" swap).
|
|
586
|
+
*/
|
|
587
|
+
void swap(Poly<I>& that) noexcept;
|
|
588
|
+
|
|
589
|
+
/**
|
|
590
|
+
* Get a reference to the interface, with correct `const`-ness applied.
|
|
591
|
+
*/
|
|
592
|
+
AddCvrefOf<PolyImpl<I>, I>& get() const noexcept;
|
|
593
|
+
|
|
594
|
+
/**
|
|
595
|
+
* Get a reference to the interface, with correct `const`-ness applied.
|
|
596
|
+
*/
|
|
597
|
+
AddCvrefOf<PolyImpl<I>, I>& operator*() const noexcept { return get(); }
|
|
598
|
+
|
|
599
|
+
/**
|
|
600
|
+
* Get a pointer to the interface, with correct `const`-ness applied.
|
|
601
|
+
*/
|
|
602
|
+
auto operator->() const noexcept { return &get(); }
|
|
603
|
+
};
|
|
604
|
+
|
|
605
|
+
template <class I>
|
|
606
|
+
using PolyValOrRef = If<std::is_reference<I>::value, PolyRef<I>, PolyVal<I>>;
|
|
607
|
+
} // namespace detail
|
|
608
|
+
/// \endcond
|
|
609
|
+
|
|
610
|
+
/**
|
|
611
|
+
* `Poly` is a class template that makes it relatively easy to define a
|
|
612
|
+
* type-erasing polymorphic object wrapper.
|
|
613
|
+
*
|
|
614
|
+
* \par Type-erasure
|
|
615
|
+
*
|
|
616
|
+
* \par
|
|
617
|
+
* `std::function` is one example of a type-erasing polymorphic object wrapper;
|
|
618
|
+
* `folly::exception_wrapper` is another. Type-erasure is often used as an
|
|
619
|
+
* alternative to dynamic polymorphism via inheritance-based virtual dispatch.
|
|
620
|
+
* The distinguishing characteristic of type-erasing wrappers are:
|
|
621
|
+
* \li **Duck typing:** Types do not need to inherit from an abstract base
|
|
622
|
+
* class in order to be assignable to a type-erasing wrapper; they merely
|
|
623
|
+
* need to satisfy a particular interface.
|
|
624
|
+
* \li **Value semantics:** Type-erasing wrappers are objects that can be
|
|
625
|
+
* passed around _by value_. This is in contrast to abstract base classes
|
|
626
|
+
* which must be passed by reference or by pointer or else suffer from
|
|
627
|
+
* _slicing_, which causes them to lose their polymorphic behaviors.
|
|
628
|
+
* Reference semantics make it difficult to reason locally about code.
|
|
629
|
+
* \li **Automatic memory management:** When dealing with inheritance-based
|
|
630
|
+
* dynamic polymorphism, it is often necessary to allocate and manage
|
|
631
|
+
* objects on the heap. This leads to a proliferation of `shared_ptr`s and
|
|
632
|
+
* `unique_ptr`s in APIs, complicating their point-of-use. APIs that take
|
|
633
|
+
* type-erasing wrappers, on the other hand, can often store small objects
|
|
634
|
+
* in-situ, with no dynamic allocation. The memory management, if any, is
|
|
635
|
+
* handled for you, and leads to cleaner APIs: consumers of your API don't
|
|
636
|
+
* need to pass `shared_ptr<AbstractBase>`; they can simply pass any object
|
|
637
|
+
* that satisfies the interface you require. (`std::function` is a
|
|
638
|
+
* particularly compelling example of this benefit. Far worse would be an
|
|
639
|
+
* inheritance-based callable solution like
|
|
640
|
+
* `shared_ptr<ICallable<void(int)>>`. )
|
|
641
|
+
*
|
|
642
|
+
* \par Example: Defining a type-erasing function wrapper with `folly::Poly`
|
|
643
|
+
*
|
|
644
|
+
* \par
|
|
645
|
+
* Defining a polymorphic wrapper with `Poly` is a matter of defining two
|
|
646
|
+
* things:
|
|
647
|
+
* \li An *interface*, consisting of public member functions, and
|
|
648
|
+
* \li A *mapping* from a concrete type to a set of member function bindings.
|
|
649
|
+
*
|
|
650
|
+
* Below is a (heavily commented) example of a simple implementation of a
|
|
651
|
+
* `std::function`-like polymorphic wrapper. Its interface has only a single
|
|
652
|
+
* member function: `operator()`
|
|
653
|
+
*
|
|
654
|
+
* // An interface for a callable object of a particular signature, Fun
|
|
655
|
+
* // (most interfaces don't need to be templates, FWIW).
|
|
656
|
+
* template <class Fun>
|
|
657
|
+
* struct IFunction;
|
|
658
|
+
*
|
|
659
|
+
* template <class R, class... As>
|
|
660
|
+
* struct IFunction<R(As...)> {
|
|
661
|
+
* // An interface is defined as a nested class template called
|
|
662
|
+
* // Interface that takes a single template parameter, Base, from
|
|
663
|
+
* // which it inherits.
|
|
664
|
+
* template <class Base>
|
|
665
|
+
* struct Interface : Base {
|
|
666
|
+
* // The Interface has public member functions. These become the
|
|
667
|
+
* // public interface of the resulting Poly instantiation.
|
|
668
|
+
* // (Implementation note: Poly<IFunction<Sig>> will publicly
|
|
669
|
+
* // inherit from this struct, which is what gives it the right
|
|
670
|
+
* // member functions.)
|
|
671
|
+
* R operator()(As... as) const {
|
|
672
|
+
* // The definition of each member function in your interface will
|
|
673
|
+
* // always consist of a single line dispatching to
|
|
674
|
+
* // folly::poly_call<N>. The "N" corresponds to the N-th member
|
|
675
|
+
* // function in the list of member function bindings, Members,
|
|
676
|
+
* // defined below. The first argument will always be *this, and the
|
|
677
|
+
* // rest of the arguments should simply forward (if necessary) the
|
|
678
|
+
* // member function's arguments.
|
|
679
|
+
* return static_cast<R>(
|
|
680
|
+
* folly::poly_call<0>(*this, std::forward<As>(as)...));
|
|
681
|
+
* }
|
|
682
|
+
* };
|
|
683
|
+
*
|
|
684
|
+
* // The "Members" alias template is a comma-separated list of bound
|
|
685
|
+
* // member functions for a given concrete type "T". The
|
|
686
|
+
* // "FOLLY_POLY_MEMBERS" macro accepts a comma-separated list, and the
|
|
687
|
+
* // (optional) "FOLLY_POLY_MEMBER" macro lets you disambiguate overloads
|
|
688
|
+
* // by explicitly specifying the function signature the target member
|
|
689
|
+
* // function should have. In this case, we require "T" to have a
|
|
690
|
+
* // function call operator with the signature `R(As...) const`.
|
|
691
|
+
* //
|
|
692
|
+
* // If you are using a C++17-compatible compiler, you can do away with
|
|
693
|
+
* // the macros and write this as:
|
|
694
|
+
* //
|
|
695
|
+
* // template <class T>
|
|
696
|
+
* // using Members = folly::PolyMembers<
|
|
697
|
+
* // folly::sig<R(As...) const>(&T::operator())>;
|
|
698
|
+
* //
|
|
699
|
+
* // And since `folly::sig` is only needed for disambiguation in case of
|
|
700
|
+
* // overloads, if you are not concerned about objects with overloaded
|
|
701
|
+
* // function call operators, it could be further simplified to:
|
|
702
|
+
* //
|
|
703
|
+
* // template <class T>
|
|
704
|
+
* // using Members = folly::PolyMembers<&T::operator()>;
|
|
705
|
+
* //
|
|
706
|
+
* template <class T>
|
|
707
|
+
* using Members = FOLLY_POLY_MEMBERS(
|
|
708
|
+
* FOLLY_POLY_MEMBER(R(As...) const, &T::operator()));
|
|
709
|
+
* };
|
|
710
|
+
*
|
|
711
|
+
* // Now that we have defined the interface, we can pass it to Poly to
|
|
712
|
+
* // create our type-erasing wrapper:
|
|
713
|
+
* template <class Fun>
|
|
714
|
+
* using Function = Poly<IFunction<Fun>>;
|
|
715
|
+
*
|
|
716
|
+
* \par
|
|
717
|
+
* Given the above definition of `Function`, users can now initialize instances
|
|
718
|
+
* of (say) `Function<int(int, int)>` with function objects like
|
|
719
|
+
* `std::plus<int>` and `std::multiplies<int>`, as below:
|
|
720
|
+
*
|
|
721
|
+
* Function<int(int, int)> fun = std::plus<int>{};
|
|
722
|
+
* assert(5 == fun(2, 3));
|
|
723
|
+
* fun = std::multiplies<int>{};
|
|
724
|
+
* assert(6 = fun(2, 3));
|
|
725
|
+
*
|
|
726
|
+
* \par Defining an interface with C++17
|
|
727
|
+
*
|
|
728
|
+
* \par
|
|
729
|
+
* With C++17, defining an interface to be used with `Poly` is fairly
|
|
730
|
+
* straightforward. As in the `Function` example above, there is a struct with
|
|
731
|
+
* a nested `Interface` class template and a nested `Members` alias template.
|
|
732
|
+
* No macros are needed with C++17.
|
|
733
|
+
* \par
|
|
734
|
+
* Imagine we were defining something like a Java-style iterator. If we are
|
|
735
|
+
* using a C++17 compiler, our interface would look something like this:
|
|
736
|
+
*
|
|
737
|
+
* template <class Value>
|
|
738
|
+
* struct IJavaIterator {
|
|
739
|
+
* template <class Base>
|
|
740
|
+
* struct Interface : Base {
|
|
741
|
+
* bool Done() const { return folly::poly_call<0>(*this); }
|
|
742
|
+
* Value Current() const { return folly::poly_call<1>(*this); }
|
|
743
|
+
* void Next() { folly::poly_call<2>(*this); }
|
|
744
|
+
* };
|
|
745
|
+
* // NOTE: This works in C++17 only:
|
|
746
|
+
* template <class T>
|
|
747
|
+
* using Members = folly::PolyMembers<&T::Done, &T::Current, &T::Next>;
|
|
748
|
+
* };
|
|
749
|
+
*
|
|
750
|
+
* template <class Value>
|
|
751
|
+
* using JavaIterator = Poly<IJavaIterator>;
|
|
752
|
+
*
|
|
753
|
+
* \par
|
|
754
|
+
* Given the above definition, `JavaIterator<int>` can be used to hold instances
|
|
755
|
+
* of any type that has `Done`, `Current`, and `Next` member functions with the
|
|
756
|
+
* correct (or compatible) signatures.
|
|
757
|
+
*
|
|
758
|
+
* \par
|
|
759
|
+
* The presence of overloaded member functions complicates this picture. Often,
|
|
760
|
+
* property members are faked in C++ with `const` and non-`const` member
|
|
761
|
+
* function overloads, like in the interface specified below:
|
|
762
|
+
*
|
|
763
|
+
* struct IIntProperty {
|
|
764
|
+
* template <class Base>
|
|
765
|
+
* struct Interface : Base {
|
|
766
|
+
* int Value() const { return folly::poly_call<0>(*this); }
|
|
767
|
+
* void Value(int i) { folly::poly_call<1>(*this, i); }
|
|
768
|
+
* };
|
|
769
|
+
* // NOTE: This works in C++17 only:
|
|
770
|
+
* template <class T>
|
|
771
|
+
* using Members = folly::PolyMembers<
|
|
772
|
+
* folly::sig<int() const>(&T::Value),
|
|
773
|
+
* folly::sig<void(int)>(&T::Value)>;
|
|
774
|
+
* };
|
|
775
|
+
*
|
|
776
|
+
* using IntProperty = Poly<IIntProperty>;
|
|
777
|
+
*
|
|
778
|
+
* \par
|
|
779
|
+
* Now, any object that has `Value` members of compatible signatures can be
|
|
780
|
+
* assigned to instances of `IntProperty` object. Note how `folly::sig` is used
|
|
781
|
+
* to disambiguate the overloads of `&T::Value`.
|
|
782
|
+
*
|
|
783
|
+
* \par Defining an interface with C++14
|
|
784
|
+
*
|
|
785
|
+
* \par
|
|
786
|
+
* In C++14, the nice syntax above doesn't work, so we have to resort to macros.
|
|
787
|
+
* The two examples above would look like this:
|
|
788
|
+
*
|
|
789
|
+
* template <class Value>
|
|
790
|
+
* struct IJavaIterator {
|
|
791
|
+
* template <class Base>
|
|
792
|
+
* struct Interface : Base {
|
|
793
|
+
* bool Done() const { return folly::poly_call<0>(*this); }
|
|
794
|
+
* Value Current() const { return folly::poly_call<1>(*this); }
|
|
795
|
+
* void Next() { folly::poly_call<2>(*this); }
|
|
796
|
+
* };
|
|
797
|
+
* // NOTE: This works in C++14 and C++17:
|
|
798
|
+
* template <class T>
|
|
799
|
+
* using Members = FOLLY_POLY_MEMBERS(&T::Done, &T::Current, &T::Next);
|
|
800
|
+
* };
|
|
801
|
+
*
|
|
802
|
+
* template <class Value>
|
|
803
|
+
* using JavaIterator = Poly<IJavaIterator>;
|
|
804
|
+
*
|
|
805
|
+
* \par
|
|
806
|
+
* and
|
|
807
|
+
*
|
|
808
|
+
* struct IIntProperty {
|
|
809
|
+
* template <class Base>
|
|
810
|
+
* struct Interface : Base {
|
|
811
|
+
* int Value() const { return folly::poly_call<0>(*this); }
|
|
812
|
+
* void Value(int i) { return folly::poly_call<1>(*this, i); }
|
|
813
|
+
* };
|
|
814
|
+
* // NOTE: This works in C++14 and C++17:
|
|
815
|
+
* template <class T>
|
|
816
|
+
* using Members = FOLLY_POLY_MEMBERS(
|
|
817
|
+
* FOLLY_POLY_MEMBER(int() const, &T::Value),
|
|
818
|
+
* FOLLY_POLY_MEMBER(void(int), &T::Value));
|
|
819
|
+
* };
|
|
820
|
+
*
|
|
821
|
+
* using IntProperty = Poly<IIntProperty>;
|
|
822
|
+
*
|
|
823
|
+
* \par Extending interfaces
|
|
824
|
+
*
|
|
825
|
+
* \par
|
|
826
|
+
* One typical advantage of inheritance-based solutions to runtime polymorphism
|
|
827
|
+
* is that one polymorphic interface could extend another through inheritance.
|
|
828
|
+
* The same can be accomplished with type-erasing polymorphic wrappers. In
|
|
829
|
+
* the `Poly` library, you can use `folly::PolyExtends` to say that one
|
|
830
|
+
* interface extends another.
|
|
831
|
+
*
|
|
832
|
+
* struct IFoo {
|
|
833
|
+
* template <class Base>
|
|
834
|
+
* struct Interface : Base {
|
|
835
|
+
* void Foo() const { return folly::poly_call<0>(*this); }
|
|
836
|
+
* };
|
|
837
|
+
* template <class T>
|
|
838
|
+
* using Members = FOLLY_POLY_MEMBERS(&T::Foo);
|
|
839
|
+
* };
|
|
840
|
+
*
|
|
841
|
+
* // The IFooBar interface extends the IFoo interface
|
|
842
|
+
* struct IFooBar : PolyExtends<IFoo> {
|
|
843
|
+
* template <class Base>
|
|
844
|
+
* struct Interface : Base {
|
|
845
|
+
* void Bar() const { return folly::poly_call<0>(*this); }
|
|
846
|
+
* };
|
|
847
|
+
* template <class T>
|
|
848
|
+
* using Members = FOLLY_POLY_MEMBERS(&T::Bar);
|
|
849
|
+
* };
|
|
850
|
+
*
|
|
851
|
+
* using FooBar = Poly<IFooBar>;
|
|
852
|
+
*
|
|
853
|
+
* \par
|
|
854
|
+
* Given the above defintion, instances of type `FooBar` have both `Foo()` and
|
|
855
|
+
* `Bar()` member functions.
|
|
856
|
+
*
|
|
857
|
+
* \par
|
|
858
|
+
* The sensible conversions exist between a wrapped derived type and a wrapped
|
|
859
|
+
* base type. For instance, assuming `IDerived` extends `IBase` with
|
|
860
|
+
* `PolyExtends`:
|
|
861
|
+
*
|
|
862
|
+
* Poly<IDerived> derived = ...;
|
|
863
|
+
* Poly<IBase> base = derived; // This conversion is OK.
|
|
864
|
+
*
|
|
865
|
+
* \par
|
|
866
|
+
* As you would expect, there is no conversion in the other direction, and at
|
|
867
|
+
* present there is no `Poly` equivalent to `dynamic_cast`.
|
|
868
|
+
*
|
|
869
|
+
* \par Type-erasing polymorphic reference wrappers
|
|
870
|
+
*
|
|
871
|
+
* \par
|
|
872
|
+
* Sometimes you don't need to own a copy of an object; a reference will do. For
|
|
873
|
+
* that you can use `Poly` to capture a _reference_ to an object satisfying an
|
|
874
|
+
* interface rather than the whole object itself. The syntax is intuitive.
|
|
875
|
+
*
|
|
876
|
+
* int i = 42;
|
|
877
|
+
* // Capture a mutable reference to an object of any IRegular type:
|
|
878
|
+
* Poly<IRegular &> intRef = i;
|
|
879
|
+
* assert(42 == folly::poly_cast<int>(intRef));
|
|
880
|
+
* // Assert that we captured the address of "i":
|
|
881
|
+
* assert(&i == &folly::poly_cast<int>(intRef));
|
|
882
|
+
*
|
|
883
|
+
* \par
|
|
884
|
+
* A reference-like `Poly` has a different interface than a value-like `Poly`.
|
|
885
|
+
* Rather than calling member functions with the `obj.fun()` syntax, you would
|
|
886
|
+
* use the `obj->fun()` syntax. This is for the sake of `const`-correctness.
|
|
887
|
+
* For example, consider the code below:
|
|
888
|
+
*
|
|
889
|
+
* struct IFoo {
|
|
890
|
+
* template <class Base>
|
|
891
|
+
* struct Interface {
|
|
892
|
+
* void Foo() { folly::poly_call<0>(*this); }
|
|
893
|
+
* };
|
|
894
|
+
* template <class T>
|
|
895
|
+
* using Members = folly::PolyMembers<&T::Foo>;
|
|
896
|
+
* };
|
|
897
|
+
*
|
|
898
|
+
* struct SomeFoo {
|
|
899
|
+
* void Foo() { std::printf("SomeFoo::Foo\n"); }
|
|
900
|
+
* };
|
|
901
|
+
*
|
|
902
|
+
* SomeFoo foo;
|
|
903
|
+
* Poly<IFoo &> const anyFoo = foo;
|
|
904
|
+
* anyFoo->Foo(); // prints "SomeFoo::Foo"
|
|
905
|
+
*
|
|
906
|
+
* \par
|
|
907
|
+
* Notice in the above code that the `Foo` member function is non-`const`.
|
|
908
|
+
* Notice also that the `anyFoo` object is `const`. However, since it has
|
|
909
|
+
* captured a non-`const` reference to the `foo` object, it should still be
|
|
910
|
+
* possible to dispatch to the non-`const` `Foo` member function. When
|
|
911
|
+
* instantiated with a reference type, `Poly` has an overloaded `operator->`
|
|
912
|
+
* member that returns a pointer to the `IFoo` interface with the correct
|
|
913
|
+
* `const`-ness, which makes this work.
|
|
914
|
+
*
|
|
915
|
+
* \par
|
|
916
|
+
* The same mechanism also prevents users from calling non-`const` member
|
|
917
|
+
* functions on `Poly` objects that have captured `const` references, which
|
|
918
|
+
* would violate `const`-correctness.
|
|
919
|
+
*
|
|
920
|
+
* \par
|
|
921
|
+
* Sensible conversions exist between non-reference and reference `Poly`s. For
|
|
922
|
+
* instance:
|
|
923
|
+
*
|
|
924
|
+
* Poly<IRegular> value = 42;
|
|
925
|
+
* Poly<IRegular &> mutable_ref = value;
|
|
926
|
+
* Poly<IRegular const &> const_ref = mutable_ref;
|
|
927
|
+
*
|
|
928
|
+
* assert(&poly_cast<int>(value) == &poly_cast<int>(mutable_ref));
|
|
929
|
+
* assert(&poly_cast<int>(value) == &poly_cast<int>(const_ref));
|
|
930
|
+
*
|
|
931
|
+
* \par Non-member functions (C++17)
|
|
932
|
+
*
|
|
933
|
+
* \par
|
|
934
|
+
* If you wanted to write the interface `ILogicallyNegatable`, which captures
|
|
935
|
+
* all types that can be negated with unary `operator!`, you could do it
|
|
936
|
+
* as we've shown above, by binding `&T::operator!` in the nested `Members`
|
|
937
|
+
* alias template, but that has the problem that it won't work for types that
|
|
938
|
+
* have defined unary `operator!` as a free function. To handle this case,
|
|
939
|
+
* the `Poly` library lets you use a free function instead of a member function
|
|
940
|
+
* when creating a binding.
|
|
941
|
+
*
|
|
942
|
+
* \par
|
|
943
|
+
* With C++17 you may use a lambda to create a binding, as shown in the example
|
|
944
|
+
* below:
|
|
945
|
+
*
|
|
946
|
+
* struct ILogicallyNegatable {
|
|
947
|
+
* template <class Base>
|
|
948
|
+
* struct Interface : Base {
|
|
949
|
+
* bool operator!() const { return folly::poly_call<0>(*this); }
|
|
950
|
+
* };
|
|
951
|
+
* template <class T>
|
|
952
|
+
* using Members = folly::PolyMembers<
|
|
953
|
+
* +[](T const& t) -> decltype(!t) { return !t; }>;
|
|
954
|
+
* };
|
|
955
|
+
*
|
|
956
|
+
* \par
|
|
957
|
+
* This requires some explanation. The unary `operator+` in front of the lambda
|
|
958
|
+
* is necessary! It causes the lambda to decay to a C-style function pointer,
|
|
959
|
+
* which is one of the types that `folly::PolyMembers` accepts. The `decltype`
|
|
960
|
+
* in the lambda return type is also necessary. Through the magic of SFINAE, it
|
|
961
|
+
* will cause `Poly<ILogicallyNegatable>` to reject any types that don't support
|
|
962
|
+
* unary `operator!`.
|
|
963
|
+
*
|
|
964
|
+
* \par
|
|
965
|
+
* If you are using a free function to create a binding, the first parameter is
|
|
966
|
+
* implicitly the `this` parameter. It will receive the type-erased object.
|
|
967
|
+
*
|
|
968
|
+
* \par Non-member functions (C++14)
|
|
969
|
+
*
|
|
970
|
+
* \par
|
|
971
|
+
* If you are using a C++14 compiler, the defintion of `ILogicallyNegatable`
|
|
972
|
+
* above will fail because lambdas are not `constexpr`. We can get the same
|
|
973
|
+
* effect by writing the lambda as a named free function, as show below:
|
|
974
|
+
*
|
|
975
|
+
* struct ILogicallyNegatable {
|
|
976
|
+
* template <class Base>
|
|
977
|
+
* struct Interface : Base {
|
|
978
|
+
* bool operator!() const { return folly::poly_call<0>(*this); }
|
|
979
|
+
* };
|
|
980
|
+
*
|
|
981
|
+
* template <class T>
|
|
982
|
+
* static auto negate(T const& t) -> decltype(!t) { return !t; }
|
|
983
|
+
*
|
|
984
|
+
* template <class T>
|
|
985
|
+
* using Members = FOLLY_POLY_MEMBERS(&negate<T>);
|
|
986
|
+
* };
|
|
987
|
+
*
|
|
988
|
+
* \par
|
|
989
|
+
* As with the example that uses the lambda in the preceding section, the first
|
|
990
|
+
* parameter is implicitly the `this` parameter. It will receive the type-erased
|
|
991
|
+
* object.
|
|
992
|
+
*
|
|
993
|
+
* \par Multi-dispatch
|
|
994
|
+
*
|
|
995
|
+
* \par
|
|
996
|
+
* What if you want to create an `IAddable` interface for things that can be
|
|
997
|
+
* added? Adding requires _two_ objects, both of which are type-erased. This
|
|
998
|
+
* interface requires dispatching on both objects, doing the addition only
|
|
999
|
+
* if the types are the same. For this we make use of the `PolySelf` template
|
|
1000
|
+
* alias to define an interface that takes more than one object of the
|
|
1001
|
+
* erased type.
|
|
1002
|
+
*
|
|
1003
|
+
* struct IAddable {
|
|
1004
|
+
* template <class Base>
|
|
1005
|
+
* struct Interface : Base {
|
|
1006
|
+
* friend PolySelf<Base, Decay>
|
|
1007
|
+
* operator+(PolySelf<Base> const& a, PolySelf<Base> const& b) {
|
|
1008
|
+
* return folly::poly_call<0, IAddable>(a, b);
|
|
1009
|
+
* }
|
|
1010
|
+
* };
|
|
1011
|
+
*
|
|
1012
|
+
* template <class T>
|
|
1013
|
+
* using Members = folly::PolyMembers<
|
|
1014
|
+
* +[](T const& a, T const& b) -> decltype(a + b) { return a + b; }>;
|
|
1015
|
+
* };
|
|
1016
|
+
*
|
|
1017
|
+
* \par
|
|
1018
|
+
* Given the above defintion of `IAddable` we would be able to do the following:
|
|
1019
|
+
*
|
|
1020
|
+
* Poly<IAddable> a = 2, b = 3;
|
|
1021
|
+
* Poly<IAddable> c = a + b;
|
|
1022
|
+
* assert(poly_cast<int>(c) == 5);
|
|
1023
|
+
*
|
|
1024
|
+
* \par
|
|
1025
|
+
* If `a` and `b` stored objects of different types, a `BadPolyCast` exception
|
|
1026
|
+
* would be thrown.
|
|
1027
|
+
*
|
|
1028
|
+
* \par Move-only types
|
|
1029
|
+
*
|
|
1030
|
+
* \par
|
|
1031
|
+
* If you want to store move-only types, then your interface should extend the
|
|
1032
|
+
* `IMoveOnly` interface.
|
|
1033
|
+
*
|
|
1034
|
+
* \par Implementation notes
|
|
1035
|
+
* \par
|
|
1036
|
+
* `Poly` will store "small" objects in an internal buffer, avoiding the cost of
|
|
1037
|
+
* of dynamic allocations. At present, this size is not configurable; it is
|
|
1038
|
+
* pegged at the size of two `double`s.
|
|
1039
|
+
*
|
|
1040
|
+
* \par
|
|
1041
|
+
* `Poly` objects are always nothrow movable. If you store an object in one that
|
|
1042
|
+
* has a potentially throwing move contructor, the object will be stored on the
|
|
1043
|
+
* heap, even if it could fit in the internal storage of the `Poly` object.
|
|
1044
|
+
* (So be sure to give your objects nothrow move constructors!)
|
|
1045
|
+
*
|
|
1046
|
+
* \par
|
|
1047
|
+
* `Poly` implements type-erasure in a manner very similar to how the compiler
|
|
1048
|
+
* accomplishes virtual dispatch. Every `Poly` object contains a pointer to a
|
|
1049
|
+
* table of function pointers. Member function calls involve a double-
|
|
1050
|
+
* indirection: once through the v-pointer, and other indirect function call
|
|
1051
|
+
* through the function pointer.
|
|
1052
|
+
*/
|
|
1053
|
+
template <class I>
|
|
1054
|
+
struct Poly final : detail::PolyValOrRef<I> {
|
|
1055
|
+
friend detail::PolyAccess;
|
|
1056
|
+
Poly() = default;
|
|
1057
|
+
using detail::PolyValOrRef<I>::PolyValOrRef;
|
|
1058
|
+
using detail::PolyValOrRef<I>::operator=;
|
|
1059
|
+
};
|
|
1060
|
+
|
|
1061
|
+
/**
|
|
1062
|
+
* Swap two `Poly<I>` instances.
|
|
1063
|
+
*/
|
|
1064
|
+
template <class I>
|
|
1065
|
+
void swap(Poly<I>& left, Poly<I>& right) noexcept {
|
|
1066
|
+
left.swap(right);
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
/**
|
|
1070
|
+
* Pseudo-function template handy for disambiguating function overloads.
|
|
1071
|
+
*
|
|
1072
|
+
* For example, given:
|
|
1073
|
+
* struct S {
|
|
1074
|
+
* int property() const;
|
|
1075
|
+
* void property(int);
|
|
1076
|
+
* };
|
|
1077
|
+
*
|
|
1078
|
+
* You can get a member function pointer to the first overload with:
|
|
1079
|
+
* folly::sig<int()const>(&S::property);
|
|
1080
|
+
*
|
|
1081
|
+
* This is arguably a nicer syntax that using the built-in `static_cast`:
|
|
1082
|
+
* static_cast<int (S::*)() const>(&S::property);
|
|
1083
|
+
*
|
|
1084
|
+
* `sig` is also more permissive than `static_cast` about `const`. For instance,
|
|
1085
|
+
* the following also works:
|
|
1086
|
+
* folly::sig<int()>(&S::property);
|
|
1087
|
+
*
|
|
1088
|
+
* The above is permitted
|
|
1089
|
+
*/
|
|
1090
|
+
template <class Sig>
|
|
1091
|
+
inline constexpr detail::Sig<Sig> const sig = {};
|
|
1092
|
+
|
|
1093
|
+
} // namespace folly
|
|
1094
|
+
|
|
1095
|
+
#include <folly/Poly-inl.h>
|