react-native-windows 0.84.0-preview.9 → 0.84.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Common/unicode.cpp +36 -0
- package/Common/unicode.h +8 -0
- package/Directory.Build.props +2 -17
- package/Folly/ThreadNameStub.cpp +4 -6
- package/Microsoft.ReactNative/Fabric/Composition/CompositionDynamicAutomationProvider.cpp +5 -0
- package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.cpp +91 -23
- package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.h +11 -0
- package/Microsoft.ReactNative/Fabric/Composition/ParagraphComponentView.cpp +6 -4
- package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp +28 -6
- package/Microsoft.ReactNative/Fabric/Composition/TextDrawing.cpp +1 -1
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +1 -1
- package/Microsoft.ReactNative/Fabric/Composition/TooltipService.cpp +80 -0
- package/Microsoft.ReactNative/Fabric/Composition/TooltipService.h +17 -0
- package/Microsoft.ReactNative/Fabric/platform/react/renderer/textlayoutmanager/WindowsTextLayoutManager.cpp +1 -1
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +4 -9
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj.filters +0 -3
- package/Microsoft.ReactNative/Utils/LocalBundleReader.cpp +33 -25
- package/Microsoft.ReactNative/Utils/LocalBundleReader.h +5 -3
- package/Microsoft.ReactNative/Utils/UwpScriptStore.cpp +2 -2
- package/Microsoft.ReactNative/Utils/UwpScriptStore.h +3 -2
- package/Microsoft.ReactNative.Managed/Microsoft.ReactNative.Managed.csproj +3 -3
- package/Microsoft.ReactNative.Managed.CodeGen/Microsoft.ReactNative.Managed.CodeGen.csproj +10 -10
- package/Microsoft.ReactNative.Managed.CodeGen/Properties/PublishProfiles/DeployAsTool-Debug.pubxml +1 -1
- package/Microsoft.ReactNative.Managed.CodeGen/Properties/PublishProfiles/DeployAsTool-Release.pubxml +1 -1
- package/PropertySheets/CIBuildOptimizations.props +2 -2
- package/PropertySheets/Generated/PackageVersion.g.props +3 -3
- package/PropertySheets/JSEngine.props +1 -1
- package/PropertySheets/NuGet.LockFile.props +10 -1
- package/PropertySheets/React.Cpp.props +7 -6
- package/PropertySheets/WinUI.props +2 -2
- package/ReactCommon/ReactCommon.vcxproj +0 -5
- package/Scripts/JustMyXaml.ps1 +8 -8
- package/Scripts/NuGetRestoreForceEvaluateAllSolutions.ps1 +61 -6
- package/Scripts/Tfs/Layout-Desktop-Headers.ps1 +4 -37
- package/Scripts/UnitTest.ps1 +3 -1
- package/Scripts/UpdateNightlyDependencies.ps1 +47 -0
- package/Scripts/creaternwapp.cmd +5 -8
- package/Scripts/creaternwlib.cmd +10 -23
- package/Scripts/rnw-dependencies.ps1 +15 -16
- package/Shared/DevSupportManager.cpp +55 -48
- package/Shared/DevSupportManager.h +0 -1
- package/Shared/Modules/IWebSocketModuleContentHandler.h +15 -0
- package/Shared/Modules/WebSocketModule.cpp +8 -3
- package/Shared/Networking/DefaultBlobResource.cpp +37 -0
- package/Shared/Networking/DefaultBlobResource.h +12 -0
- package/Shared/Networking/WinRTWebSocketResource.h +5 -1
- package/Shared/Shared.vcxitems +2 -0
- package/{Folly → external}/.clang-format +0 -1
- package/external/External.vcxitems +10 -0
- package/external/fast-float/.syncignore +10 -0
- package/external/fast-float/LICENSE-APACHE +190 -0
- package/external/fast-float/LICENSE-BOOST +23 -0
- package/external/fast-float/LICENSE-MIT +27 -0
- package/external/fast-float/README.md +545 -0
- package/external/fast-float/cgmanifest.json +15 -0
- package/external/fast-float/fast-float.vcxitems +14 -0
- package/external/fast-float/include/fast_float/ascii_number.h +588 -0
- package/external/fast-float/include/fast_float/bigint.h +638 -0
- package/external/fast-float/include/fast_float/constexpr_feature_detect.h +46 -0
- package/external/fast-float/include/fast_float/decimal_to_binary.h +212 -0
- package/external/fast-float/include/fast_float/digit_comparison.h +457 -0
- package/external/fast-float/include/fast_float/fast_float.h +59 -0
- package/external/fast-float/include/fast_float/fast_table.h +708 -0
- package/external/fast-float/include/fast_float/float_common.h +1240 -0
- package/external/fast-float/include/fast_float/parse_number.h +399 -0
- package/external/fast-float/sync-config.json +8 -0
- package/external/fmt/.syncignore +10 -0
- package/external/fmt/CONTRIBUTING.md +20 -0
- package/external/fmt/LICENSE +27 -0
- package/external/fmt/README.md +484 -0
- package/external/fmt/doc/ChangeLog-old.md +3290 -0
- package/external/fmt/doc/api.md +650 -0
- package/external/fmt/doc/fmt.css +61 -0
- package/external/fmt/doc/fmt.js +4 -0
- package/external/fmt/doc/get-started.md +222 -0
- package/external/fmt/doc/index.md +151 -0
- package/external/fmt/doc/perf.svg +1 -0
- package/external/fmt/doc/python-license.txt +290 -0
- package/external/fmt/doc/syntax.md +887 -0
- package/external/fmt/fmt.vcxitems +28 -0
- package/external/fmt/include/fmt/args.h +228 -0
- package/external/fmt/include/fmt/base.h +3077 -0
- package/external/fmt/include/fmt/chrono.h +2432 -0
- package/external/fmt/include/fmt/color.h +612 -0
- package/external/fmt/include/fmt/compile.h +529 -0
- package/external/fmt/include/fmt/core.h +5 -0
- package/external/fmt/include/fmt/format-inl.h +1928 -0
- package/external/fmt/include/fmt/format.h +4427 -0
- package/external/fmt/include/fmt/os.h +439 -0
- package/external/fmt/include/fmt/ostream.h +211 -0
- package/external/fmt/include/fmt/printf.h +656 -0
- package/external/fmt/include/fmt/ranges.h +882 -0
- package/external/fmt/include/fmt/std.h +699 -0
- package/external/fmt/include/fmt/xchar.h +322 -0
- package/external/fmt/src/fmt.cc +135 -0
- package/external/fmt/src/format.cc +43 -0
- package/external/fmt/src/os.cc +403 -0
- package/external/fmt/sync-config.json +8 -0
- package/external/folly/.syncignore +60 -0
- package/external/folly/LICENSE +200 -0
- package/external/folly/README.md +263 -0
- package/{fmt → external/folly/folly}/.clang-format +0 -1
- package/external/folly/folly/AtomicHashArray-inl.h +546 -0
- package/external/folly/folly/AtomicHashArray.h +431 -0
- package/external/folly/folly/AtomicHashMap-inl.h +653 -0
- package/external/folly/folly/AtomicHashMap.h +484 -0
- package/external/folly/folly/AtomicIntrusiveLinkedList.h +206 -0
- package/external/folly/folly/AtomicLinkedList.h +110 -0
- package/external/folly/folly/AtomicUnorderedMap.h +522 -0
- package/external/folly/folly/BUCK +1631 -0
- package/external/folly/folly/BUILD_MODE.bzl +72 -0
- package/external/folly/folly/Benchmark.cpp +986 -0
- package/external/folly/folly/Benchmark.h +680 -0
- package/external/folly/folly/BenchmarkUtil.h +47 -0
- package/external/folly/folly/Bits.h +17 -0
- package/external/folly/folly/CMakeLists.txt +110 -0
- package/external/folly/folly/CPortability.h +338 -0
- package/external/folly/folly/CancellationToken-inl.h +449 -0
- package/external/folly/folly/CancellationToken.cpp +250 -0
- package/external/folly/folly/CancellationToken.h +365 -0
- package/external/folly/folly/Chrono.h +132 -0
- package/external/folly/folly/ClockGettimeWrappers.cpp +93 -0
- package/external/folly/folly/ClockGettimeWrappers.h +29 -0
- package/external/folly/folly/ConcurrentBitSet.h +157 -0
- package/external/folly/folly/ConcurrentLazy.h +74 -0
- package/external/folly/folly/ConcurrentSkipList-inl.h +341 -0
- package/external/folly/folly/ConcurrentSkipList.h +824 -0
- package/external/folly/folly/ConstructorCallbackList.h +158 -0
- package/external/folly/folly/Conv.h +2026 -0
- package/external/folly/folly/CppAttributes.h +170 -0
- package/external/folly/folly/CpuId.h +297 -0
- package/external/folly/folly/DefaultKeepAliveExecutor.h +172 -0
- package/external/folly/folly/Demangle.cpp +255 -0
- package/external/folly/folly/Demangle.h +73 -0
- package/external/folly/folly/DiscriminatedPtr.h +236 -0
- package/external/folly/folly/DynamicConverter.h +17 -0
- package/external/folly/folly/Exception.h +150 -0
- package/external/folly/folly/ExceptionString.cpp +51 -0
- package/external/folly/folly/ExceptionString.h +33 -0
- package/external/folly/folly/ExceptionWrapper-inl.h +264 -0
- package/external/folly/folly/ExceptionWrapper.cpp +37 -0
- package/external/folly/folly/ExceptionWrapper.h +377 -0
- package/external/folly/folly/Executor.cpp +111 -0
- package/external/folly/folly/Executor.h +351 -0
- package/external/folly/folly/Expected.h +1725 -0
- package/external/folly/folly/FBString.h +2888 -0
- package/external/folly/folly/FBVector.h +17 -0
- package/external/folly/folly/File.cpp +180 -0
- package/external/folly/folly/File.h +177 -0
- package/external/folly/folly/FileUtil.cpp +378 -0
- package/external/folly/folly/FileUtil.h +332 -0
- package/external/folly/folly/Fingerprint.cpp +135 -0
- package/external/folly/folly/Fingerprint.h +289 -0
- package/external/folly/folly/FixedString.h +2965 -0
- package/external/folly/folly/FollyMemcpy.cpp +30 -0
- package/external/folly/folly/FollyMemcpy.h +23 -0
- package/external/folly/folly/FollyMemset.cpp +29 -0
- package/external/folly/folly/FollyMemset.h +25 -0
- package/external/folly/folly/Format-inl.h +1152 -0
- package/external/folly/folly/Format.cpp +429 -0
- package/external/folly/folly/Format.h +463 -0
- package/external/folly/folly/FormatArg.h +285 -0
- package/external/folly/folly/FormatTraits.h +65 -0
- package/external/folly/folly/Function.h +1159 -0
- package/external/folly/folly/GLog.h +85 -0
- package/external/folly/folly/GroupVarint.cpp +153 -0
- package/external/folly/folly/GroupVarint.h +630 -0
- package/external/folly/folly/Hash.h +20 -0
- package/external/folly/folly/IPAddress.cpp +490 -0
- package/external/folly/folly/IPAddress.h +667 -0
- package/external/folly/folly/IPAddressException.h +82 -0
- package/external/folly/folly/IPAddressV4.cpp +305 -0
- package/external/folly/folly/IPAddressV4.h +495 -0
- package/external/folly/folly/IPAddressV6.cpp +541 -0
- package/external/folly/folly/IPAddressV6.h +627 -0
- package/external/folly/folly/Indestructible.h +164 -0
- package/external/folly/folly/IndexedMemPool.h +550 -0
- package/external/folly/folly/IntrusiveList.h +17 -0
- package/external/folly/folly/Lazy.h +142 -0
- package/external/folly/folly/Likely.h +76 -0
- package/external/folly/folly/MPMCPipeline.h +280 -0
- package/external/folly/folly/MPMCQueue.h +1556 -0
- package/external/folly/folly/MacAddress.cpp +188 -0
- package/external/folly/folly/MacAddress.h +260 -0
- package/external/folly/folly/MapUtil.h +17 -0
- package/external/folly/folly/Math.h +258 -0
- package/external/folly/folly/MaybeManagedPtr.h +120 -0
- package/external/folly/folly/Memory.h +900 -0
- package/external/folly/folly/MicroLock.cpp +76 -0
- package/external/folly/folly/MicroLock.h +354 -0
- package/external/folly/folly/MicroSpinLock.h +17 -0
- package/external/folly/folly/MoveWrapper.h +76 -0
- package/external/folly/folly/ObserverContainer.h +1026 -0
- package/external/folly/folly/Optional.h +743 -0
- package/external/folly/folly/Overload.h +325 -0
- package/external/folly/folly/PackedSyncPtr.h +147 -0
- package/external/folly/folly/Padded.h +464 -0
- package/external/folly/folly/Poly-inl.h +230 -0
- package/external/folly/folly/Poly.h +1095 -0
- package/external/folly/folly/PolyException.h +43 -0
- package/external/folly/folly/Portability.h +644 -0
- package/external/folly/folly/Preprocessor.h +236 -0
- package/external/folly/folly/ProducerConsumerQueue.h +182 -0
- package/external/folly/folly/RWSpinLock.h +17 -0
- package/external/folly/folly/Random-inl.h +86 -0
- package/external/folly/folly/Random.cpp +184 -0
- package/external/folly/folly/Random.h +434 -0
- package/external/folly/folly/Range.h +1772 -0
- package/external/folly/folly/Replaceable.h +636 -0
- package/external/folly/folly/ScopeGuard.cpp +29 -0
- package/external/folly/folly/ScopeGuard.h +420 -0
- package/external/folly/folly/SharedMutex.cpp +81 -0
- package/external/folly/folly/SharedMutex.h +1751 -0
- package/external/folly/folly/Singleton-inl.h +332 -0
- package/external/folly/folly/Singleton.cpp +512 -0
- package/external/folly/folly/Singleton.h +891 -0
- package/external/folly/folly/SingletonThreadLocal.cpp +53 -0
- package/external/folly/folly/SingletonThreadLocal.h +263 -0
- package/external/folly/folly/SocketAddress.cpp +786 -0
- package/external/folly/folly/SocketAddress.h +768 -0
- package/external/folly/folly/SpinLock.h +55 -0
- package/external/folly/folly/String-inl.h +668 -0
- package/external/folly/folly/String.cpp +777 -0
- package/external/folly/folly/String.h +767 -0
- package/external/folly/folly/Subprocess.cpp +1142 -0
- package/external/folly/folly/Subprocess.h +1055 -0
- package/external/folly/folly/Synchronized.h +1833 -0
- package/external/folly/folly/SynchronizedPtr.h +106 -0
- package/external/folly/folly/ThreadCachedInt.h +175 -0
- package/external/folly/folly/ThreadLocal.h +478 -0
- package/external/folly/folly/TimeoutQueue.cpp +78 -0
- package/external/folly/folly/TimeoutQueue.h +123 -0
- package/external/folly/folly/TokenBucket.h +673 -0
- package/external/folly/folly/Traits.h +1442 -0
- package/external/folly/folly/Try-inl.h +372 -0
- package/external/folly/folly/Try.cpp +23 -0
- package/external/folly/folly/Try.h +728 -0
- package/external/folly/folly/UTF8String.h +56 -0
- package/external/folly/folly/Unicode.cpp +201 -0
- package/external/folly/folly/Unicode.h +94 -0
- package/external/folly/folly/Unit.h +65 -0
- package/external/folly/folly/Uri-inl.h +101 -0
- package/external/folly/folly/Uri.cpp +190 -0
- package/external/folly/folly/Uri.h +142 -0
- package/external/folly/folly/Utility.h +932 -0
- package/external/folly/folly/VERSION +1 -0
- package/external/folly/folly/Varint.h +230 -0
- package/external/folly/folly/VirtualExecutor.h +17 -0
- package/external/folly/folly/algorithm/simd/BUCK +47 -0
- package/external/folly/folly/algorithm/simd/Contains.cpp +42 -0
- package/external/folly/folly/algorithm/simd/Contains.h +116 -0
- package/external/folly/folly/algorithm/simd/FindFixed.h +301 -0
- package/external/folly/folly/algorithm/simd/Ignore.h +52 -0
- package/external/folly/folly/algorithm/simd/Movemask.h +207 -0
- package/external/folly/folly/algorithm/simd/detail/BUCK +70 -0
- package/external/folly/folly/algorithm/simd/detail/ContainsImpl.h +91 -0
- package/external/folly/folly/algorithm/simd/detail/SimdAnyOf.h +83 -0
- package/external/folly/folly/algorithm/simd/detail/SimdForEach.h +209 -0
- package/external/folly/folly/algorithm/simd/detail/SimdPlatform.h +445 -0
- package/external/folly/folly/algorithm/simd/detail/Traits.h +125 -0
- package/external/folly/folly/algorithm/simd/detail/UnrollUtils.h +126 -0
- package/external/folly/folly/base64.h +264 -0
- package/external/folly/folly/chrono/BUCK +29 -0
- package/external/folly/folly/chrono/Clock.h +65 -0
- package/external/folly/folly/chrono/Conv.h +712 -0
- package/external/folly/folly/chrono/test/BUCK +26 -0
- package/external/folly/folly/chrono/test/ClockTest.cpp +68 -0
- package/external/folly/folly/chrono/test/ConvTest.cpp +652 -0
- package/external/folly/folly/concurrency/AtomicSharedPtr.h +387 -0
- package/external/folly/folly/concurrency/BUCK +170 -0
- package/external/folly/folly/concurrency/CacheLocality.h +460 -0
- package/external/folly/folly/concurrency/ConcurrentHashMap.h +822 -0
- package/external/folly/folly/concurrency/CoreCachedSharedPtr.h +232 -0
- package/external/folly/folly/concurrency/DeadlockDetector.cpp +27 -0
- package/external/folly/folly/concurrency/DeadlockDetector.h +44 -0
- package/external/folly/folly/concurrency/DynamicBoundedQueue.h +751 -0
- package/external/folly/folly/concurrency/PriorityUnboundedQueueSet.h +207 -0
- package/external/folly/folly/concurrency/ProcessLocalUniqueId.cpp +46 -0
- package/external/folly/folly/concurrency/ProcessLocalUniqueId.h +38 -0
- package/external/folly/folly/concurrency/SingletonRelaxedCounter.h +325 -0
- package/external/folly/folly/concurrency/ThreadCachedSynchronized.h +227 -0
- package/external/folly/folly/concurrency/UnboundedQueue.h +891 -0
- package/external/folly/folly/concurrency/container/BUCK +77 -0
- package/external/folly/folly/concurrency/container/FlatCombiningPriorityQueue.h +426 -0
- package/external/folly/folly/concurrency/container/LockFreeRingBuffer.h +306 -0
- package/external/folly/folly/concurrency/container/RelaxedConcurrentPriorityQueue.h +1212 -0
- package/external/folly/folly/concurrency/container/SingleWriterFixedHashMap.h +322 -0
- package/external/folly/folly/concurrency/container/atomic_grow_array.h +564 -0
- package/external/folly/folly/concurrency/container/test/BUCK +75 -0
- package/external/folly/folly/concurrency/container/test/FlatCombiningPriorityQueueTest.cpp +570 -0
- package/external/folly/folly/concurrency/container/test/LockFreeRingBufferTest.cpp +276 -0
- package/external/folly/folly/concurrency/container/test/RelaxedConcurrentPriorityQueueTest.cpp +1570 -0
- package/external/folly/folly/concurrency/container/test/SingleWriterFixedHashMapTest.cpp +401 -0
- package/external/folly/folly/concurrency/container/test/atomic_grow_array_test.cpp +187 -0
- package/external/folly/folly/concurrency/detail/AtomicSharedPtr-detail.h +212 -0
- package/external/folly/folly/concurrency/detail/ConcurrentHashMap-detail.h +1911 -0
- package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.cpp +43 -0
- package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.h +190 -0
- package/external/folly/folly/concurrency/memory/BUCK +53 -0
- package/external/folly/folly/concurrency/memory/PrimaryPtr.h +338 -0
- package/external/folly/folly/concurrency/memory/ReadMostlySharedPtr.h +511 -0
- package/external/folly/folly/concurrency/memory/TLRefCount.h +228 -0
- package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrBenchmark.cpp +56 -0
- package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrTest.cpp +454 -0
- package/external/folly/folly/concurrency/memory/test/BUCK +95 -0
- package/external/folly/folly/concurrency/memory/test/PrimaryPtrTest.cpp +303 -0
- package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrBenchmark.cpp +138 -0
- package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrStressTest.cpp +75 -0
- package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrTest.cpp +378 -0
- package/external/folly/folly/concurrency/memory/test/RefCountBenchmark.cpp +90 -0
- package/external/folly/folly/concurrency/memory/test/RefCountTest.cpp +168 -0
- package/external/folly/folly/concurrency/test/AtomicSharedPtrCounted.h +156 -0
- package/external/folly/folly/concurrency/test/AtomicSharedPtrPerformance.cpp +255 -0
- package/external/folly/folly/concurrency/test/AtomicSharedPtrTest.cpp +257 -0
- package/external/folly/folly/concurrency/test/BUCK +229 -0
- package/external/folly/folly/concurrency/test/CacheLocalityBenchmark.cpp +392 -0
- package/external/folly/folly/concurrency/test/CacheLocalityTest.cpp +1229 -0
- package/external/folly/folly/concurrency/test/ConcurrentHashMapBench.cpp +260 -0
- package/external/folly/folly/concurrency/test/ConcurrentHashMapTest.cpp +1242 -0
- package/external/folly/folly/concurrency/test/CoreCachedSharedPtrTest.cpp +408 -0
- package/external/folly/folly/concurrency/test/DynamicBoundedQueueTest.cpp +984 -0
- package/external/folly/folly/concurrency/test/PriorityUnboundedQueueSetTest.cpp +73 -0
- package/external/folly/folly/concurrency/test/ProcessLocalUniqueIdTest.cpp +66 -0
- package/external/folly/folly/concurrency/test/SingletonRelaxedCounterBench.cpp +101 -0
- package/external/folly/folly/concurrency/test/SingletonRelaxedCounterTest.cpp +185 -0
- package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedBench.cpp +76 -0
- package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedTest.cpp +93 -0
- package/external/folly/folly/concurrency/test/UnboundedQueueTest.cpp +1302 -0
- package/external/folly/folly/container/Access.h +57 -0
- package/external/folly/folly/container/Array.h +87 -0
- package/external/folly/folly/container/BUCK +353 -0
- package/external/folly/folly/container/BitIterator.h +203 -0
- package/external/folly/folly/container/Enumerate.h +162 -0
- package/external/folly/folly/container/EvictingCacheMap.h +730 -0
- package/external/folly/folly/container/F14.md +300 -0
- package/external/folly/folly/container/F14Map-fwd.h +113 -0
- package/external/folly/folly/container/F14Map.h +2108 -0
- package/external/folly/folly/container/F14Set-fwd.h +95 -0
- package/external/folly/folly/container/F14Set.h +1603 -0
- package/external/folly/folly/container/FBVector.h +1711 -0
- package/external/folly/folly/container/Foreach-inl.h +316 -0
- package/external/folly/folly/container/Foreach.h +209 -0
- package/external/folly/folly/container/HeterogeneousAccess-fwd.h +33 -0
- package/external/folly/folly/container/HeterogeneousAccess.h +171 -0
- package/external/folly/folly/container/IntrusiveHeap.h +268 -0
- package/external/folly/folly/container/IntrusiveList.h +131 -0
- package/external/folly/folly/container/Iterator.h +843 -0
- package/external/folly/folly/container/MapUtil.h +376 -0
- package/external/folly/folly/container/Merge.h +90 -0
- package/external/folly/folly/container/RegexMatchCache.cpp +521 -0
- package/external/folly/folly/container/RegexMatchCache.h +699 -0
- package/external/folly/folly/container/Reserve.h +109 -0
- package/external/folly/folly/container/SparseByteSet.h +123 -0
- package/external/folly/folly/container/View.h +81 -0
- package/external/folly/folly/container/WeightedEvictingCacheMap.h +651 -0
- package/external/folly/folly/container/detail/BUCK +115 -0
- package/external/folly/folly/container/detail/BitIteratorDetail.h +87 -0
- package/external/folly/folly/container/detail/F14Defaults.h +34 -0
- package/external/folly/folly/container/detail/F14IntrinsicsAvailability.h +67 -0
- package/external/folly/folly/container/detail/F14MapFallback.h +717 -0
- package/external/folly/folly/container/detail/F14Mask.h +235 -0
- package/external/folly/folly/container/detail/F14Policy.h +1523 -0
- package/external/folly/folly/container/detail/F14SetFallback.h +528 -0
- package/external/folly/folly/container/detail/F14Table.cpp +71 -0
- package/external/folly/folly/container/detail/F14Table.h +2680 -0
- package/external/folly/folly/container/detail/Util.h +303 -0
- package/external/folly/folly/container/detail/tape_detail.h +135 -0
- package/external/folly/folly/container/detail/test/BUCK +14 -0
- package/external/folly/folly/container/detail/test/F14DetailTest.cpp +47 -0
- package/external/folly/folly/container/heap_vector_types.h +1683 -0
- package/external/folly/folly/container/range_traits.h +81 -0
- package/external/folly/folly/container/small_vector.h +1476 -0
- package/external/folly/folly/container/sorted_vector_types.h +1652 -0
- package/external/folly/folly/container/span.h +408 -0
- package/external/folly/folly/container/tape.h +608 -0
- package/external/folly/folly/container/test/.clang-tidy +12 -0
- package/external/folly/folly/container/test/AccessTest.cpp +138 -0
- package/external/folly/folly/container/test/ArrayTest.cpp +84 -0
- package/external/folly/folly/container/test/BUCK +568 -0
- package/external/folly/folly/container/test/BitIteratorBench.cpp +112 -0
- package/external/folly/folly/container/test/BitIteratorTest.cpp +109 -0
- package/external/folly/folly/container/test/EnumerateTest.cpp +294 -0
- package/external/folly/folly/container/test/EvictingCacheMapBench.cpp +80 -0
- package/external/folly/folly/container/test/EvictingCacheMapTest.cpp +842 -0
- package/external/folly/folly/container/test/F14AsanSupportTest.cpp +143 -0
- package/external/folly/folly/container/test/F14FwdTest.cpp +37 -0
- package/external/folly/folly/container/test/F14InterprocessTest.cpp +404 -0
- package/external/folly/folly/container/test/F14MapTest.cpp +2543 -0
- package/external/folly/folly/container/test/F14PolicyTest.cpp +49 -0
- package/external/folly/folly/container/test/F14SetTest.cpp +1738 -0
- package/external/folly/folly/container/test/F14SmallOverheads.cpp +215 -0
- package/external/folly/folly/container/test/F14TestUtil.h +117 -0
- package/external/folly/folly/container/test/FBVectorBenchmark.cpp +380 -0
- package/external/folly/folly/container/test/FBVectorBenchmarks.cpp.h +100 -0
- package/external/folly/folly/container/test/FBVectorTest.cpp +326 -0
- package/external/folly/folly/container/test/FBVectorTests.cpp.h +304 -0
- package/external/folly/folly/container/test/ForeachBenchmark.cpp +388 -0
- package/external/folly/folly/container/test/ForeachTest.cpp +338 -0
- package/external/folly/folly/container/test/HashMapsBench.cpp +458 -0
- package/external/folly/folly/container/test/HeterogeneousAccessTest.cpp +242 -0
- package/external/folly/folly/container/test/IntrusiveHeapTest.cpp +262 -0
- package/external/folly/folly/container/test/IteratorTest.cpp +989 -0
- package/external/folly/folly/container/test/MapUtilTest.cpp +365 -0
- package/external/folly/folly/container/test/MergeTest.cpp +66 -0
- package/external/folly/folly/container/test/RegexMatchCacheTest.cpp +634 -0
- package/external/folly/folly/container/test/ReserveTest.cpp +173 -0
- package/external/folly/folly/container/test/SparseByteSetBenchmark.cpp +153 -0
- package/external/folly/folly/container/test/SparseByteSetTest.cpp +117 -0
- package/external/folly/folly/container/test/TrackingTypes.h +584 -0
- package/external/folly/folly/container/test/UtilTest.cpp +609 -0
- package/external/folly/folly/container/test/WeightedEvictingCacheMapTest.cpp +800 -0
- package/external/folly/folly/container/test/heap_vector_types_test.cpp +1774 -0
- package/external/folly/folly/container/test/range_traits_test.cpp +59 -0
- package/external/folly/folly/container/test/small_vector_test.cpp +1571 -0
- package/external/folly/folly/container/test/sorted_vector_test.cpp +1589 -0
- package/external/folly/folly/container/test/span_test.cpp +520 -0
- package/external/folly/folly/container/test/tape_bench.cpp +200 -0
- package/external/folly/folly/container/test/tape_test.cpp +590 -0
- package/external/folly/folly/defs.bzl +238 -0
- package/external/folly/folly/detail/AsyncTrace.cpp +36 -0
- package/external/folly/folly/detail/AsyncTrace.h +44 -0
- package/external/folly/folly/detail/AtomicHashUtils.h +42 -0
- package/external/folly/folly/detail/AtomicUnorderedMapUtils.h +80 -0
- package/external/folly/folly/detail/BUCK +406 -0
- package/external/folly/folly/detail/DiscriminatedPtrDetail.h +172 -0
- package/external/folly/folly/detail/FileUtilDetail.cpp +63 -0
- package/external/folly/folly/detail/FileUtilDetail.h +85 -0
- package/external/folly/folly/detail/FileUtilVectorDetail.h +81 -0
- package/external/folly/folly/detail/FingerprintPolynomial.h +132 -0
- package/external/folly/folly/detail/Futex-inl.h +123 -0
- package/external/folly/folly/detail/Futex.cpp +273 -0
- package/external/folly/folly/detail/Futex.h +109 -0
- package/external/folly/folly/detail/GroupVarintDetail.h +101 -0
- package/external/folly/folly/detail/IPAddress.cpp +37 -0
- package/external/folly/folly/detail/IPAddress.h +57 -0
- package/external/folly/folly/detail/IPAddressSource.h +278 -0
- package/external/folly/folly/detail/Iterators.h +156 -0
- package/external/folly/folly/detail/MPMCPipelineDetail.h +122 -0
- package/external/folly/folly/detail/MemoryIdler.cpp +233 -0
- package/external/folly/folly/detail/MemoryIdler.h +216 -0
- package/external/folly/folly/detail/PerfScoped.cpp +112 -0
- package/external/folly/folly/detail/PerfScoped.h +70 -0
- package/external/folly/folly/detail/PolyDetail.h +921 -0
- package/external/folly/folly/detail/RangeCommon.cpp +55 -0
- package/external/folly/folly/detail/RangeCommon.h +93 -0
- package/external/folly/folly/detail/RangeSse42.cpp +198 -0
- package/external/folly/folly/detail/RangeSse42.h +30 -0
- package/external/folly/folly/detail/SimpleSimdStringUtils.cpp +31 -0
- package/external/folly/folly/detail/SimpleSimdStringUtils.h +27 -0
- package/external/folly/folly/detail/SimpleSimdStringUtilsImpl.h +63 -0
- package/external/folly/folly/detail/Singleton.h +34 -0
- package/external/folly/folly/detail/SlowFingerprint.h +90 -0
- package/external/folly/folly/detail/SocketFastOpen.cpp +175 -0
- package/external/folly/folly/detail/SocketFastOpen.h +89 -0
- package/external/folly/folly/detail/SplitStringSimd.cpp +84 -0
- package/external/folly/folly/detail/SplitStringSimd.h +151 -0
- package/external/folly/folly/detail/SplitStringSimdImpl.h +149 -0
- package/external/folly/folly/detail/Sse.cpp +35 -0
- package/external/folly/folly/detail/Sse.h +45 -0
- package/external/folly/folly/detail/StaticSingletonManager.cpp +119 -0
- package/external/folly/folly/detail/StaticSingletonManager.h +298 -0
- package/external/folly/folly/detail/ThreadLocalDetail.cpp +492 -0
- package/external/folly/folly/detail/ThreadLocalDetail.h +800 -0
- package/external/folly/folly/detail/TrapOnAvx512.cpp +41 -0
- package/external/folly/folly/detail/TrapOnAvx512.h +21 -0
- package/external/folly/folly/detail/TurnSequencer.h +295 -0
- package/external/folly/folly/detail/TypeList.h +551 -0
- package/external/folly/folly/detail/UniqueInstance.cpp +136 -0
- package/external/folly/folly/detail/UniqueInstance.h +68 -0
- package/external/folly/folly/detail/base64_detail/BUCK +102 -0
- package/external/folly/folly/detail/base64_detail/Base64Api.cpp +40 -0
- package/external/folly/folly/detail/base64_detail/Base64Api.h +101 -0
- package/external/folly/folly/detail/base64_detail/Base64Common.h +80 -0
- package/external/folly/folly/detail/base64_detail/Base64Constants.h +79 -0
- package/external/folly/folly/detail/base64_detail/Base64HiddenConstants.h +129 -0
- package/external/folly/folly/detail/base64_detail/Base64SWAR.cpp +161 -0
- package/external/folly/folly/detail/base64_detail/Base64SWAR.h +32 -0
- package/external/folly/folly/detail/base64_detail/Base64Scalar.h +262 -0
- package/external/folly/folly/detail/base64_detail/Base64Simd.h +102 -0
- package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.cpp +42 -0
- package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.h +33 -0
- package/external/folly/folly/detail/base64_detail/Base64_SSE4_2_Platform.h +167 -0
- package/external/folly/folly/detail/base64_detail/README.md +392 -0
- package/external/folly/folly/detail/base64_detail/tests/BUCK +36 -0
- package/external/folly/folly/detail/base64_detail/tests/Base64AgainstScalarTest.cpp +141 -0
- package/external/folly/folly/detail/base64_detail/tests/Base64PlatformTest.cpp +273 -0
- package/external/folly/folly/detail/base64_detail/tests/Base64SpecialCasesTest.cpp +555 -0
- package/external/folly/folly/detail/test/AsyncTraceTest.cpp +43 -0
- package/external/folly/folly/detail/test/BUCK +118 -0
- package/external/folly/folly/detail/test/FileUtilDetailTest.cpp +56 -0
- package/external/folly/folly/detail/test/PerfScopedTest.cpp +107 -0
- package/external/folly/folly/detail/test/SimpleSimdStringUtilsTest.cpp +92 -0
- package/external/folly/folly/detail/test/SplitStringSimdTest.cpp +242 -0
- package/external/folly/folly/detail/test/StaticSingletonManagerTest.cpp +121 -0
- package/external/folly/folly/detail/test/ThreadLocalBenchmark.cpp +116 -0
- package/external/folly/folly/detail/test/ThreadLocalDetailTest.cpp +194 -0
- package/external/folly/folly/detail/test/TrapOnAvx512TestNegative.cpp +29 -0
- package/external/folly/folly/detail/test/UniqueInstanceTest.cpp +60 -0
- package/external/folly/folly/detail/thread_local_globals.cpp +69 -0
- package/external/folly/folly/detail/thread_local_globals.h +36 -0
- package/external/folly/folly/docs/AtomicHashMap.md +134 -0
- package/external/folly/folly/docs/Benchmark.md +310 -0
- package/external/folly/folly/docs/Conv.md +291 -0
- package/external/folly/folly/docs/Dynamic.md +220 -0
- package/external/folly/folly/docs/DynamicConverter.md +71 -0
- package/external/folly/folly/docs/Executors.md +63 -0
- package/external/folly/folly/docs/FBString.md +46 -0
- package/external/folly/folly/docs/FBVector.md +200 -0
- package/external/folly/folly/docs/Fbvector--graphical_solutions.png +0 -0
- package/external/folly/folly/docs/Format.md +177 -0
- package/external/folly/folly/docs/Function.md +92 -0
- package/external/folly/folly/docs/Futures.md +263 -0
- package/external/folly/folly/docs/GroupVarint.md +46 -0
- package/external/folly/folly/docs/Histogram.md +104 -0
- package/external/folly/folly/docs/MapUtils.md +80 -0
- package/external/folly/folly/docs/Overview.md +263 -0
- package/external/folly/folly/docs/PackedSyncPtr.md +77 -0
- package/external/folly/folly/docs/Poly.md +500 -0
- package/external/folly/folly/docs/ProducerConsumerQueue.md +82 -0
- package/external/folly/folly/docs/Rcu.md +218 -0
- package/external/folly/folly/docs/SmallLocks.md +24 -0
- package/external/folly/folly/docs/Synchronized.md +793 -0
- package/external/folly/folly/docs/ThreadCachedInt.md +98 -0
- package/external/folly/folly/docs/ThreadLocal.md +105 -0
- package/external/folly/folly/docs/Traits.md +161 -0
- package/external/folly/folly/docs/small_vector.md +64 -0
- package/external/folly/folly/docs/style.css +23 -0
- package/external/folly/folly/dynamic-inl.h +17 -0
- package/external/folly/folly/dynamic.h +17 -0
- package/external/folly/folly/folly_extended_library.bzl +28 -0
- package/external/folly/folly/functional/ApplyTuple.h +204 -0
- package/external/folly/folly/functional/BUCK +57 -0
- package/external/folly/folly/functional/Invoke.h +880 -0
- package/external/folly/folly/functional/Partial.h +130 -0
- package/external/folly/folly/functional/protocol.h +203 -0
- package/external/folly/folly/functional/test/ApplyTupleTest.cpp +549 -0
- package/external/folly/folly/functional/test/BUCK +57 -0
- package/external/folly/folly/functional/test/InvokeTest.cpp +483 -0
- package/external/folly/folly/functional/test/PartialTest.cpp +141 -0
- package/external/folly/folly/functional/test/protocol_test.cpp +177 -0
- package/external/folly/folly/functional/test/traits_test.cpp +551 -0
- package/external/folly/folly/functional/traits.h +675 -0
- package/external/folly/folly/hash/BUCK +86 -0
- package/external/folly/folly/hash/Checksum.cpp +275 -0
- package/external/folly/folly/hash/Checksum.h +94 -0
- package/external/folly/folly/hash/FarmHash.h +46 -0
- package/external/folly/folly/hash/Hash.h +1045 -0
- package/external/folly/folly/hash/MurmurHash.h +86 -0
- package/external/folly/folly/hash/SpookyHashV1.cpp +391 -0
- package/external/folly/folly/hash/SpookyHashV1.h +307 -0
- package/external/folly/folly/hash/SpookyHashV2.cpp +392 -0
- package/external/folly/folly/hash/SpookyHashV2.h +339 -0
- package/external/folly/folly/hash/detail/BUCK +26 -0
- package/external/folly/folly/hash/detail/ChecksumDetail.cpp +296 -0
- package/external/folly/folly/hash/detail/ChecksumDetail.h +137 -0
- package/external/folly/folly/hash/detail/Crc32CombineDetail.cpp +191 -0
- package/external/folly/folly/hash/detail/Crc32cDetail.cpp +303 -0
- package/external/folly/folly/hash/test/BUCK +132 -0
- package/external/folly/folly/hash/test/ChecksumBenchmark.cpp +91 -0
- package/external/folly/folly/hash/test/ChecksumTest.cpp +587 -0
- package/external/folly/folly/hash/test/FarmHashTest.cpp +41 -0
- package/external/folly/folly/hash/test/HashBenchmark.cpp +238 -0
- package/external/folly/folly/hash/test/HashTest.cpp +997 -0
- package/external/folly/folly/hash/test/MurmurHashTest.cpp +76 -0
- package/external/folly/folly/hash/test/SpookyHashV1Test.cpp +559 -0
- package/external/folly/folly/hash/test/SpookyHashV2Test.cpp +549 -0
- package/external/folly/folly/hash/test/traits_test.cpp +69 -0
- package/external/folly/folly/hash/traits.h +115 -0
- package/external/folly/folly/json/BUCK +155 -0
- package/external/folly/folly/json/DynamicConverter.h +464 -0
- package/external/folly/folly/json/DynamicParser-inl.h +316 -0
- package/external/folly/folly/json/DynamicParser.cpp +198 -0
- package/external/folly/folly/json/DynamicParser.h +394 -0
- package/external/folly/folly/json/JSONSchema.cpp +1030 -0
- package/external/folly/folly/json/JSONSchema.h +73 -0
- package/external/folly/folly/json/JsonMockUtil.h +73 -0
- package/external/folly/folly/json/JsonTestUtil.cpp +167 -0
- package/external/folly/folly/json/JsonTestUtil.h +88 -0
- package/external/folly/folly/json/bser/BUCK +24 -0
- package/external/folly/folly/json/bser/Bser.h +107 -0
- package/external/folly/folly/json/bser/Dump.cpp +253 -0
- package/external/folly/folly/json/bser/Load.cpp +246 -0
- package/external/folly/folly/json/bser/test/BUCK +14 -0
- package/external/folly/folly/json/bser/test/BserTest.cpp +149 -0
- package/external/folly/folly/json/dynamic.cpp +552 -0
- package/external/folly/folly/json/dynamic.h +1346 -0
- package/external/folly/folly/json/json.h +238 -0
- package/external/folly/folly/json/json_patch.cpp +325 -0
- package/external/folly/folly/json/json_patch.h +126 -0
- package/external/folly/folly/json/json_pointer.cpp +114 -0
- package/external/folly/folly/json/json_pointer.h +87 -0
- package/external/folly/folly/json/test/BUCK +147 -0
- package/external/folly/folly/json/test/DynamicBenchmark.cpp +146 -0
- package/external/folly/folly/json/test/DynamicConverterTest.cpp +518 -0
- package/external/folly/folly/json/test/DynamicOtherTest.cpp +344 -0
- package/external/folly/folly/json/test/DynamicParserTest.cpp +443 -0
- package/external/folly/folly/json/test/DynamicTest.cpp +1647 -0
- package/external/folly/folly/json/test/JSONSchemaTest.cpp +450 -0
- package/external/folly/folly/json/test/JsonBenchmark.cpp +264 -0
- package/external/folly/folly/json/test/JsonOtherTest.cpp +51 -0
- package/external/folly/folly/json/test/JsonTest.cpp +1153 -0
- package/external/folly/folly/json/test/JsonTestUtilTest.cpp +97 -0
- package/external/folly/folly/json/test/json_patch_test.cpp +361 -0
- package/external/folly/folly/json/test/json_pointer_test.cpp +58 -0
- package/external/folly/folly/json/tool/BUCK +13 -0
- package/external/folly/folly/json/tool/JSONSchemaTester.cpp +58 -0
- package/external/folly/folly/json.h +17 -0
- package/external/folly/folly/json_patch.h +17 -0
- package/external/folly/folly/json_pointer.h +17 -0
- package/external/folly/folly/lang/Access.h +29 -0
- package/external/folly/folly/lang/Align.h +240 -0
- package/external/folly/folly/lang/Aligned.h +92 -0
- package/external/folly/folly/lang/Assume.h +82 -0
- package/external/folly/folly/lang/BUCK +287 -0
- package/external/folly/folly/lang/Badge.h +108 -0
- package/external/folly/folly/lang/Bits.h +570 -0
- package/external/folly/folly/lang/BitsClass.h +312 -0
- package/external/folly/folly/lang/Builtin.h +74 -0
- package/external/folly/folly/lang/CArray.h +34 -0
- package/external/folly/folly/lang/CString.cpp +86 -0
- package/external/folly/folly/lang/CString.h +55 -0
- package/external/folly/folly/lang/Cast.h +51 -0
- package/external/folly/folly/lang/CheckedMath.h +253 -0
- package/external/folly/folly/lang/CustomizationPoint.h +58 -0
- package/external/folly/folly/lang/Exception.cpp +822 -0
- package/external/folly/folly/lang/Exception.h +716 -0
- package/external/folly/folly/lang/Extern.h +55 -0
- package/external/folly/folly/lang/Hint-inl.h +144 -0
- package/external/folly/folly/lang/Hint.h +238 -0
- package/external/folly/folly/lang/Keep.h +98 -0
- package/external/folly/folly/lang/New.h +124 -0
- package/external/folly/folly/lang/Ordering.h +140 -0
- package/external/folly/folly/lang/Pretty.h +159 -0
- package/external/folly/folly/lang/PropagateConst.h +413 -0
- package/external/folly/folly/lang/RValueReferenceWrapper.h +152 -0
- package/external/folly/folly/lang/SafeAssert.cpp +589 -0
- package/external/folly/folly/lang/StaticConst.h +33 -0
- package/external/folly/folly/lang/Thunk.h +100 -0
- package/external/folly/folly/lang/TypeInfo.h +58 -0
- package/external/folly/folly/lang/UncaughtExceptions.cpp +17 -0
- package/external/folly/folly/lang/UncaughtExceptions.h +19 -0
- package/external/folly/folly/lang/test/AlignTest.cpp +87 -0
- package/external/folly/folly/lang/test/AlignedTest.cpp +130 -0
- package/external/folly/folly/lang/test/BUCK +258 -0
- package/external/folly/folly/lang/test/BadgeTest.cpp +89 -0
- package/external/folly/folly/lang/test/BitsBenchmark.cpp +164 -0
- package/external/folly/folly/lang/test/BitsClassBenchmark.cpp +122 -0
- package/external/folly/folly/lang/test/BitsClassTest.cpp +379 -0
- package/external/folly/folly/lang/test/BitsTest.cpp +577 -0
- package/external/folly/folly/lang/test/CStringTest.cpp +60 -0
- package/external/folly/folly/lang/test/CastTest.cpp +47 -0
- package/external/folly/folly/lang/test/CheckedMathTest.cpp +394 -0
- package/external/folly/folly/lang/test/ExceptionBench.cpp +427 -0
- package/external/folly/folly/lang/test/ExceptionTest.cpp +413 -0
- package/external/folly/folly/lang/test/ExternTest.cpp +39 -0
- package/external/folly/folly/lang/test/HintTest.cpp +100 -0
- package/external/folly/folly/lang/test/NewTest.cpp +38 -0
- package/external/folly/folly/lang/test/OrderingTest.cpp +105 -0
- package/external/folly/folly/lang/test/PrettyTest.cpp +44 -0
- package/external/folly/folly/lang/test/PropagateConstTest.cpp +356 -0
- package/external/folly/folly/lang/test/RValueReferenceWrapperTest.cpp +85 -0
- package/external/folly/folly/lang/test/SafeAssertTest.cpp +75 -0
- package/external/folly/folly/lang/test/ThunkTest.cpp +105 -0
- package/external/folly/folly/lang/test/ToAsciiBench.cpp +466 -0
- package/external/folly/folly/lang/test/ToAsciiTest.cpp +266 -0
- package/external/folly/folly/lang/test/TypeInfoTest.cpp +56 -0
- package/external/folly/folly/memcpy.S +292 -0
- package/external/folly/folly/memcpy_select_aarch64.cpp +145 -0
- package/external/folly/folly/memory/Arena-inl.h +83 -0
- package/external/folly/folly/memory/Arena.h +325 -0
- package/external/folly/folly/memory/BUCK +191 -0
- package/external/folly/folly/memory/JemallocHugePageAllocator.cpp +449 -0
- package/external/folly/folly/memory/JemallocHugePageAllocator.h +105 -0
- package/external/folly/folly/memory/JemallocHugePageAllocatorTest.cpp +341 -0
- package/external/folly/folly/memory/JemallocNodumpAllocator.cpp +176 -0
- package/external/folly/folly/memory/JemallocNodumpAllocator.h +119 -0
- package/external/folly/folly/memory/JemallocNodumpAllocatorTest.cpp +61 -0
- package/external/folly/folly/memory/MallctlHelper.cpp +37 -0
- package/external/folly/folly/memory/MallctlHelper.h +167 -0
- package/external/folly/folly/memory/Malloc.h +551 -0
- package/external/folly/folly/memory/MemoryResource.h +57 -0
- package/external/folly/folly/memory/ReentrantAllocator.cpp +162 -0
- package/external/folly/folly/memory/ReentrantAllocator.h +261 -0
- package/external/folly/folly/memory/SanitizeAddress.cpp +75 -0
- package/external/folly/folly/memory/SanitizeAddress.h +117 -0
- package/external/folly/folly/memory/SanitizeLeak.cpp +119 -0
- package/external/folly/folly/memory/SanitizeLeak.h +108 -0
- package/external/folly/folly/memory/ThreadCachedArena.cpp +53 -0
- package/external/folly/folly/memory/ThreadCachedArena.h +90 -0
- package/external/folly/folly/memory/UninitializedMemoryHacks.h +426 -0
- package/external/folly/folly/memory/detail/BUCK +10 -0
- package/external/folly/folly/memory/detail/MallocImpl.cpp +52 -0
- package/external/folly/folly/memory/detail/MallocImpl.h +97 -0
- package/external/folly/folly/memory/not_null-inl.h +522 -0
- package/external/folly/folly/memory/not_null.h +449 -0
- package/external/folly/folly/memory/test/ArenaTest.cpp +354 -0
- package/external/folly/folly/memory/test/BUCK +146 -0
- package/external/folly/folly/memory/test/MallctlHelperTest.cpp +169 -0
- package/external/folly/folly/memory/test/MallocBenchmark.cpp +91 -0
- package/external/folly/folly/memory/test/MallocTest.cpp +78 -0
- package/external/folly/folly/memory/test/MemoryResourceTest.cpp +31 -0
- package/external/folly/folly/memory/test/ReentrantAllocatorTest.cpp +144 -0
- package/external/folly/folly/memory/test/SanitizeAddressTest.cpp +67 -0
- package/external/folly/folly/memory/test/SanitizeLeakTest.cpp +139 -0
- package/external/folly/folly/memory/test/ThreadCachedArenaTest.cpp +276 -0
- package/external/folly/folly/memory/test/UninitializedMemoryHacksODR.cpp +21 -0
- package/external/folly/folly/memory/test/UninitializedMemoryHacksTest.cpp +327 -0
- package/external/folly/folly/memory/test/not_null_test.cpp +608 -0
- package/external/folly/folly/memset.S +245 -0
- package/external/folly/folly/memset_select_aarch64.cpp +72 -0
- package/external/folly/folly/portability/Asm.h +50 -0
- package/external/folly/folly/portability/Atomic.h +31 -0
- package/external/folly/folly/portability/BUCK +456 -0
- package/external/folly/folly/portability/Builtins.cpp +31 -0
- package/external/folly/folly/portability/Builtins.h +161 -0
- package/external/folly/folly/portability/Config.h +43 -0
- package/external/folly/folly/portability/Constexpr.h +145 -0
- package/external/folly/folly/portability/Dirent.cpp +140 -0
- package/external/folly/folly/portability/Dirent.h +41 -0
- package/external/folly/folly/portability/Event.h +44 -0
- package/external/folly/folly/portability/Fcntl.cpp +120 -0
- package/external/folly/folly/portability/Fcntl.h +67 -0
- package/external/folly/folly/portability/Filesystem.cpp +67 -0
- package/external/folly/folly/portability/Filesystem.h +114 -0
- package/external/folly/folly/portability/FmtCompile.h +40 -0
- package/external/folly/folly/portability/GFlags.h +139 -0
- package/external/folly/folly/portability/GMock.h +35 -0
- package/external/folly/folly/portability/GTest.h +35 -0
- package/external/folly/folly/portability/IOVec.h +34 -0
- package/external/folly/folly/portability/Libgen.cpp +59 -0
- package/external/folly/folly/portability/Libgen.h +29 -0
- package/external/folly/folly/portability/Libunwind.h +21 -0
- package/external/folly/folly/portability/Malloc.cpp +31 -0
- package/external/folly/folly/portability/Malloc.h +53 -0
- package/external/folly/folly/portability/Math.h +90 -0
- package/external/folly/folly/portability/Memory.h +26 -0
- package/external/folly/folly/portability/OpenSSL.cpp +17 -0
- package/external/folly/folly/portability/OpenSSL.h +102 -0
- package/external/folly/folly/portability/PThread.cpp +697 -0
- package/external/folly/folly/portability/PThread.h +148 -0
- package/external/folly/folly/portability/README.md +21 -0
- package/external/folly/folly/portability/Sched.cpp +41 -0
- package/external/folly/folly/portability/Sched.h +45 -0
- package/external/folly/folly/portability/Sockets.cpp +245 -0
- package/external/folly/folly/portability/Sockets.h +155 -0
- package/external/folly/folly/portability/SourceLocation.h +49 -0
- package/external/folly/folly/portability/Stdio.cpp +77 -0
- package/external/folly/folly/portability/Stdio.h +32 -0
- package/external/folly/folly/portability/Stdlib.cpp +172 -0
- package/external/folly/folly/portability/Stdlib.h +64 -0
- package/external/folly/folly/portability/String.cpp +53 -0
- package/external/folly/folly/portability/String.h +39 -0
- package/external/folly/folly/portability/SysFile.cpp +46 -0
- package/external/folly/folly/portability/SysFile.h +27 -0
- package/external/folly/folly/portability/SysMembarrier.cpp +104 -0
- package/external/folly/folly/portability/SysMembarrier.h +26 -0
- package/external/folly/folly/portability/SysMman.cpp +242 -0
- package/external/folly/folly/portability/SysMman.h +68 -0
- package/external/folly/folly/portability/SysResource.cpp +108 -0
- package/external/folly/folly/portability/SysResource.h +71 -0
- package/external/folly/folly/portability/SysStat.cpp +66 -0
- package/external/folly/folly/portability/SysStat.h +52 -0
- package/external/folly/folly/portability/SysSyscall.h +73 -0
- package/external/folly/folly/portability/SysTime.cpp +62 -0
- package/external/folly/folly/portability/SysTime.h +50 -0
- package/external/folly/folly/portability/SysTypes.h +44 -0
- package/external/folly/folly/portability/SysUio.cpp +179 -0
- package/external/folly/folly/portability/SysUio.h +51 -0
- package/external/folly/folly/portability/Syslog.h +39 -0
- package/external/folly/folly/portability/Time.cpp +357 -0
- package/external/folly/folly/portability/Time.h +74 -0
- package/external/folly/folly/portability/Unistd.h +111 -0
- package/external/folly/folly/portability/Windows.h +108 -0
- package/external/folly/folly/portability/openat2.c +30 -0
- package/external/folly/folly/portability/openat2.h +39 -0
- package/external/folly/folly/portability/test/BUCK +59 -0
- package/external/folly/folly/portability/test/ConstexprTest.cpp +102 -0
- package/external/folly/folly/portability/test/FilesystemTest.cpp +35 -0
- package/external/folly/folly/portability/test/LibgenTest.cpp +35 -0
- package/external/folly/folly/portability/test/OpenSSLPortabilityTest.cpp +108 -0
- package/external/folly/folly/portability/test/PThreadTest.cpp +80 -0
- package/external/folly/folly/portability/test/TimeTest.cpp +90 -0
- package/external/folly/folly/small_vector.h +17 -0
- package/external/folly/folly/somerge_defs.bzl +399 -0
- package/external/folly/folly/sorted_vector_types.h +17 -0
- package/external/folly/folly/stop_watch.h +317 -0
- package/external/folly/folly/synchronization/AsymmetricThreadFence.cpp +91 -0
- package/external/folly/folly/synchronization/AsymmetricThreadFence.h +60 -0
- package/external/folly/folly/synchronization/AtomicNotification-inl.h +146 -0
- package/external/folly/folly/synchronization/AtomicNotification.cpp +34 -0
- package/external/folly/folly/synchronization/AtomicNotification.h +117 -0
- package/external/folly/folly/synchronization/AtomicRef.h +181 -0
- package/external/folly/folly/synchronization/AtomicStruct.h +150 -0
- package/external/folly/folly/synchronization/AtomicUtil-inl.h +482 -0
- package/external/folly/folly/synchronization/AtomicUtil.h +179 -0
- package/external/folly/folly/synchronization/BUCK +418 -0
- package/external/folly/folly/synchronization/Baton.h +419 -0
- package/external/folly/folly/synchronization/CallOnce.h +263 -0
- package/external/folly/folly/synchronization/DelayedInit.h +179 -0
- package/external/folly/folly/synchronization/DistributedMutex-inl.h +1744 -0
- package/external/folly/folly/synchronization/DistributedMutex.cpp +27 -0
- package/external/folly/folly/synchronization/DistributedMutex.h +342 -0
- package/external/folly/folly/synchronization/EventCount.h +200 -0
- package/external/folly/folly/synchronization/FlatCombining.h +629 -0
- package/external/folly/folly/synchronization/Hazptr-fwd.h +217 -0
- package/external/folly/folly/synchronization/Hazptr.cpp +36 -0
- package/external/folly/folly/synchronization/Hazptr.h +209 -0
- package/external/folly/folly/synchronization/HazptrDomain.cpp +68 -0
- package/external/folly/folly/synchronization/HazptrDomain.h +832 -0
- package/external/folly/folly/synchronization/HazptrHolder.h +431 -0
- package/external/folly/folly/synchronization/HazptrObj.h +533 -0
- package/external/folly/folly/synchronization/HazptrObjLinked.h +315 -0
- package/external/folly/folly/synchronization/HazptrRec.h +68 -0
- package/external/folly/folly/synchronization/HazptrThrLocal.h +180 -0
- package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.cpp +46 -0
- package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.h +25 -0
- package/external/folly/folly/synchronization/Latch.h +160 -0
- package/external/folly/folly/synchronization/LifoSem.h +767 -0
- package/external/folly/folly/synchronization/Lock.h +887 -0
- package/external/folly/folly/synchronization/MicroSpinLock.h +154 -0
- package/external/folly/folly/synchronization/NativeSemaphore.h +187 -0
- package/external/folly/folly/synchronization/ParkingLot.cpp +37 -0
- package/external/folly/folly/synchronization/ParkingLot.h +330 -0
- package/external/folly/folly/synchronization/PicoSpinLock.h +167 -0
- package/external/folly/folly/synchronization/RWSpinLock.h +549 -0
- package/external/folly/folly/synchronization/Rcu.cpp +26 -0
- package/external/folly/folly/synchronization/Rcu.h +553 -0
- package/external/folly/folly/synchronization/RelaxedAtomic.h +336 -0
- package/external/folly/folly/synchronization/SanitizeThread.cpp +141 -0
- package/external/folly/folly/synchronization/SanitizeThread.h +166 -0
- package/external/folly/folly/synchronization/SaturatingSemaphore.h +324 -0
- package/external/folly/folly/synchronization/SmallLocks.h +36 -0
- package/external/folly/folly/synchronization/ThrottledLifoSem.h +362 -0
- package/external/folly/folly/synchronization/WaitOptions.cpp +25 -0
- package/external/folly/folly/synchronization/WaitOptions.h +75 -0
- package/external/folly/folly/synchronization/detail/AtomicUtils.h +59 -0
- package/external/folly/folly/synchronization/detail/BUCK +104 -0
- package/external/folly/folly/synchronization/detail/Hardware.cpp +192 -0
- package/external/folly/folly/synchronization/detail/Hardware.h +75 -0
- package/external/folly/folly/synchronization/detail/HazptrUtils.h +339 -0
- package/external/folly/folly/synchronization/detail/InlineFunctionRef.h +229 -0
- package/external/folly/folly/synchronization/detail/Sleeper.cpp +27 -0
- package/external/folly/folly/synchronization/detail/Sleeper.h +62 -0
- package/external/folly/folly/synchronization/detail/Spin.h +96 -0
- package/external/folly/folly/synchronization/detail/ThreadCachedLists.h +174 -0
- package/external/folly/folly/synchronization/detail/ThreadCachedReaders.h +189 -0
- package/external/folly/folly/synchronization/detail/ThreadCachedTag.h +26 -0
- package/external/folly/folly/synchronization/detail/test/BUCK +28 -0
- package/external/folly/folly/synchronization/detail/test/HardwareTest.cpp +74 -0
- package/external/folly/folly/synchronization/detail/test/InlineFunctionRefTest.cpp +286 -0
- package/external/folly/folly/synchronization/example/BUCK +27 -0
- package/external/folly/folly/synchronization/example/HazptrLockFreeLIFO.h +88 -0
- package/external/folly/folly/synchronization/example/HazptrSWMRSet.h +133 -0
- package/external/folly/folly/synchronization/example/HazptrWideCAS.h +62 -0
- package/external/folly/folly/synchronization/test/AtomicNotificationTest.cpp +236 -0
- package/external/folly/folly/synchronization/test/AtomicRefTest.cpp +170 -0
- package/external/folly/folly/synchronization/test/AtomicStructTest.cpp +65 -0
- package/external/folly/folly/synchronization/test/AtomicUtilBench.cpp +457 -0
- package/external/folly/folly/synchronization/test/AtomicUtilTest.cpp +650 -0
- package/external/folly/folly/synchronization/test/BUCK +495 -0
- package/external/folly/folly/synchronization/test/Barrier.h +52 -0
- package/external/folly/folly/synchronization/test/BarrierTest.cpp +56 -0
- package/external/folly/folly/synchronization/test/BatonBenchmark.cpp +77 -0
- package/external/folly/folly/synchronization/test/BatonTest.cpp +164 -0
- package/external/folly/folly/synchronization/test/BatonTestHelpers.h +118 -0
- package/external/folly/folly/synchronization/test/CallOnceBenchmark.cpp +72 -0
- package/external/folly/folly/synchronization/test/CallOnceTest.cpp +153 -0
- package/external/folly/folly/synchronization/test/DelayedInitTest.cpp +281 -0
- package/external/folly/folly/synchronization/test/DistributedMutexTest.cpp +2074 -0
- package/external/folly/folly/synchronization/test/EventCountTest.cpp +124 -0
- package/external/folly/folly/synchronization/test/FlatCombiningBenchmark.cpp +1789 -0
- package/external/folly/folly/synchronization/test/FlatCombiningExamples.h +222 -0
- package/external/folly/folly/synchronization/test/FlatCombiningTest.cpp +121 -0
- package/external/folly/folly/synchronization/test/FlatCombiningTestHelpers.h +227 -0
- package/external/folly/folly/synchronization/test/HazptrTest.cpp +1689 -0
- package/external/folly/folly/synchronization/test/LatchTest.cpp +224 -0
- package/external/folly/folly/synchronization/test/LifoSemBench.cpp +185 -0
- package/external/folly/folly/synchronization/test/LifoSemTests.cpp +353 -0
- package/external/folly/folly/synchronization/test/LockTest.cpp +1239 -0
- package/external/folly/folly/synchronization/test/NativeSemaphoreTest.cpp +37 -0
- package/external/folly/folly/synchronization/test/ParkingLotBenchmark.cpp +239 -0
- package/external/folly/folly/synchronization/test/ParkingLotTest.cpp +170 -0
- package/external/folly/folly/synchronization/test/RWSpinLockTest.cpp +235 -0
- package/external/folly/folly/synchronization/test/RcuBench.cpp +66 -0
- package/external/folly/folly/synchronization/test/RcuTest.cpp +330 -0
- package/external/folly/folly/synchronization/test/RelaxedAtomicTest.cpp +389 -0
- package/external/folly/folly/synchronization/test/SaturatingSemaphoreTest.cpp +166 -0
- package/external/folly/folly/synchronization/test/Semaphore.h +242 -0
- package/external/folly/folly/synchronization/test/SemaphoreTest.cpp +271 -0
- package/external/folly/folly/synchronization/test/SmallLocksBenchmark.cpp +1296 -0
- package/external/folly/folly/synchronization/test/SmallLocksTest.cpp +510 -0
- package/external/folly/folly/synchronization/test/ThreadCachedEpochBench.h +67 -0
- package/external/folly/folly/synchronization/test/ThreadCachedReadersBench.cpp +42 -0
- package/external/folly/folly/synchronization/test/ThreadCachedReadersTest.cpp +52 -0
- package/external/folly/folly/synchronization/test/ThrottledLifoSemTest.cpp +243 -0
- package/external/folly/folly/system/AtFork.cpp +205 -0
- package/external/folly/folly/system/AtFork.h +116 -0
- package/external/folly/folly/system/AuxVector.h +198 -0
- package/external/folly/folly/system/BUCK +144 -0
- package/external/folly/folly/system/EnvUtil.cpp +93 -0
- package/external/folly/folly/system/EnvUtil.h +113 -0
- package/external/folly/folly/system/HardwareConcurrency.cpp +39 -0
- package/external/folly/folly/system/HardwareConcurrency.h +23 -0
- package/external/folly/folly/system/MemoryMapping.cpp +477 -0
- package/external/folly/folly/system/MemoryMapping.h +287 -0
- package/external/folly/folly/system/Pid.cpp +87 -0
- package/external/folly/folly/system/Pid.h +34 -0
- package/external/folly/folly/system/Shell.cpp +33 -0
- package/external/folly/folly/system/Shell.h +93 -0
- package/external/folly/folly/system/ThreadId.cpp +89 -0
- package/external/folly/folly/system/ThreadId.h +62 -0
- package/external/folly/folly/system/ThreadName.cpp +330 -0
- package/external/folly/folly/system/ThreadName.h +72 -0
- package/external/folly/folly/system/test/AtForkTest.cpp +309 -0
- package/external/folly/folly/system/test/AuxVectorTest.cpp +55 -0
- package/external/folly/folly/system/test/BUCK +120 -0
- package/external/folly/folly/system/test/EnvUtilSubprocess.cpp +26 -0
- package/external/folly/folly/system/test/EnvUtilTest.cpp +197 -0
- package/external/folly/folly/system/test/MemoryMappingTest.cpp +179 -0
- package/external/folly/folly/system/test/PidTest.cpp +46 -0
- package/external/folly/folly/system/test/ShellTest.cpp +66 -0
- package/external/folly/folly/system/test/ThreadIdTest.cpp +114 -0
- package/external/folly/folly/system/test/ThreadNameTest.cpp +85 -0
- package/external/folly/folly.vcxitems +164 -0
- package/external/folly/static/logo.svg +1 -0
- package/external/folly/sync-config.json +8 -0
- package/just-task.js +13 -2
- package/package.json +7 -7
- package/template/cpp-lib/proj/MyLib.sln +0 -33
- package/template/cs-lib/proj/MyLib.sln +0 -33
- package/templates/cpp-app/windows/MyApp/MyApp.vcxproj +1 -1
- package/templates/cpp-app/windows/MyApp.sln +0 -33
- package/templates/cpp-lib/example/metro.config.js +30 -4
- package/templates/cpp-lib/windows/MyLib/MyLib.vcxproj +1 -1
- package/templates/cpp-lib/windows/MyLib.sln +0 -33
- package/Folly/Folly.vcxproj +0 -378
- package/Folly/Folly.vcxproj.filters +0 -558
- package/fmt/fmt.vcxproj +0 -153
- package/fmt/fmt.vcxproj.filters +0 -59
- package/fmt/pch.cpp +0 -4
- package/fmt/pch.h +0 -2
- /package/{fmt → external/fmt}/cgmanifest.json +0 -0
- /package/{Folly → external/folly}/Folly.natvis +0 -0
- /package/{Folly → external/folly}/cgmanifest.json +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/ConstexprMath.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/Conv.cpp +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/chrono/Hardware.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/concurrency/CacheLocality.cpp +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/json/dynamic-inl.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/json/json.cpp +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/SafeAssert.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/ToAscii.cpp +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/ToAscii.h +0 -0
- /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/portability/Unistd.cpp +0 -0
|
@@ -0,0 +1,2108 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#pragma once
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* F14NodeMap, F14ValueMap, and F14VectorMap
|
|
21
|
+
*
|
|
22
|
+
* F14FastMap conditionally works like F14ValueMap or F14VectorMap
|
|
23
|
+
*
|
|
24
|
+
* See F14.md
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
#include <cstddef>
|
|
28
|
+
#include <initializer_list>
|
|
29
|
+
#include <stdexcept>
|
|
30
|
+
#include <tuple>
|
|
31
|
+
|
|
32
|
+
#include <folly/Portability.h>
|
|
33
|
+
#include <folly/Range.h>
|
|
34
|
+
#include <folly/Traits.h>
|
|
35
|
+
#include <folly/container/View.h>
|
|
36
|
+
#include <folly/lang/Exception.h>
|
|
37
|
+
#include <folly/lang/SafeAssert.h>
|
|
38
|
+
|
|
39
|
+
#include <folly/container/F14Map-fwd.h>
|
|
40
|
+
#include <folly/container/Iterator.h>
|
|
41
|
+
#include <folly/container/detail/F14MapFallback.h>
|
|
42
|
+
#include <folly/container/detail/F14Policy.h>
|
|
43
|
+
#include <folly/container/detail/F14Table.h>
|
|
44
|
+
#include <folly/container/detail/Util.h>
|
|
45
|
+
|
|
46
|
+
namespace folly {
|
|
47
|
+
|
|
48
|
+
#if FOLLY_F14_VECTOR_INTRINSICS_AVAILABLE
|
|
49
|
+
|
|
50
|
+
//////// Common case for supported platforms
|
|
51
|
+
|
|
52
|
+
namespace f14 {
|
|
53
|
+
namespace detail {
|
|
54
|
+
|
|
55
|
+
template <typename Policy>
|
|
56
|
+
class F14BasicMap {
|
|
57
|
+
template <typename K, typename T>
|
|
58
|
+
using EnableHeterogeneousFind = std::enable_if_t<
|
|
59
|
+
::folly::detail::EligibleForHeterogeneousFind<
|
|
60
|
+
typename Policy::Key,
|
|
61
|
+
typename Policy::Hasher,
|
|
62
|
+
typename Policy::KeyEqual,
|
|
63
|
+
K>::value,
|
|
64
|
+
T>;
|
|
65
|
+
|
|
66
|
+
template <typename K, typename T>
|
|
67
|
+
using EnableHeterogeneousInsert = std::enable_if_t<
|
|
68
|
+
::folly::detail::EligibleForHeterogeneousInsert<
|
|
69
|
+
typename Policy::Key,
|
|
70
|
+
typename Policy::Hasher,
|
|
71
|
+
typename Policy::KeyEqual,
|
|
72
|
+
K>::value,
|
|
73
|
+
T>;
|
|
74
|
+
|
|
75
|
+
template <typename K>
|
|
76
|
+
using IsIter = Disjunction<
|
|
77
|
+
std::is_same<typename Policy::Iter, remove_cvref_t<K>>,
|
|
78
|
+
std::is_same<typename Policy::ConstIter, remove_cvref_t<K>>>;
|
|
79
|
+
|
|
80
|
+
template <typename K, typename T>
|
|
81
|
+
using EnableHeterogeneousErase = std::enable_if_t<
|
|
82
|
+
::folly::detail::EligibleForHeterogeneousFind<
|
|
83
|
+
typename Policy::Key,
|
|
84
|
+
typename Policy::Hasher,
|
|
85
|
+
typename Policy::KeyEqual,
|
|
86
|
+
std::conditional_t<IsIter<K>::value, typename Policy::Key, K>>::
|
|
87
|
+
value &&
|
|
88
|
+
!IsIter<K>::value,
|
|
89
|
+
T>;
|
|
90
|
+
|
|
91
|
+
public:
|
|
92
|
+
//// PUBLIC - Member types
|
|
93
|
+
|
|
94
|
+
using key_type = typename Policy::Key;
|
|
95
|
+
using mapped_type = typename Policy::Mapped;
|
|
96
|
+
using value_type = typename Policy::Value;
|
|
97
|
+
using size_type = std::size_t;
|
|
98
|
+
using difference_type = std::ptrdiff_t;
|
|
99
|
+
using hash_token_type = F14HashToken;
|
|
100
|
+
using hasher = typename Policy::Hasher;
|
|
101
|
+
using key_equal = typename Policy::KeyEqual;
|
|
102
|
+
using allocator_type = typename Policy::Alloc;
|
|
103
|
+
using reference = value_type&;
|
|
104
|
+
using const_reference = value_type const&;
|
|
105
|
+
using pointer = typename Policy::AllocTraits::pointer;
|
|
106
|
+
using const_pointer = typename Policy::AllocTraits::const_pointer;
|
|
107
|
+
using iterator = typename Policy::Iter;
|
|
108
|
+
using const_iterator = typename Policy::ConstIter;
|
|
109
|
+
|
|
110
|
+
private:
|
|
111
|
+
using ItemIter = typename Policy::ItemIter;
|
|
112
|
+
|
|
113
|
+
public:
|
|
114
|
+
//// PUBLIC - Member functions
|
|
115
|
+
|
|
116
|
+
F14BasicMap() noexcept(Policy::kDefaultConstructIsNoexcept) : table_{} {}
|
|
117
|
+
|
|
118
|
+
explicit F14BasicMap(
|
|
119
|
+
std::size_t initialCapacity,
|
|
120
|
+
hasher const& hash = hasher{},
|
|
121
|
+
key_equal const& eq = key_equal{},
|
|
122
|
+
allocator_type const& alloc = allocator_type{})
|
|
123
|
+
: table_{initialCapacity, hash, eq, alloc} {}
|
|
124
|
+
|
|
125
|
+
explicit F14BasicMap(std::size_t initialCapacity, allocator_type const& alloc)
|
|
126
|
+
: F14BasicMap(initialCapacity, hasher{}, key_equal{}, alloc) {}
|
|
127
|
+
|
|
128
|
+
explicit F14BasicMap(
|
|
129
|
+
std::size_t initialCapacity,
|
|
130
|
+
hasher const& hash,
|
|
131
|
+
allocator_type const& alloc)
|
|
132
|
+
: F14BasicMap(initialCapacity, hash, key_equal{}, alloc) {}
|
|
133
|
+
|
|
134
|
+
explicit F14BasicMap(allocator_type const& alloc)
|
|
135
|
+
: F14BasicMap(0, hasher{}, key_equal{}, alloc) {}
|
|
136
|
+
|
|
137
|
+
template <typename InputIt>
|
|
138
|
+
F14BasicMap(
|
|
139
|
+
InputIt first,
|
|
140
|
+
InputIt last,
|
|
141
|
+
std::size_t initialCapacity = 0,
|
|
142
|
+
hasher const& hash = hasher{},
|
|
143
|
+
key_equal const& eq = key_equal{},
|
|
144
|
+
allocator_type const& alloc = allocator_type{})
|
|
145
|
+
: table_{initialCapacity, hash, eq, alloc} {
|
|
146
|
+
initialInsert(std::move(first), std::move(last), initialCapacity);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
template <typename InputIt>
|
|
150
|
+
F14BasicMap(
|
|
151
|
+
InputIt first,
|
|
152
|
+
InputIt last,
|
|
153
|
+
std::size_t initialCapacity,
|
|
154
|
+
allocator_type const& alloc)
|
|
155
|
+
: table_{initialCapacity, hasher{}, key_equal{}, alloc} {
|
|
156
|
+
initialInsert(std::move(first), std::move(last), initialCapacity);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
template <typename InputIt>
|
|
160
|
+
F14BasicMap(
|
|
161
|
+
InputIt first,
|
|
162
|
+
InputIt last,
|
|
163
|
+
std::size_t initialCapacity,
|
|
164
|
+
hasher const& hash,
|
|
165
|
+
allocator_type const& alloc)
|
|
166
|
+
: table_{initialCapacity, hash, key_equal{}, alloc} {
|
|
167
|
+
initialInsert(std::move(first), std::move(last), initialCapacity);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
F14BasicMap(F14BasicMap const& rhs) = default;
|
|
171
|
+
|
|
172
|
+
F14BasicMap(F14BasicMap const& rhs, allocator_type const& alloc)
|
|
173
|
+
: table_{rhs.table_, alloc} {}
|
|
174
|
+
|
|
175
|
+
F14BasicMap(F14BasicMap&& rhs) = default;
|
|
176
|
+
|
|
177
|
+
F14BasicMap(F14BasicMap&& rhs, allocator_type const& alloc) noexcept(
|
|
178
|
+
Policy::kAllocIsAlwaysEqual)
|
|
179
|
+
: table_{std::move(rhs.table_), alloc} {}
|
|
180
|
+
|
|
181
|
+
/* implicit */ F14BasicMap(
|
|
182
|
+
std::initializer_list<value_type> init,
|
|
183
|
+
std::size_t initialCapacity = 0,
|
|
184
|
+
hasher const& hash = hasher{},
|
|
185
|
+
key_equal const& eq = key_equal{},
|
|
186
|
+
allocator_type const& alloc = allocator_type{})
|
|
187
|
+
: table_{initialCapacity, hash, eq, alloc} {
|
|
188
|
+
initialInsert(init.begin(), init.end(), initialCapacity);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
F14BasicMap(
|
|
192
|
+
std::initializer_list<value_type> init,
|
|
193
|
+
std::size_t initialCapacity,
|
|
194
|
+
allocator_type const& alloc)
|
|
195
|
+
: table_{initialCapacity, hasher{}, key_equal{}, alloc} {
|
|
196
|
+
initialInsert(init.begin(), init.end(), initialCapacity);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
F14BasicMap(
|
|
200
|
+
std::initializer_list<value_type> init,
|
|
201
|
+
std::size_t initialCapacity,
|
|
202
|
+
hasher const& hash,
|
|
203
|
+
allocator_type const& alloc)
|
|
204
|
+
: table_{initialCapacity, hash, key_equal{}, alloc} {
|
|
205
|
+
initialInsert(init.begin(), init.end(), initialCapacity);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
F14BasicMap& operator=(F14BasicMap const&) = default;
|
|
209
|
+
|
|
210
|
+
F14BasicMap& operator=(F14BasicMap&&) = default;
|
|
211
|
+
|
|
212
|
+
F14BasicMap& operator=(std::initializer_list<value_type> ilist) {
|
|
213
|
+
clear();
|
|
214
|
+
bulkInsert(ilist.begin(), ilist.end(), true);
|
|
215
|
+
return *this;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/// Get the allocator for this container.
|
|
219
|
+
/// @methodset Allocator
|
|
220
|
+
allocator_type get_allocator() const noexcept { return table_.alloc(); }
|
|
221
|
+
|
|
222
|
+
//// PUBLIC - Iterators
|
|
223
|
+
|
|
224
|
+
/// Get an iterator to the beginning
|
|
225
|
+
/// @methodset Iterators
|
|
226
|
+
iterator begin() noexcept { return table_.makeIter(table_.begin()); }
|
|
227
|
+
const_iterator begin() const noexcept { return cbegin(); }
|
|
228
|
+
/// Get an iterator to the beginning
|
|
229
|
+
/// @methodset Iterators
|
|
230
|
+
const_iterator cbegin() const noexcept {
|
|
231
|
+
return table_.makeConstIter(table_.begin());
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/// Get an iterator to the end
|
|
235
|
+
/// @methodset Iterators
|
|
236
|
+
iterator end() noexcept { return table_.makeIter(table_.end()); }
|
|
237
|
+
const_iterator end() const noexcept { return cend(); }
|
|
238
|
+
/// Get an iterator to the end
|
|
239
|
+
/// @methodset Iterators
|
|
240
|
+
const_iterator cend() const noexcept {
|
|
241
|
+
return table_.makeConstIter(table_.end());
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
//// PUBLIC - Capacity
|
|
245
|
+
|
|
246
|
+
/// Check if this container has any elements.
|
|
247
|
+
/// @methodset Capacity
|
|
248
|
+
bool empty() const noexcept { return table_.empty(); }
|
|
249
|
+
|
|
250
|
+
/// Number of elements in this container.
|
|
251
|
+
/// @methodset Capacity
|
|
252
|
+
std::size_t size() const noexcept { return table_.size(); }
|
|
253
|
+
|
|
254
|
+
/// The maximum size of this container.
|
|
255
|
+
/// @methodset Capacity
|
|
256
|
+
std::size_t max_size() const noexcept { return table_.max_size(); }
|
|
257
|
+
|
|
258
|
+
//// PUBLIC - Modifiers
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Remove all elements.
|
|
262
|
+
* @methodset Modifiers
|
|
263
|
+
*
|
|
264
|
+
* Frees heap-allocated memory; bucket_count is returned to 0.
|
|
265
|
+
*/
|
|
266
|
+
void clear() noexcept { table_.clear(); }
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Add a single element.
|
|
270
|
+
* @overloadbrief Add elements.
|
|
271
|
+
* @methodset Modifiers
|
|
272
|
+
*/
|
|
273
|
+
std::pair<iterator, bool> insert(value_type const& value) {
|
|
274
|
+
return emplace(value);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/// Add a single element, of a heterogeneous type.
|
|
278
|
+
template <typename P>
|
|
279
|
+
std::enable_if_t<
|
|
280
|
+
std::is_constructible<value_type, P&&>::value,
|
|
281
|
+
std::pair<iterator, bool>>
|
|
282
|
+
insert(P&& value) {
|
|
283
|
+
return emplace(std::forward<P>(value));
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Add a single element, of a heterogeneous type.
|
|
288
|
+
*
|
|
289
|
+
* TODO(T31574848): Work around libstdc++ versions (e.g., GCC < 6) with no
|
|
290
|
+
* implementation of N4387 ("perfect initialization" for pairs and tuples).
|
|
291
|
+
*/
|
|
292
|
+
template <typename U1, typename U2>
|
|
293
|
+
std::enable_if_t<
|
|
294
|
+
std::is_constructible<key_type, U1 const&>::value &&
|
|
295
|
+
std::is_constructible<mapped_type, U2 const&>::value,
|
|
296
|
+
std::pair<iterator, bool>>
|
|
297
|
+
insert(std::pair<U1, U2> const& value) {
|
|
298
|
+
return emplace(value);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Add a single element, of a heterogeneous type.
|
|
303
|
+
*
|
|
304
|
+
* TODO(T31574848): Work around libstdc++ versions (e.g., GCC < 6) with no
|
|
305
|
+
* implementation of N4387 ("perfect initialization" for pairs and tuples).
|
|
306
|
+
*/
|
|
307
|
+
template <typename U1, typename U2>
|
|
308
|
+
std::enable_if_t<
|
|
309
|
+
std::is_constructible<key_type, U1&&>::value &&
|
|
310
|
+
std::is_constructible<mapped_type, U2&&>::value,
|
|
311
|
+
std::pair<iterator, bool>>
|
|
312
|
+
insert(std::pair<U1, U2>&& value) {
|
|
313
|
+
return emplace(std::move(value));
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/// Add a single element.
|
|
317
|
+
std::pair<iterator, bool> insert(value_type&& value) {
|
|
318
|
+
return emplace(std::move(value));
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// std::unordered_map's hinted insertion API is misleading. No
|
|
322
|
+
// implementation I've seen actually uses the hint. Code restructuring
|
|
323
|
+
// by the caller to use the hinted API is at best unnecessary, and at
|
|
324
|
+
// worst a pessimization. It is used, however, so we provide it.
|
|
325
|
+
|
|
326
|
+
/// Add a single element, with a locational hint.
|
|
327
|
+
iterator insert(const_iterator /*hint*/, value_type const& value) {
|
|
328
|
+
return insert(value).first;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/// Add a single element, of heterogeneous type, with a locational hint.
|
|
332
|
+
template <typename P>
|
|
333
|
+
std::enable_if_t<std::is_constructible<value_type, P&&>::value, iterator>
|
|
334
|
+
insert(const_iterator /*hint*/, P&& value) {
|
|
335
|
+
return insert(std::forward<P>(value)).first;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/// Add a single element, with a locational hint.
|
|
339
|
+
iterator insert(const_iterator /*hint*/, value_type&& value) {
|
|
340
|
+
return insert(std::move(value)).first;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/// Emplace with hint.
|
|
344
|
+
/// @methodset Modifiers
|
|
345
|
+
template <class... Args>
|
|
346
|
+
iterator emplace_hint(const_iterator /*hint*/, Args&&... args) {
|
|
347
|
+
return emplace(std::forward<Args>(args)...).first;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
private:
|
|
351
|
+
template <class InputIt>
|
|
352
|
+
FOLLY_ALWAYS_INLINE void bulkInsert(
|
|
353
|
+
InputIt first, InputIt last, bool autoReserve) {
|
|
354
|
+
if (autoReserve) {
|
|
355
|
+
auto n = std::distance(first, last);
|
|
356
|
+
if (n == 0) {
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
table_.reserveForInsert(n);
|
|
360
|
+
}
|
|
361
|
+
while (first != last) {
|
|
362
|
+
insert(*first);
|
|
363
|
+
++first;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
template <class InputIt>
|
|
368
|
+
void initialInsert(InputIt first, InputIt last, std::size_t initialCapacity) {
|
|
369
|
+
FOLLY_SAFE_DCHECK(empty() && bucket_count() >= initialCapacity, "");
|
|
370
|
+
|
|
371
|
+
// It's possible that there are a lot of duplicates in first..last and
|
|
372
|
+
// so we will oversize ourself. The common case, however, is that
|
|
373
|
+
// we can avoid a lot of rehashing if we pre-expand. The behavior
|
|
374
|
+
// is easy to disable at a particular call site by asking for an
|
|
375
|
+
// initialCapacity of 1.
|
|
376
|
+
bool autoReserve =
|
|
377
|
+
std::is_base_of<
|
|
378
|
+
std::random_access_iterator_tag,
|
|
379
|
+
typename std::iterator_traits<InputIt>::iterator_category>::value &&
|
|
380
|
+
initialCapacity == 0;
|
|
381
|
+
bulkInsert(std::move(first), std::move(last), autoReserve);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
public:
|
|
385
|
+
/// Add elements
|
|
386
|
+
template <class InputIt>
|
|
387
|
+
void insert(InputIt first, InputIt last) {
|
|
388
|
+
// Bulk reserve is a heuristic choice, so it can backfire. We restrict
|
|
389
|
+
// ourself to situations that mimic bulk construction without an
|
|
390
|
+
// explicit initialCapacity.
|
|
391
|
+
bool autoReserve =
|
|
392
|
+
std::is_base_of<
|
|
393
|
+
std::random_access_iterator_tag,
|
|
394
|
+
typename std::iterator_traits<InputIt>::iterator_category>::value &&
|
|
395
|
+
bucket_count() == 0;
|
|
396
|
+
bulkInsert(std::move(first), std::move(last), autoReserve);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/// Add elements from an initializer list
|
|
400
|
+
void insert(std::initializer_list<value_type> ilist) {
|
|
401
|
+
insert(ilist.begin(), ilist.end());
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/// Insert if the key is missing, overwrite using operator= if present.
|
|
405
|
+
/// @methodset Modifiers
|
|
406
|
+
template <typename M>
|
|
407
|
+
std::pair<iterator, bool> insert_or_assign(key_type const& key, M&& obj) {
|
|
408
|
+
auto rv = try_emplace(key, std::forward<M>(obj));
|
|
409
|
+
if (!rv.second) {
|
|
410
|
+
rv.first->second = std::forward<M>(obj);
|
|
411
|
+
}
|
|
412
|
+
return rv;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
template <typename M>
|
|
416
|
+
std::pair<iterator, bool> insert_or_assign(key_type&& key, M&& obj) {
|
|
417
|
+
auto rv = try_emplace(std::move(key), std::forward<M>(obj));
|
|
418
|
+
if (!rv.second) {
|
|
419
|
+
rv.first->second = std::forward<M>(obj);
|
|
420
|
+
}
|
|
421
|
+
return rv;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
template <typename M>
|
|
425
|
+
std::pair<iterator, bool> insert_or_assign(
|
|
426
|
+
F14HashToken const& token, key_type const& key, M&& obj) {
|
|
427
|
+
auto rv = try_emplace_token(token, key, std::forward<M>(obj));
|
|
428
|
+
if (!rv.second) {
|
|
429
|
+
rv.first->second = std::forward<M>(obj);
|
|
430
|
+
}
|
|
431
|
+
return rv;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
template <typename M>
|
|
435
|
+
std::pair<iterator, bool> insert_or_assign(
|
|
436
|
+
const F14HashedKey<key_type, hasher>& hashedKey, M&& obj) {
|
|
437
|
+
return insert_or_assign(
|
|
438
|
+
hashedKey.getHashToken(), hashedKey.getKey(), std::forward<M>(obj));
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
template <typename M>
|
|
442
|
+
std::pair<iterator, bool> insert_or_assign(
|
|
443
|
+
F14HashToken const& token, key_type&& key, M&& obj) {
|
|
444
|
+
auto rv = try_emplace_token(token, std::move(key), std::forward<M>(obj));
|
|
445
|
+
if (!rv.second) {
|
|
446
|
+
rv.first->second = std::forward<M>(obj);
|
|
447
|
+
}
|
|
448
|
+
return rv;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
template <typename M>
|
|
452
|
+
std::pair<iterator, bool> insert_or_assign(
|
|
453
|
+
F14HashedKey<key_type, hasher>&& hashedKey, M&& obj) {
|
|
454
|
+
return insert_or_assign(
|
|
455
|
+
hashedKey.getHashToken(),
|
|
456
|
+
std::move(hashedKey.getKey()),
|
|
457
|
+
std::forward<M>(obj));
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
template <typename M>
|
|
461
|
+
iterator insert_or_assign(
|
|
462
|
+
const_iterator /*hint*/, key_type const& key, M&& obj) {
|
|
463
|
+
return insert_or_assign(key, std::forward<M>(obj)).first;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
template <typename M>
|
|
467
|
+
iterator insert_or_assign(const_iterator /*hint*/, key_type&& key, M&& obj) {
|
|
468
|
+
return insert_or_assign(std::move(key), std::forward<M>(obj)).first;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
template <typename K, typename M>
|
|
472
|
+
EnableHeterogeneousInsert<K, std::pair<iterator, bool>> insert_or_assign(
|
|
473
|
+
K&& key, M&& obj) {
|
|
474
|
+
auto rv = try_emplace(std::forward<K>(key), std::forward<M>(obj));
|
|
475
|
+
if (!rv.second) {
|
|
476
|
+
rv.first->second = std::forward<M>(obj);
|
|
477
|
+
}
|
|
478
|
+
return rv;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
template <typename K, typename M>
|
|
482
|
+
EnableHeterogeneousInsert<K, std::pair<iterator, bool>> insert_or_assign(
|
|
483
|
+
F14HashToken const& token, K&& key, M&& obj) {
|
|
484
|
+
auto rv = try_emplace(token, std::forward<K>(key), std::forward<M>(obj));
|
|
485
|
+
if (!rv.second) {
|
|
486
|
+
rv.first->second = std::forward<M>(obj);
|
|
487
|
+
}
|
|
488
|
+
return rv;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
private:
|
|
492
|
+
template <typename Arg>
|
|
493
|
+
using UsableAsKey = ::folly::detail::
|
|
494
|
+
EligibleForHeterogeneousFind<key_type, hasher, key_equal, Arg>;
|
|
495
|
+
|
|
496
|
+
public:
|
|
497
|
+
/**
|
|
498
|
+
* Add an element by constructing it in-place.
|
|
499
|
+
* @overloadbrief Add elements in-place.
|
|
500
|
+
* @methodset Modifiers
|
|
501
|
+
*/
|
|
502
|
+
template <typename... Args>
|
|
503
|
+
std::pair<iterator, bool> emplace(Args&&... args) {
|
|
504
|
+
auto rv =
|
|
505
|
+
folly::detail::callWithExtractedKey<key_type, mapped_type, UsableAsKey>(
|
|
506
|
+
table_.alloc(),
|
|
507
|
+
[&](auto&&... inner) {
|
|
508
|
+
return table_.tryEmplaceValue(
|
|
509
|
+
std::forward<decltype(inner)>(inner)...);
|
|
510
|
+
},
|
|
511
|
+
std::forward<Args>(args)...);
|
|
512
|
+
return std::make_pair(table_.makeIter(rv.first), rv.second);
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* Add an element by constructing it in-place.
|
|
517
|
+
* @methodset Modifiers
|
|
518
|
+
*
|
|
519
|
+
* Does nothing if the key already exists.
|
|
520
|
+
*/
|
|
521
|
+
template <typename... Args>
|
|
522
|
+
std::pair<iterator, bool> try_emplace(key_type const& key, Args&&... args) {
|
|
523
|
+
auto rv = table_.tryEmplaceValue(
|
|
524
|
+
key,
|
|
525
|
+
std::piecewise_construct,
|
|
526
|
+
std::forward_as_tuple(key),
|
|
527
|
+
std::forward_as_tuple(std::forward<Args>(args)...));
|
|
528
|
+
return std::make_pair(table_.makeIter(rv.first), rv.second);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
template <typename... Args>
|
|
532
|
+
std::pair<iterator, bool> try_emplace(key_type&& key, Args&&... args) {
|
|
533
|
+
auto rv = table_.tryEmplaceValue(
|
|
534
|
+
key,
|
|
535
|
+
std::piecewise_construct,
|
|
536
|
+
std::forward_as_tuple(std::move(key)),
|
|
537
|
+
std::forward_as_tuple(std::forward<Args>(args)...));
|
|
538
|
+
return std::make_pair(table_.makeIter(rv.first), rv.second);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
/// @copydoc try_emplace
|
|
542
|
+
template <typename... Args>
|
|
543
|
+
std::pair<iterator, bool> try_emplace_token(
|
|
544
|
+
F14HashToken const& token, key_type const& key, Args&&... args) {
|
|
545
|
+
auto rv = table_.tryEmplaceValueWithToken(
|
|
546
|
+
token,
|
|
547
|
+
key,
|
|
548
|
+
std::piecewise_construct,
|
|
549
|
+
std::forward_as_tuple(key),
|
|
550
|
+
std::forward_as_tuple(std::forward<Args>(args)...));
|
|
551
|
+
return std::make_pair(table_.makeIter(rv.first), rv.second);
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
template <typename... Args>
|
|
555
|
+
std::pair<iterator, bool> try_emplace_token(
|
|
556
|
+
const F14HashedKey<key_type, hasher>& hashedKey, Args&&... args) {
|
|
557
|
+
return try_emplace_token(
|
|
558
|
+
hashedKey.getHashToken(),
|
|
559
|
+
hashedKey.getKey(),
|
|
560
|
+
std::forward<Args>(args)...);
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
template <typename... Args>
|
|
564
|
+
std::pair<iterator, bool> try_emplace_token(
|
|
565
|
+
F14HashToken const& token, key_type&& key, Args&&... args) {
|
|
566
|
+
auto rv = table_.tryEmplaceValueWithToken(
|
|
567
|
+
token,
|
|
568
|
+
key,
|
|
569
|
+
std::piecewise_construct,
|
|
570
|
+
std::forward_as_tuple(std::move(key)),
|
|
571
|
+
std::forward_as_tuple(std::forward<Args>(args)...));
|
|
572
|
+
return std::make_pair(table_.makeIter(rv.first), rv.second);
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
template <typename... Args>
|
|
576
|
+
std::pair<iterator, bool> try_emplace_token(
|
|
577
|
+
F14HashedKey<key_type, hasher>&& hashedKey, Args&&... args) {
|
|
578
|
+
return try_emplace_token(
|
|
579
|
+
hashedKey.getHashToken(),
|
|
580
|
+
std::move(hashedKey.getKey()),
|
|
581
|
+
std::forward<Args>(args)...);
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
template <typename... Args>
|
|
585
|
+
iterator try_emplace(
|
|
586
|
+
const_iterator /*hint*/, key_type const& key, Args&&... args) {
|
|
587
|
+
auto rv = table_.tryEmplaceValue(
|
|
588
|
+
key,
|
|
589
|
+
std::piecewise_construct,
|
|
590
|
+
std::forward_as_tuple(key),
|
|
591
|
+
std::forward_as_tuple(std::forward<Args>(args)...));
|
|
592
|
+
return table_.makeIter(rv.first);
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
template <typename... Args>
|
|
596
|
+
iterator try_emplace(
|
|
597
|
+
const_iterator /*hint*/, key_type&& key, Args&&... args) {
|
|
598
|
+
auto rv = table_.tryEmplaceValue(
|
|
599
|
+
key,
|
|
600
|
+
std::piecewise_construct,
|
|
601
|
+
std::forward_as_tuple(std::move(key)),
|
|
602
|
+
std::forward_as_tuple(std::forward<Args>(args)...));
|
|
603
|
+
return table_.makeIter(rv.first);
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
template <typename K, typename... Args>
|
|
607
|
+
EnableHeterogeneousInsert<K, std::pair<iterator, bool>> try_emplace(
|
|
608
|
+
K&& key, Args&&... args) {
|
|
609
|
+
auto rv = table_.tryEmplaceValue(
|
|
610
|
+
key,
|
|
611
|
+
std::piecewise_construct,
|
|
612
|
+
std::forward_as_tuple(std::forward<K>(key)),
|
|
613
|
+
std::forward_as_tuple(std::forward<Args>(args)...));
|
|
614
|
+
return std::make_pair(table_.makeIter(rv.first), rv.second);
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
template <typename K, typename... Args>
|
|
618
|
+
EnableHeterogeneousInsert<K, std::pair<iterator, bool>> try_emplace_token(
|
|
619
|
+
F14HashToken const& token, K&& key, Args&&... args) {
|
|
620
|
+
auto rv = table_.tryEmplaceValueWithToken(
|
|
621
|
+
token,
|
|
622
|
+
key,
|
|
623
|
+
std::piecewise_construct,
|
|
624
|
+
std::forward_as_tuple(std::forward<K>(key)),
|
|
625
|
+
std::forward_as_tuple(std::forward<Args>(args)...));
|
|
626
|
+
return std::make_pair(table_.makeIter(rv.first), rv.second);
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
/**
|
|
630
|
+
* Remove element at a specific position (iterator).
|
|
631
|
+
* @overloadbrief Remove elements.
|
|
632
|
+
* @methodset Modifiers
|
|
633
|
+
*/
|
|
634
|
+
FOLLY_ALWAYS_INLINE iterator erase(const_iterator pos) {
|
|
635
|
+
return eraseInto(pos, variadic_noop);
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
/**
|
|
639
|
+
* Remove element at a specific position (iterator).
|
|
640
|
+
*
|
|
641
|
+
* This form avoids ambiguity when key_type has a templated constructor
|
|
642
|
+
* that accepts const_iterator
|
|
643
|
+
*/
|
|
644
|
+
FOLLY_ALWAYS_INLINE iterator erase(iterator pos) {
|
|
645
|
+
return eraseInto(pos, variadic_noop);
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
/// Remove a range of elements.
|
|
649
|
+
iterator erase(const_iterator first, const_iterator last) {
|
|
650
|
+
return eraseInto(first, last, variadic_noop);
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
/// Remove a specific key.
|
|
654
|
+
size_type erase(key_type const& key) { return eraseInto(key, variadic_noop); }
|
|
655
|
+
|
|
656
|
+
/// Remove a key, using a heterogeneous representation.
|
|
657
|
+
template <typename K>
|
|
658
|
+
EnableHeterogeneousErase<K, size_type> erase(K const& key) {
|
|
659
|
+
return eraseInto(key, variadic_noop);
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
protected:
|
|
663
|
+
template <typename BeforeDestroy>
|
|
664
|
+
FOLLY_ALWAYS_INLINE void tableEraseIterInto(
|
|
665
|
+
ItemIter pos, BeforeDestroy&& beforeDestroy) {
|
|
666
|
+
table_.eraseIterInto(pos, [&](value_type&& v) {
|
|
667
|
+
auto p = Policy::moveValue(v);
|
|
668
|
+
beforeDestroy(std::move(p.first), std::move(p.second));
|
|
669
|
+
});
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
template <typename K, typename BeforeDestroy>
|
|
673
|
+
FOLLY_ALWAYS_INLINE std::size_t tableEraseKeyInto(
|
|
674
|
+
K const& key, BeforeDestroy&& beforeDestroy) {
|
|
675
|
+
return table_.eraseKeyInto(key, [&](value_type&& v) {
|
|
676
|
+
auto p = Policy::moveValue(v);
|
|
677
|
+
beforeDestroy(std::move(p.first), std::move(p.second));
|
|
678
|
+
});
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
public:
|
|
682
|
+
/**
|
|
683
|
+
* Callback-erase a single iterator.
|
|
684
|
+
* @overloadbrief Erase with pre-destruction callback.
|
|
685
|
+
* @methodset Modifiers
|
|
686
|
+
*
|
|
687
|
+
* eraseInto contains the same overloads as erase but provides
|
|
688
|
+
* an additional callback argument which is called with an rvalue
|
|
689
|
+
* reference (not const) to the key and an rvalue reference to the
|
|
690
|
+
* mapped value directly before it is destroyed. This can be used
|
|
691
|
+
* to extract an entry out of a F14Map while avoiding a copy.
|
|
692
|
+
*/
|
|
693
|
+
template <typename BeforeDestroy>
|
|
694
|
+
FOLLY_ALWAYS_INLINE iterator
|
|
695
|
+
eraseInto(const_iterator pos, BeforeDestroy&& beforeDestroy) {
|
|
696
|
+
// If we are inlined then gcc and clang can optimize away all of the
|
|
697
|
+
// work of itemPos.advance() if our return value is discarded.
|
|
698
|
+
auto itemPos = table_.unwrapIter(pos);
|
|
699
|
+
tableEraseIterInto(itemPos, beforeDestroy);
|
|
700
|
+
itemPos.advanceLikelyDead();
|
|
701
|
+
return table_.makeIter(itemPos);
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
/// This form avoids ambiguity when key_type has a templated constructor
|
|
705
|
+
/// that accepts const_iterator
|
|
706
|
+
template <typename BeforeDestroy>
|
|
707
|
+
FOLLY_ALWAYS_INLINE iterator
|
|
708
|
+
eraseInto(iterator pos, BeforeDestroy&& beforeDestroy) {
|
|
709
|
+
const_iterator cpos{pos};
|
|
710
|
+
return eraseInto(cpos, beforeDestroy);
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
/// Callback-erase a range of values.
|
|
714
|
+
template <typename BeforeDestroy>
|
|
715
|
+
iterator eraseInto(
|
|
716
|
+
const_iterator first,
|
|
717
|
+
const_iterator last,
|
|
718
|
+
BeforeDestroy&& beforeDestroy) {
|
|
719
|
+
auto itemFirst = table_.unwrapIter(first);
|
|
720
|
+
auto itemLast = table_.unwrapIter(last);
|
|
721
|
+
while (itemFirst != itemLast) {
|
|
722
|
+
tableEraseIterInto(itemFirst, beforeDestroy);
|
|
723
|
+
itemFirst.advance();
|
|
724
|
+
}
|
|
725
|
+
return table_.makeIter(itemFirst);
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
template <typename BeforeDestroy>
|
|
729
|
+
size_type eraseInto(key_type const& key, BeforeDestroy&& beforeDestroy) {
|
|
730
|
+
return tableEraseKeyInto(key, beforeDestroy);
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
/// Callback-erase a specific key, using a heterogeneous representation.
|
|
734
|
+
template <typename K, typename BeforeDestroy>
|
|
735
|
+
EnableHeterogeneousErase<K, size_type> eraseInto(
|
|
736
|
+
K const& key, BeforeDestroy&& beforeDestroy) {
|
|
737
|
+
return tableEraseKeyInto(key, beforeDestroy);
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
//// PUBLIC - Lookup
|
|
741
|
+
|
|
742
|
+
/// Get a value for a key
|
|
743
|
+
/// @methodset Element Access
|
|
744
|
+
FOLLY_ALWAYS_INLINE mapped_type& at(key_type const& key) {
|
|
745
|
+
return at(*this, key);
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
FOLLY_ALWAYS_INLINE mapped_type const& at(key_type const& key) const {
|
|
749
|
+
return at(*this, key);
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
template <typename K>
|
|
753
|
+
EnableHeterogeneousFind<K, mapped_type&> at(K const& key) {
|
|
754
|
+
return at(*this, key);
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
template <typename K>
|
|
758
|
+
EnableHeterogeneousFind<K, mapped_type const&> at(K const& key) const {
|
|
759
|
+
return at(*this, key);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
/// Get a value for a key; create the value if it doesn't already exist
|
|
763
|
+
/// @methodset Element Access
|
|
764
|
+
mapped_type& operator[](key_type const& key) {
|
|
765
|
+
return try_emplace(key).first->second;
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
mapped_type& operator[](key_type&& key) {
|
|
769
|
+
return try_emplace(std::move(key)).first->second;
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
template <typename K>
|
|
773
|
+
EnableHeterogeneousInsert<K, mapped_type&> operator[](K&& key) {
|
|
774
|
+
return try_emplace(std::forward<K>(key)).first->second;
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
/// @overloadbrief Number of elements matching the given key.
|
|
778
|
+
/// @methodset Lookup
|
|
779
|
+
FOLLY_ALWAYS_INLINE size_type count(key_type const& key) const {
|
|
780
|
+
return contains(key) ? 1 : 0;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
template <typename K>
|
|
784
|
+
FOLLY_ALWAYS_INLINE EnableHeterogeneousFind<K, size_type> count(
|
|
785
|
+
K const& key) const {
|
|
786
|
+
return contains(key) ? 1 : 0;
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
/**
|
|
790
|
+
* @overloadbrief Prehash a key.
|
|
791
|
+
* @methodset Lookup
|
|
792
|
+
*
|
|
793
|
+
* prehash(key) does the work of evaluating hash_function()(key)
|
|
794
|
+
* (including additional bit-mixing for non-avalanching hash functions),
|
|
795
|
+
* and wraps the result of that work in a token for later reuse.
|
|
796
|
+
*
|
|
797
|
+
* The returned token may be used at any time, may be used more than
|
|
798
|
+
* once, and may be used in other F14 sets and maps. Tokens are
|
|
799
|
+
* transferrable between any F14 containers (maps and sets) with the
|
|
800
|
+
* same key_type and equal hash_function()s.
|
|
801
|
+
*
|
|
802
|
+
* Hash tokens are not hints -- it is a bug to call any method on this
|
|
803
|
+
* class with a token t and key k where t isn't the result of a call
|
|
804
|
+
* to prehash(k2) with k2 == k.
|
|
805
|
+
*/
|
|
806
|
+
F14HashToken prehash(key_type const& key) const {
|
|
807
|
+
return table_.prehash(key);
|
|
808
|
+
}
|
|
809
|
+
/// @copydoc prehash
|
|
810
|
+
F14HashToken prehash(key_type const& key, std::size_t hash) const {
|
|
811
|
+
return table_.prehash(key, hash);
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
/// @copydoc prehash
|
|
815
|
+
template <typename K>
|
|
816
|
+
EnableHeterogeneousFind<K, F14HashToken> prehash(K const& key) const {
|
|
817
|
+
return table_.prehash(key);
|
|
818
|
+
}
|
|
819
|
+
/// @copydoc prehash
|
|
820
|
+
template <typename K>
|
|
821
|
+
EnableHeterogeneousFind<K, F14HashToken> prehash(
|
|
822
|
+
K const& key, std::size_t hash) const {
|
|
823
|
+
return table_.prehash(key, hash);
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
/**
|
|
827
|
+
* @overloadbrief Prefetch cachelines associated with a key.
|
|
828
|
+
* @methodset Lookup
|
|
829
|
+
*
|
|
830
|
+
* prefetch(token) begins prefetching the first steps of looking for key into
|
|
831
|
+
* the local CPU cache.
|
|
832
|
+
*
|
|
833
|
+
* Example Scenario: Loading 2 values from a cold map.
|
|
834
|
+
* You have a map that is cold, meaning it is out of the local CPU cache,
|
|
835
|
+
* and you want to load two values from the map. This can be extended to
|
|
836
|
+
* load N values, but we're loading 2 for simplicity.
|
|
837
|
+
*
|
|
838
|
+
* When the map is cold the dominating factor in the latency is loading the
|
|
839
|
+
* cache line of the entry into the local CPU cache. Using prehash() will
|
|
840
|
+
* issue these cache line fetches in parallel. That means that by the time we
|
|
841
|
+
* finish map.find(token1, key1) the cache lines needed by map.find(token2,
|
|
842
|
+
* key2) may already be in the local CPU cache. In the best case this will
|
|
843
|
+
* half the latency.
|
|
844
|
+
*
|
|
845
|
+
* It is always okay to call prefetch() before a find() or other lookup
|
|
846
|
+
* operation, as it only prefetches cache lines that are guaranteed to be
|
|
847
|
+
* needed by the lookup.
|
|
848
|
+
*
|
|
849
|
+
* std::pair<iterator, iterator> find2(
|
|
850
|
+
* auto& map, key_type const& key1, key_type const& key2) {
|
|
851
|
+
* auto const token1 = map.prehash(key1);
|
|
852
|
+
* map.prefetch(token1);
|
|
853
|
+
* auto const token2 = map.prehash(key2);
|
|
854
|
+
* map.prefetch(token2);
|
|
855
|
+
* return std::make_pair(map.find(token1, key1), map.find(token2, key2));
|
|
856
|
+
* }
|
|
857
|
+
*/
|
|
858
|
+
void prefetch(F14HashToken const& token) const { table_.prefetch(token); }
|
|
859
|
+
|
|
860
|
+
/// @overloadbrief Get the iterator for a key.
|
|
861
|
+
/// @methodset Lookup
|
|
862
|
+
FOLLY_ALWAYS_INLINE iterator find(key_type const& key) {
|
|
863
|
+
return table_.makeIter(table_.find(key));
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
/// Get the iterator for a key.
|
|
867
|
+
FOLLY_ALWAYS_INLINE const_iterator find(key_type const& key) const {
|
|
868
|
+
return table_.makeConstIter(table_.find(key));
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
FOLLY_ALWAYS_INLINE iterator
|
|
872
|
+
find(F14HashToken const& token, key_type const& key) {
|
|
873
|
+
return table_.makeIter(table_.find(token, key));
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
FOLLY_ALWAYS_INLINE iterator
|
|
877
|
+
find(const F14HashedKey<key_type, hasher>& hashedKey) {
|
|
878
|
+
return table_.makeIter(
|
|
879
|
+
table_.find(hashedKey.getHashToken(), hashedKey.getKey()));
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
FOLLY_ALWAYS_INLINE const_iterator
|
|
883
|
+
find(F14HashToken const& token, key_type const& key) const {
|
|
884
|
+
return table_.makeConstIter(table_.find(token, key));
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
FOLLY_ALWAYS_INLINE const_iterator
|
|
888
|
+
find(F14HashedKey<key_type, hasher> const& hashedKey) const {
|
|
889
|
+
return table_.makeIter(
|
|
890
|
+
table_.find(hashedKey.getHashToken(), hashedKey.getKey()));
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
template <typename K>
|
|
894
|
+
FOLLY_ALWAYS_INLINE EnableHeterogeneousFind<K, iterator> find(K const& key) {
|
|
895
|
+
return table_.makeIter(table_.find(key));
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
template <typename K>
|
|
899
|
+
FOLLY_ALWAYS_INLINE EnableHeterogeneousFind<K, const_iterator> find(
|
|
900
|
+
K const& key) const {
|
|
901
|
+
return table_.makeConstIter(table_.find(key));
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
template <typename K>
|
|
905
|
+
FOLLY_ALWAYS_INLINE EnableHeterogeneousFind<K, iterator> find(
|
|
906
|
+
F14HashToken const& token, K const& key) {
|
|
907
|
+
return table_.makeIter(table_.find(token, key));
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
template <typename K>
|
|
911
|
+
FOLLY_ALWAYS_INLINE EnableHeterogeneousFind<K, const_iterator> find(
|
|
912
|
+
F14HashToken const& token, K const& key) const {
|
|
913
|
+
return table_.makeConstIter(table_.find(token, key));
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
/**
|
|
917
|
+
* @overloadbrief Checks if the container contains an element with the
|
|
918
|
+
* specific key.
|
|
919
|
+
* @methodset Lookup
|
|
920
|
+
*/
|
|
921
|
+
FOLLY_ALWAYS_INLINE bool contains(key_type const& key) const {
|
|
922
|
+
return !table_.find(key).atEnd();
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
template <typename K>
|
|
926
|
+
FOLLY_ALWAYS_INLINE EnableHeterogeneousFind<K, bool> contains(
|
|
927
|
+
K const& key) const {
|
|
928
|
+
return !table_.find(key).atEnd();
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
FOLLY_ALWAYS_INLINE bool contains(
|
|
932
|
+
F14HashToken const& token, key_type const& key) const {
|
|
933
|
+
return !table_.find(token, key).atEnd();
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
FOLLY_ALWAYS_INLINE bool contains(
|
|
937
|
+
const F14HashedKey<key_type, hasher>& hashedKey) const {
|
|
938
|
+
return !table_.find(hashedKey.getHashToken(), hashedKey.getKey()).atEnd();
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
template <typename K>
|
|
942
|
+
FOLLY_ALWAYS_INLINE EnableHeterogeneousFind<K, bool> contains(
|
|
943
|
+
F14HashToken const& token, K const& key) const {
|
|
944
|
+
return !table_.find(token, key).atEnd();
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
/// @overloadbrief Returns the range of elements matching a specific key.
|
|
948
|
+
/// @methodset Lookup
|
|
949
|
+
std::pair<iterator, iterator> equal_range(key_type const& key) {
|
|
950
|
+
return equal_range(*this, key);
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
std::pair<const_iterator, const_iterator> equal_range(
|
|
954
|
+
key_type const& key) const {
|
|
955
|
+
return equal_range(*this, key);
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
template <typename K>
|
|
959
|
+
EnableHeterogeneousFind<K, std::pair<iterator, iterator>> equal_range(
|
|
960
|
+
K const& key) {
|
|
961
|
+
return equal_range(*this, key);
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
template <typename K>
|
|
965
|
+
EnableHeterogeneousFind<K, std::pair<const_iterator, const_iterator>>
|
|
966
|
+
equal_range(K const& key) const {
|
|
967
|
+
return equal_range(*this, key);
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
//// PUBLIC - Bucket interface
|
|
971
|
+
|
|
972
|
+
/// The number of buckets in this container.
|
|
973
|
+
/// @methodset Bucket interface
|
|
974
|
+
std::size_t bucket_count() const noexcept { return table_.bucket_count(); }
|
|
975
|
+
|
|
976
|
+
/// The maximum number of buckets for this container.
|
|
977
|
+
/// @methodset Bucket interface
|
|
978
|
+
std::size_t max_bucket_count() const noexcept {
|
|
979
|
+
return table_.max_bucket_count();
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
//// PUBLIC - Hash policy
|
|
983
|
+
|
|
984
|
+
/// Load factor of the underlying hashtable.
|
|
985
|
+
/// @methodset Hash policy
|
|
986
|
+
float load_factor() const noexcept { return table_.load_factor(); }
|
|
987
|
+
|
|
988
|
+
/**
|
|
989
|
+
* @overloadbrief Load factor control.
|
|
990
|
+
* Get the maximum load factor for this container.
|
|
991
|
+
* @methodset Hash policy
|
|
992
|
+
*/
|
|
993
|
+
float max_load_factor() const noexcept { return table_.max_load_factor(); }
|
|
994
|
+
|
|
995
|
+
/// Set the maximum load factor for this container.
|
|
996
|
+
/// @methodset Hash policy
|
|
997
|
+
void max_load_factor(float v) { table_.max_load_factor(v); }
|
|
998
|
+
|
|
999
|
+
/**
|
|
1000
|
+
* Rehash this container.
|
|
1001
|
+
* @methodset Hash policy
|
|
1002
|
+
*
|
|
1003
|
+
* This function is provided for compliance with C++'s requirements for
|
|
1004
|
+
* hashtables, but is no better than a simple `reserve` call for F14.
|
|
1005
|
+
*
|
|
1006
|
+
* @param bucketCapcity The desired capacity across all buckets.
|
|
1007
|
+
*/
|
|
1008
|
+
void rehash(std::size_t bucketCapacity) {
|
|
1009
|
+
// The standard's rehash() requires understanding the max load factor,
|
|
1010
|
+
// which is easy to get wrong. Since we don't actually allow adjustment
|
|
1011
|
+
// of max_load_factor there is no difference.
|
|
1012
|
+
reserve(bucketCapacity);
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
/**
|
|
1016
|
+
* Pre-allocate space for at least this many elements.
|
|
1017
|
+
* @methodset Capacity
|
|
1018
|
+
*
|
|
1019
|
+
* @param capacity The number of elements to pre-allocate space for.
|
|
1020
|
+
*/
|
|
1021
|
+
void reserve(std::size_t capacity) { table_.reserve(capacity); }
|
|
1022
|
+
|
|
1023
|
+
//// PUBLIC - Observers
|
|
1024
|
+
|
|
1025
|
+
/// Get the hasher.
|
|
1026
|
+
/// @methodset Observers
|
|
1027
|
+
hasher hash_function() const { return table_.hasher(); }
|
|
1028
|
+
|
|
1029
|
+
/// Get the key_equal.
|
|
1030
|
+
/// @methodset Observers
|
|
1031
|
+
key_equal key_eq() const { return table_.keyEqual(); }
|
|
1032
|
+
|
|
1033
|
+
//// PUBLIC - F14 Extensions
|
|
1034
|
+
|
|
1035
|
+
/**
|
|
1036
|
+
* Checks for a value using operator==
|
|
1037
|
+
* @methodset Lookup
|
|
1038
|
+
*
|
|
1039
|
+
* containsEqualValue returns true iff there is an element in the map
|
|
1040
|
+
* that compares equal to value using operator==. It is undefined
|
|
1041
|
+
* behavior to call this function if operator== on key_type can ever
|
|
1042
|
+
* return true when the same keys passed to key_eq() would return false
|
|
1043
|
+
* (the opposite is allowed).
|
|
1044
|
+
*/
|
|
1045
|
+
bool containsEqualValue(value_type const& value) const {
|
|
1046
|
+
auto it = table_.findMatching(
|
|
1047
|
+
value.first, [&](auto& key) { return value.first == key; });
|
|
1048
|
+
return !it.atEnd() && value.second == table_.valueAtItem(it.citem()).second;
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
/// Get memory footprint, not including sizeof(*this).
|
|
1052
|
+
/// @methodset Capacity
|
|
1053
|
+
std::size_t getAllocatedMemorySize() const {
|
|
1054
|
+
return table_.getAllocatedMemorySize();
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
/**
|
|
1058
|
+
* In-depth memory analysis.
|
|
1059
|
+
* @methodset Capacity
|
|
1060
|
+
*
|
|
1061
|
+
* Enumerates classes of allocated memory blocks currently owned
|
|
1062
|
+
* by this table, calling visitor(allocationSize, allocationCount).
|
|
1063
|
+
* This can be used to get a more accurate indication of memory footprint
|
|
1064
|
+
* than getAllocatedMemorySize() if you have some way of computing the
|
|
1065
|
+
* internal fragmentation of the allocator, such as JEMalloc's nallocx.
|
|
1066
|
+
* The visitor might be called twice with the same allocationSize. The
|
|
1067
|
+
* visitor's computation should produce the same result for visitor(8,
|
|
1068
|
+
* 2) as for two calls to visitor(8, 1), for example. The visitor may
|
|
1069
|
+
* be called with a zero allocationCount.
|
|
1070
|
+
*/
|
|
1071
|
+
template <typename V>
|
|
1072
|
+
void visitAllocationClasses(V&& visitor) const {
|
|
1073
|
+
return table_.visitAllocationClasses(visitor);
|
|
1074
|
+
}
|
|
1075
|
+
|
|
1076
|
+
/**
|
|
1077
|
+
* Visit contiguous ranges of elements.
|
|
1078
|
+
* @methodset Iterators
|
|
1079
|
+
*
|
|
1080
|
+
* Calls visitor with two value_type const*, b and e, such that every
|
|
1081
|
+
* entry in the table is included in exactly one of the ranges [b,e).
|
|
1082
|
+
* This can be used to efficiently iterate elements in bulk when crossing
|
|
1083
|
+
* an API boundary that supports contiguous blocks of items.
|
|
1084
|
+
*/
|
|
1085
|
+
template <typename V>
|
|
1086
|
+
void visitContiguousRanges(V&& visitor) const;
|
|
1087
|
+
|
|
1088
|
+
/// Get stats.
|
|
1089
|
+
/// @methodset Hash policy
|
|
1090
|
+
F14TableStats computeStats() const noexcept { return table_.computeStats(); }
|
|
1091
|
+
|
|
1092
|
+
private:
|
|
1093
|
+
template <typename Self, typename K>
|
|
1094
|
+
FOLLY_ALWAYS_INLINE static auto& at(Self& self, K const& key) {
|
|
1095
|
+
auto iter = self.find(key);
|
|
1096
|
+
if (iter == self.end()) {
|
|
1097
|
+
throw_exception<std::out_of_range>("at() did not find key");
|
|
1098
|
+
}
|
|
1099
|
+
return iter->second;
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1102
|
+
template <typename Self, typename K>
|
|
1103
|
+
static auto equal_range(Self& self, K const& key) {
|
|
1104
|
+
auto first = self.find(key);
|
|
1105
|
+
auto last = first;
|
|
1106
|
+
if (last != self.end()) {
|
|
1107
|
+
++last;
|
|
1108
|
+
}
|
|
1109
|
+
return std::make_pair(first, last);
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
protected:
|
|
1113
|
+
F14Table<Policy> table_;
|
|
1114
|
+
};
|
|
1115
|
+
} // namespace detail
|
|
1116
|
+
} // namespace f14
|
|
1117
|
+
|
|
1118
|
+
template <
|
|
1119
|
+
typename Key,
|
|
1120
|
+
typename Mapped,
|
|
1121
|
+
typename Hasher,
|
|
1122
|
+
typename KeyEqual,
|
|
1123
|
+
typename Alloc>
|
|
1124
|
+
class F14ValueMap
|
|
1125
|
+
: public f14::detail::F14BasicMap<f14::detail::MapPolicyWithDefaults<
|
|
1126
|
+
f14::detail::ValueContainerPolicy,
|
|
1127
|
+
Key,
|
|
1128
|
+
Mapped,
|
|
1129
|
+
Hasher,
|
|
1130
|
+
KeyEqual,
|
|
1131
|
+
Alloc>> {
|
|
1132
|
+
protected:
|
|
1133
|
+
using Policy = f14::detail::MapPolicyWithDefaults<
|
|
1134
|
+
f14::detail::ValueContainerPolicy,
|
|
1135
|
+
Key,
|
|
1136
|
+
Mapped,
|
|
1137
|
+
Hasher,
|
|
1138
|
+
KeyEqual,
|
|
1139
|
+
Alloc>;
|
|
1140
|
+
|
|
1141
|
+
private:
|
|
1142
|
+
using Super = f14::detail::F14BasicMap<Policy>;
|
|
1143
|
+
|
|
1144
|
+
public:
|
|
1145
|
+
using typename Super::value_type;
|
|
1146
|
+
|
|
1147
|
+
F14ValueMap() = default;
|
|
1148
|
+
|
|
1149
|
+
using Super::Super;
|
|
1150
|
+
|
|
1151
|
+
F14ValueMap& operator=(std::initializer_list<value_type> ilist) {
|
|
1152
|
+
Super::operator=(ilist);
|
|
1153
|
+
return *this;
|
|
1154
|
+
}
|
|
1155
|
+
|
|
1156
|
+
/// Swaps contained objects with another F14Map
|
|
1157
|
+
/// @methodset Modifiers
|
|
1158
|
+
void swap(F14ValueMap& rhs) noexcept(Policy::kSwapIsNoexcept) {
|
|
1159
|
+
this->table_.swap(rhs.table_);
|
|
1160
|
+
}
|
|
1161
|
+
|
|
1162
|
+
/**
|
|
1163
|
+
* Visit contiguous ranges of elements.
|
|
1164
|
+
* @methodset Iterators
|
|
1165
|
+
*
|
|
1166
|
+
* Calls visitor with two value_type const*, b and e, such that every
|
|
1167
|
+
* entry in the table is included in exactly one of the ranges [b,e).
|
|
1168
|
+
* This can be used to efficiently iterate elements in bulk when crossing
|
|
1169
|
+
* an API boundary that supports contiguous blocks of items.
|
|
1170
|
+
*/
|
|
1171
|
+
template <typename V>
|
|
1172
|
+
void visitContiguousRanges(V&& visitor) const {
|
|
1173
|
+
this->table_.visitContiguousItemRanges(visitor);
|
|
1174
|
+
}
|
|
1175
|
+
};
|
|
1176
|
+
#endif // FOLLY_F14_VECTOR_INTRINSICS_AVAILABLE
|
|
1177
|
+
|
|
1178
|
+
template <
|
|
1179
|
+
typename InputIt,
|
|
1180
|
+
typename Hasher = f14::DefaultHasher<iterator_key_type_t<InputIt>>,
|
|
1181
|
+
typename KeyEqual = f14::DefaultKeyEqual<iterator_key_type_t<InputIt>>,
|
|
1182
|
+
typename Alloc = f14::DefaultAlloc<iterator_value_type_t<InputIt>>,
|
|
1183
|
+
typename = detail::RequireInputIterator<InputIt>,
|
|
1184
|
+
// Next two constraints are necessary to disambiguate from next constructor
|
|
1185
|
+
typename = detail::RequireNotAllocator<Hasher>,
|
|
1186
|
+
typename = detail::RequireNotAllocator<KeyEqual>,
|
|
1187
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1188
|
+
F14ValueMap(
|
|
1189
|
+
InputIt, InputIt, std::size_t = {}, Hasher = {}, KeyEqual = {}, Alloc = {})
|
|
1190
|
+
-> F14ValueMap<
|
|
1191
|
+
iterator_key_type_t<InputIt>,
|
|
1192
|
+
iterator_mapped_type_t<InputIt>,
|
|
1193
|
+
Hasher,
|
|
1194
|
+
KeyEqual,
|
|
1195
|
+
Alloc>;
|
|
1196
|
+
|
|
1197
|
+
template <
|
|
1198
|
+
typename InputIt,
|
|
1199
|
+
typename Alloc,
|
|
1200
|
+
typename = detail::RequireInputIterator<InputIt>,
|
|
1201
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1202
|
+
F14ValueMap(InputIt, InputIt, std::size_t, Alloc)
|
|
1203
|
+
-> F14ValueMap<
|
|
1204
|
+
iterator_key_type_t<InputIt>,
|
|
1205
|
+
iterator_mapped_type_t<InputIt>,
|
|
1206
|
+
f14::DefaultHasher<iterator_key_type_t<InputIt>>,
|
|
1207
|
+
f14::DefaultKeyEqual<iterator_key_type_t<InputIt>>,
|
|
1208
|
+
Alloc>;
|
|
1209
|
+
|
|
1210
|
+
template <
|
|
1211
|
+
typename InputIt,
|
|
1212
|
+
typename Hasher,
|
|
1213
|
+
typename Alloc,
|
|
1214
|
+
typename = detail::RequireInputIterator<InputIt>,
|
|
1215
|
+
typename = detail::RequireNotAllocator<Hasher>,
|
|
1216
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1217
|
+
F14ValueMap(InputIt, InputIt, std::size_t, Hasher, Alloc)
|
|
1218
|
+
-> F14ValueMap<
|
|
1219
|
+
iterator_key_type_t<InputIt>,
|
|
1220
|
+
iterator_mapped_type_t<InputIt>,
|
|
1221
|
+
Hasher,
|
|
1222
|
+
f14::DefaultKeyEqual<iterator_key_type_t<InputIt>>,
|
|
1223
|
+
Alloc>;
|
|
1224
|
+
|
|
1225
|
+
template <
|
|
1226
|
+
typename Key,
|
|
1227
|
+
typename Mapped,
|
|
1228
|
+
typename Hasher = f14::DefaultHasher<Key>,
|
|
1229
|
+
typename KeyEqual = f14::DefaultKeyEqual<Key>,
|
|
1230
|
+
typename Alloc = f14::DefaultAlloc<std::pair<const Key, Mapped>>,
|
|
1231
|
+
typename = detail::RequireNotAllocator<Hasher>,
|
|
1232
|
+
typename = detail::RequireNotAllocator<KeyEqual>,
|
|
1233
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1234
|
+
F14ValueMap(
|
|
1235
|
+
std::initializer_list<std::pair<Key, Mapped>>,
|
|
1236
|
+
std::size_t = {},
|
|
1237
|
+
Hasher = {},
|
|
1238
|
+
KeyEqual = {},
|
|
1239
|
+
Alloc = {}) -> F14ValueMap<Key, Mapped, Hasher, KeyEqual, Alloc>;
|
|
1240
|
+
|
|
1241
|
+
template <
|
|
1242
|
+
typename Key,
|
|
1243
|
+
typename Mapped,
|
|
1244
|
+
typename Alloc,
|
|
1245
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1246
|
+
F14ValueMap(std::initializer_list<std::pair<Key, Mapped>>, std::size_t, Alloc)
|
|
1247
|
+
-> F14ValueMap<
|
|
1248
|
+
Key,
|
|
1249
|
+
Mapped,
|
|
1250
|
+
f14::DefaultHasher<Key>,
|
|
1251
|
+
f14::DefaultKeyEqual<Key>,
|
|
1252
|
+
Alloc>;
|
|
1253
|
+
|
|
1254
|
+
template <
|
|
1255
|
+
typename Key,
|
|
1256
|
+
typename Mapped,
|
|
1257
|
+
typename Hasher,
|
|
1258
|
+
typename Alloc,
|
|
1259
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1260
|
+
F14ValueMap(
|
|
1261
|
+
std::initializer_list<std::pair<Key, Mapped>>, std::size_t, Hasher, Alloc)
|
|
1262
|
+
-> F14ValueMap<Key, Mapped, Hasher, f14::DefaultKeyEqual<Key>, Alloc>;
|
|
1263
|
+
|
|
1264
|
+
#if FOLLY_F14_VECTOR_INTRINSICS_AVAILABLE
|
|
1265
|
+
template <
|
|
1266
|
+
typename Key,
|
|
1267
|
+
typename Mapped,
|
|
1268
|
+
typename Hasher,
|
|
1269
|
+
typename KeyEqual,
|
|
1270
|
+
typename Alloc>
|
|
1271
|
+
class F14NodeMap
|
|
1272
|
+
: public f14::detail::F14BasicMap<f14::detail::MapPolicyWithDefaults<
|
|
1273
|
+
f14::detail::NodeContainerPolicy,
|
|
1274
|
+
Key,
|
|
1275
|
+
Mapped,
|
|
1276
|
+
Hasher,
|
|
1277
|
+
KeyEqual,
|
|
1278
|
+
Alloc>> {
|
|
1279
|
+
protected:
|
|
1280
|
+
using Policy = f14::detail::MapPolicyWithDefaults<
|
|
1281
|
+
f14::detail::NodeContainerPolicy,
|
|
1282
|
+
Key,
|
|
1283
|
+
Mapped,
|
|
1284
|
+
Hasher,
|
|
1285
|
+
KeyEqual,
|
|
1286
|
+
Alloc>;
|
|
1287
|
+
|
|
1288
|
+
private:
|
|
1289
|
+
using Super = f14::detail::F14BasicMap<Policy>;
|
|
1290
|
+
|
|
1291
|
+
public:
|
|
1292
|
+
using typename Super::value_type;
|
|
1293
|
+
|
|
1294
|
+
F14NodeMap() = default;
|
|
1295
|
+
|
|
1296
|
+
using Super::Super;
|
|
1297
|
+
|
|
1298
|
+
F14NodeMap& operator=(std::initializer_list<value_type> ilist) {
|
|
1299
|
+
Super::operator=(ilist);
|
|
1300
|
+
return *this;
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1303
|
+
/// @methodset Modifiers
|
|
1304
|
+
void swap(F14NodeMap& rhs) noexcept(Policy::kSwapIsNoexcept) {
|
|
1305
|
+
this->table_.swap(rhs.table_);
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
/**
|
|
1309
|
+
* Visit contiguous ranges of elements.
|
|
1310
|
+
* @methodset Iterators
|
|
1311
|
+
*
|
|
1312
|
+
* Calls visitor with two value_type const*, b and e, such that every
|
|
1313
|
+
* entry in the table is included in exactly one of the ranges [b,e).
|
|
1314
|
+
* This can be used to efficiently iterate elements in bulk when crossing
|
|
1315
|
+
* an API boundary that supports contiguous blocks of items.
|
|
1316
|
+
*/
|
|
1317
|
+
template <typename V>
|
|
1318
|
+
void visitContiguousRanges(V&& visitor) const {
|
|
1319
|
+
this->table_.visitItems([&](typename Policy::Item ptr) {
|
|
1320
|
+
value_type const* b = std::addressof(*ptr);
|
|
1321
|
+
visitor(b, b + 1);
|
|
1322
|
+
});
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
// TODO extract and node_handle insert
|
|
1326
|
+
};
|
|
1327
|
+
#endif // FOLLY_F14_VECTOR_INTRINSICS_AVAILABLE
|
|
1328
|
+
|
|
1329
|
+
template <
|
|
1330
|
+
typename InputIt,
|
|
1331
|
+
typename Hasher = f14::DefaultHasher<iterator_key_type_t<InputIt>>,
|
|
1332
|
+
typename KeyEqual = f14::DefaultKeyEqual<iterator_key_type_t<InputIt>>,
|
|
1333
|
+
typename Alloc = f14::DefaultAlloc<iterator_value_type_t<InputIt>>,
|
|
1334
|
+
typename = detail::RequireInputIterator<InputIt>,
|
|
1335
|
+
typename = detail::RequireNotAllocator<Hasher>,
|
|
1336
|
+
typename = detail::RequireNotAllocator<KeyEqual>,
|
|
1337
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1338
|
+
F14NodeMap(
|
|
1339
|
+
InputIt, InputIt, std::size_t = {}, Hasher = {}, KeyEqual = {}, Alloc = {})
|
|
1340
|
+
-> F14NodeMap<
|
|
1341
|
+
iterator_key_type_t<InputIt>,
|
|
1342
|
+
iterator_mapped_type_t<InputIt>,
|
|
1343
|
+
Hasher,
|
|
1344
|
+
KeyEqual,
|
|
1345
|
+
Alloc>;
|
|
1346
|
+
|
|
1347
|
+
template <
|
|
1348
|
+
typename InputIt,
|
|
1349
|
+
typename Alloc,
|
|
1350
|
+
typename = detail::RequireInputIterator<InputIt>,
|
|
1351
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1352
|
+
F14NodeMap(InputIt, InputIt, std::size_t, Alloc)
|
|
1353
|
+
-> F14NodeMap<
|
|
1354
|
+
iterator_key_type_t<InputIt>,
|
|
1355
|
+
iterator_mapped_type_t<InputIt>,
|
|
1356
|
+
f14::DefaultHasher<iterator_key_type_t<InputIt>>,
|
|
1357
|
+
f14::DefaultKeyEqual<iterator_key_type_t<InputIt>>,
|
|
1358
|
+
Alloc>;
|
|
1359
|
+
|
|
1360
|
+
template <
|
|
1361
|
+
typename InputIt,
|
|
1362
|
+
typename Hasher,
|
|
1363
|
+
typename Alloc,
|
|
1364
|
+
typename = detail::RequireInputIterator<InputIt>,
|
|
1365
|
+
typename = detail::RequireNotAllocator<Hasher>,
|
|
1366
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1367
|
+
F14NodeMap(InputIt, InputIt, std::size_t, Hasher, Alloc)
|
|
1368
|
+
-> F14NodeMap<
|
|
1369
|
+
iterator_key_type_t<InputIt>,
|
|
1370
|
+
iterator_mapped_type_t<InputIt>,
|
|
1371
|
+
Hasher,
|
|
1372
|
+
f14::DefaultKeyEqual<iterator_key_type_t<InputIt>>,
|
|
1373
|
+
Alloc>;
|
|
1374
|
+
|
|
1375
|
+
template <
|
|
1376
|
+
typename Key,
|
|
1377
|
+
typename Mapped,
|
|
1378
|
+
typename Hasher = f14::DefaultHasher<Key>,
|
|
1379
|
+
typename KeyEqual = f14::DefaultKeyEqual<Key>,
|
|
1380
|
+
typename Alloc = f14::DefaultAlloc<std::pair<const Key, Mapped>>,
|
|
1381
|
+
typename = detail::RequireNotAllocator<Hasher>,
|
|
1382
|
+
typename = detail::RequireNotAllocator<KeyEqual>,
|
|
1383
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1384
|
+
F14NodeMap(
|
|
1385
|
+
std::initializer_list<std::pair<Key, Mapped>>,
|
|
1386
|
+
std::size_t = {},
|
|
1387
|
+
Hasher = {},
|
|
1388
|
+
KeyEqual = {},
|
|
1389
|
+
Alloc = {}) -> F14NodeMap<Key, Mapped, Hasher, KeyEqual, Alloc>;
|
|
1390
|
+
|
|
1391
|
+
template <
|
|
1392
|
+
typename Key,
|
|
1393
|
+
typename Mapped,
|
|
1394
|
+
typename Alloc,
|
|
1395
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1396
|
+
F14NodeMap(std::initializer_list<std::pair<Key, Mapped>>, std::size_t, Alloc)
|
|
1397
|
+
-> F14NodeMap<
|
|
1398
|
+
Key,
|
|
1399
|
+
Mapped,
|
|
1400
|
+
f14::DefaultHasher<Key>,
|
|
1401
|
+
f14::DefaultKeyEqual<Key>,
|
|
1402
|
+
Alloc>;
|
|
1403
|
+
|
|
1404
|
+
template <
|
|
1405
|
+
typename Key,
|
|
1406
|
+
typename Mapped,
|
|
1407
|
+
typename Hasher,
|
|
1408
|
+
typename Alloc,
|
|
1409
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1410
|
+
F14NodeMap(
|
|
1411
|
+
std::initializer_list<std::pair<Key, Mapped>>, std::size_t, Hasher, Alloc)
|
|
1412
|
+
-> F14NodeMap<Key, Mapped, Hasher, f14::DefaultKeyEqual<Key>, Alloc>;
|
|
1413
|
+
|
|
1414
|
+
#if FOLLY_F14_VECTOR_INTRINSICS_AVAILABLE
|
|
1415
|
+
namespace f14 {
|
|
1416
|
+
namespace detail {
|
|
1417
|
+
template <
|
|
1418
|
+
typename Key,
|
|
1419
|
+
typename Mapped,
|
|
1420
|
+
typename Hasher,
|
|
1421
|
+
typename KeyEqual,
|
|
1422
|
+
typename Alloc,
|
|
1423
|
+
typename EligibleForPerturbedInsertionOrder>
|
|
1424
|
+
class F14VectorMapImpl : public F14BasicMap<MapPolicyWithDefaults<
|
|
1425
|
+
VectorContainerPolicy,
|
|
1426
|
+
Key,
|
|
1427
|
+
Mapped,
|
|
1428
|
+
Hasher,
|
|
1429
|
+
KeyEqual,
|
|
1430
|
+
Alloc,
|
|
1431
|
+
EligibleForPerturbedInsertionOrder>> {
|
|
1432
|
+
protected:
|
|
1433
|
+
using Policy = MapPolicyWithDefaults<
|
|
1434
|
+
VectorContainerPolicy,
|
|
1435
|
+
Key,
|
|
1436
|
+
Mapped,
|
|
1437
|
+
Hasher,
|
|
1438
|
+
KeyEqual,
|
|
1439
|
+
Alloc,
|
|
1440
|
+
EligibleForPerturbedInsertionOrder>;
|
|
1441
|
+
|
|
1442
|
+
private:
|
|
1443
|
+
using Super = F14BasicMap<Policy>;
|
|
1444
|
+
|
|
1445
|
+
template <typename K>
|
|
1446
|
+
using IsIter = Disjunction<
|
|
1447
|
+
std::is_same<typename Policy::Iter, remove_cvref_t<K>>,
|
|
1448
|
+
std::is_same<typename Policy::ConstIter, remove_cvref_t<K>>,
|
|
1449
|
+
std::is_same<typename Policy::ReverseIter, remove_cvref_t<K>>,
|
|
1450
|
+
std::is_same<typename Policy::ConstReverseIter, remove_cvref_t<K>>>;
|
|
1451
|
+
|
|
1452
|
+
template <typename K, typename T>
|
|
1453
|
+
using EnableHeterogeneousVectorErase = std::enable_if_t<
|
|
1454
|
+
::folly::detail::EligibleForHeterogeneousFind<
|
|
1455
|
+
Key,
|
|
1456
|
+
Hasher,
|
|
1457
|
+
KeyEqual,
|
|
1458
|
+
std::conditional_t<IsIter<K>::value, Key, K>>::value &&
|
|
1459
|
+
!IsIter<K>::value,
|
|
1460
|
+
T>;
|
|
1461
|
+
|
|
1462
|
+
public:
|
|
1463
|
+
using typename Super::const_iterator;
|
|
1464
|
+
using typename Super::iterator;
|
|
1465
|
+
using typename Super::key_type;
|
|
1466
|
+
using typename Super::mapped_type;
|
|
1467
|
+
using typename Super::value_type;
|
|
1468
|
+
|
|
1469
|
+
F14VectorMapImpl() = default;
|
|
1470
|
+
|
|
1471
|
+
// inherit constructors
|
|
1472
|
+
using Super::Super;
|
|
1473
|
+
|
|
1474
|
+
F14VectorMapImpl& operator=(std::initializer_list<value_type> ilist) {
|
|
1475
|
+
Super::operator=(ilist);
|
|
1476
|
+
return *this;
|
|
1477
|
+
}
|
|
1478
|
+
|
|
1479
|
+
/// @methodset Iterators
|
|
1480
|
+
iterator begin() { return this->table_.linearBegin(this->size()); }
|
|
1481
|
+
/// @methodset Iterators
|
|
1482
|
+
const_iterator begin() const { return cbegin(); }
|
|
1483
|
+
/// @methodset Iterators
|
|
1484
|
+
const_iterator cbegin() const {
|
|
1485
|
+
return this->table_.linearBegin(this->size());
|
|
1486
|
+
}
|
|
1487
|
+
|
|
1488
|
+
/// @methodset Iterators
|
|
1489
|
+
iterator end() { return this->table_.linearEnd(); }
|
|
1490
|
+
/// @methodset Iterators
|
|
1491
|
+
const_iterator end() const { return cend(); }
|
|
1492
|
+
/// @methodset Iterators
|
|
1493
|
+
const_iterator cend() const { return this->table_.linearEnd(); }
|
|
1494
|
+
|
|
1495
|
+
private:
|
|
1496
|
+
template <typename BeforeDestroy>
|
|
1497
|
+
void eraseUnderlying(
|
|
1498
|
+
typename Policy::ItemIter underlying, BeforeDestroy&& beforeDestroy) {
|
|
1499
|
+
Alloc& a = this->table_.alloc();
|
|
1500
|
+
auto values = this->table_.values_;
|
|
1501
|
+
|
|
1502
|
+
// Remove the ptr from the base table and destroy the value.
|
|
1503
|
+
auto index = underlying.item();
|
|
1504
|
+
// The item still needs to be hashable during this call, so we must destroy
|
|
1505
|
+
// the value _afterwards_.
|
|
1506
|
+
this->tableEraseIterInto(underlying, beforeDestroy);
|
|
1507
|
+
Policy::AllocTraits::destroy(a, std::addressof(values[index]));
|
|
1508
|
+
|
|
1509
|
+
// move the last element in values_ down and fix up the inbound index
|
|
1510
|
+
auto tailIndex = this->size();
|
|
1511
|
+
if (tailIndex != index) {
|
|
1512
|
+
auto tail = this->table_.find(
|
|
1513
|
+
VectorContainerIndexSearch{static_cast<uint32_t>(tailIndex)});
|
|
1514
|
+
tail.item() = index;
|
|
1515
|
+
auto p = std::addressof(values[index]);
|
|
1516
|
+
assume(p != nullptr);
|
|
1517
|
+
this->table_.transfer(a, std::addressof(values[tailIndex]), p, 1);
|
|
1518
|
+
}
|
|
1519
|
+
}
|
|
1520
|
+
|
|
1521
|
+
template <typename K, typename BeforeDestroy>
|
|
1522
|
+
std::size_t eraseUnderlyingKey(K const& key, BeforeDestroy&& beforeDestroy) {
|
|
1523
|
+
auto underlying = this->table_.find(key);
|
|
1524
|
+
if (underlying.atEnd()) {
|
|
1525
|
+
return 0;
|
|
1526
|
+
} else {
|
|
1527
|
+
eraseUnderlying(underlying, beforeDestroy);
|
|
1528
|
+
return 1;
|
|
1529
|
+
}
|
|
1530
|
+
}
|
|
1531
|
+
|
|
1532
|
+
public:
|
|
1533
|
+
/**
|
|
1534
|
+
* Remove element at a specific position (iterator).
|
|
1535
|
+
* @overloadbrief Remove elements.
|
|
1536
|
+
* @methodset Modifiers
|
|
1537
|
+
*/
|
|
1538
|
+
FOLLY_ALWAYS_INLINE iterator erase(const_iterator pos) {
|
|
1539
|
+
return eraseInto(pos, variadic_noop);
|
|
1540
|
+
}
|
|
1541
|
+
|
|
1542
|
+
// This form avoids ambiguity when key_type has a templated constructor
|
|
1543
|
+
// that accepts const_iterator
|
|
1544
|
+
FOLLY_ALWAYS_INLINE iterator erase(iterator pos) {
|
|
1545
|
+
return eraseInto(pos, variadic_noop);
|
|
1546
|
+
}
|
|
1547
|
+
|
|
1548
|
+
/// Remove a range of elements.
|
|
1549
|
+
iterator erase(const_iterator first, const_iterator last) {
|
|
1550
|
+
return eraseInto(first, last, variadic_noop);
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1553
|
+
/// Remove a specific key.
|
|
1554
|
+
std::size_t erase(key_type const& key) {
|
|
1555
|
+
return eraseInto(key, variadic_noop);
|
|
1556
|
+
}
|
|
1557
|
+
|
|
1558
|
+
/// Remove a key, using a heterogeneous representation.
|
|
1559
|
+
template <typename K>
|
|
1560
|
+
EnableHeterogeneousVectorErase<K, std::size_t> erase(K const& key) {
|
|
1561
|
+
return eraseInto(key, variadic_noop);
|
|
1562
|
+
}
|
|
1563
|
+
|
|
1564
|
+
/**
|
|
1565
|
+
* Callback-erase a single iterator.
|
|
1566
|
+
* @overloadbrief Erase with pre-destruction callback.
|
|
1567
|
+
* @methodset Modifiers
|
|
1568
|
+
*
|
|
1569
|
+
* Like erase, but with an additional callback argument which is called with
|
|
1570
|
+
* an rvalue reference to the item directly before it is destroyed. This can
|
|
1571
|
+
* be used to extract an item out of a F14Set while avoiding a copy.
|
|
1572
|
+
*/
|
|
1573
|
+
template <typename BeforeDestroy>
|
|
1574
|
+
FOLLY_ALWAYS_INLINE iterator
|
|
1575
|
+
eraseInto(const_iterator pos, BeforeDestroy&& beforeDestroy) {
|
|
1576
|
+
auto index = this->table_.iterToIndex(pos);
|
|
1577
|
+
auto underlying = this->table_.find(VectorContainerIndexSearch{index});
|
|
1578
|
+
eraseUnderlying(underlying, beforeDestroy);
|
|
1579
|
+
return index == 0 ? end() : this->table_.indexToIter(index - 1);
|
|
1580
|
+
}
|
|
1581
|
+
|
|
1582
|
+
// This form avoids ambiguity when key_type has a templated constructor
|
|
1583
|
+
// that accepts const_iterator
|
|
1584
|
+
template <typename BeforeDestroy>
|
|
1585
|
+
FOLLY_ALWAYS_INLINE iterator
|
|
1586
|
+
eraseInto(iterator pos, BeforeDestroy&& beforeDestroy) {
|
|
1587
|
+
const_iterator cpos{pos};
|
|
1588
|
+
return eraseInto(cpos, beforeDestroy);
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1591
|
+
/// Callback-erase a range of values.
|
|
1592
|
+
template <typename BeforeDestroy>
|
|
1593
|
+
iterator eraseInto(
|
|
1594
|
+
const_iterator first,
|
|
1595
|
+
const_iterator last,
|
|
1596
|
+
BeforeDestroy&& beforeDestroy) {
|
|
1597
|
+
while (first != last) {
|
|
1598
|
+
first = eraseInto(first, beforeDestroy);
|
|
1599
|
+
}
|
|
1600
|
+
auto index = this->table_.iterToIndex(first);
|
|
1601
|
+
return index == 0 ? end() : this->table_.indexToIter(index - 1);
|
|
1602
|
+
}
|
|
1603
|
+
|
|
1604
|
+
/// Callback-erase a specific key.
|
|
1605
|
+
template <typename BeforeDestroy>
|
|
1606
|
+
std::size_t eraseInto(key_type const& key, BeforeDestroy&& beforeDestroy) {
|
|
1607
|
+
return eraseUnderlyingKey(key, beforeDestroy);
|
|
1608
|
+
}
|
|
1609
|
+
|
|
1610
|
+
/// Callback-erase a specific key, using a heterogeneous representation.
|
|
1611
|
+
template <typename K, typename BeforeDestroy>
|
|
1612
|
+
EnableHeterogeneousVectorErase<K, std::size_t> eraseInto(
|
|
1613
|
+
K const& key, BeforeDestroy&& beforeDestroy) {
|
|
1614
|
+
return eraseUnderlyingKey(key, beforeDestroy);
|
|
1615
|
+
}
|
|
1616
|
+
|
|
1617
|
+
/**
|
|
1618
|
+
* Visit contiguous ranges of elements.
|
|
1619
|
+
* @methodset Iterators
|
|
1620
|
+
*
|
|
1621
|
+
* Calls visitor with two value_type const*, b and e, such that every
|
|
1622
|
+
* entry in the table is included in exactly one of the ranges [b,e).
|
|
1623
|
+
* This can be used to efficiently iterate elements in bulk when crossing
|
|
1624
|
+
* an API boundary that supports contiguous blocks of items.
|
|
1625
|
+
*/
|
|
1626
|
+
template <typename V>
|
|
1627
|
+
void visitContiguousRanges(V&& visitor) const {
|
|
1628
|
+
auto n = this->table_.size();
|
|
1629
|
+
if (n > 0) {
|
|
1630
|
+
value_type const* b = std::addressof(this->table_.values_[0]);
|
|
1631
|
+
visitor(b, b + n);
|
|
1632
|
+
}
|
|
1633
|
+
}
|
|
1634
|
+
};
|
|
1635
|
+
} // namespace detail
|
|
1636
|
+
} // namespace f14
|
|
1637
|
+
|
|
1638
|
+
template <
|
|
1639
|
+
typename Key,
|
|
1640
|
+
typename Mapped,
|
|
1641
|
+
typename Hasher,
|
|
1642
|
+
typename KeyEqual,
|
|
1643
|
+
typename Alloc>
|
|
1644
|
+
class F14VectorMap : public f14::detail::F14VectorMapImpl<
|
|
1645
|
+
Key,
|
|
1646
|
+
Mapped,
|
|
1647
|
+
Hasher,
|
|
1648
|
+
KeyEqual,
|
|
1649
|
+
Alloc,
|
|
1650
|
+
std::false_type> {
|
|
1651
|
+
using Super = f14::detail::
|
|
1652
|
+
F14VectorMapImpl<Key, Mapped, Hasher, KeyEqual, Alloc, std::false_type>;
|
|
1653
|
+
|
|
1654
|
+
public:
|
|
1655
|
+
using typename Super::const_iterator;
|
|
1656
|
+
using typename Super::iterator;
|
|
1657
|
+
using typename Super::value_type;
|
|
1658
|
+
using reverse_iterator = typename Super::Policy::ReverseIter;
|
|
1659
|
+
using const_reverse_iterator = typename Super::Policy::ConstReverseIter;
|
|
1660
|
+
|
|
1661
|
+
F14VectorMap() = default;
|
|
1662
|
+
|
|
1663
|
+
// inherit constructors
|
|
1664
|
+
using Super::Super;
|
|
1665
|
+
|
|
1666
|
+
F14VectorMap& operator=(std::initializer_list<value_type> ilist) {
|
|
1667
|
+
Super::operator=(ilist);
|
|
1668
|
+
return *this;
|
|
1669
|
+
}
|
|
1670
|
+
|
|
1671
|
+
/// @methodset Modifiers
|
|
1672
|
+
void swap(F14VectorMap& rhs) noexcept(Super::Policy::kSwapIsNoexcept) {
|
|
1673
|
+
this->table_.swap(rhs.table_);
|
|
1674
|
+
}
|
|
1675
|
+
|
|
1676
|
+
// ITERATION ORDER
|
|
1677
|
+
//
|
|
1678
|
+
// Deterministic iteration order for insert-only workloads is part of
|
|
1679
|
+
// F14VectorMap's supported API: iterator is LIFO and reverse_iterator
|
|
1680
|
+
// is FIFO.
|
|
1681
|
+
//
|
|
1682
|
+
// If there have been no calls to erase() then iterator and
|
|
1683
|
+
// const_iterator enumerate entries in the opposite of insertion order.
|
|
1684
|
+
// begin()->first is the key most recently inserted. reverse_iterator
|
|
1685
|
+
// and reverse_const_iterator, therefore, enumerate in LIFO (insertion)
|
|
1686
|
+
// order for insert-only workloads. Deterministic iteration order is
|
|
1687
|
+
// only guaranteed if no keys were removed since the last time the
|
|
1688
|
+
// map was empty. Iteration order is preserved across rehashes and
|
|
1689
|
+
// F14VectorMap copies and moves.
|
|
1690
|
+
//
|
|
1691
|
+
// iterator uses LIFO order so that erasing while iterating with begin()
|
|
1692
|
+
// and end() is safe using the erase(it++) idiom, which is supported
|
|
1693
|
+
// by std::map and std::unordered_map. erase(iter) invalidates iter
|
|
1694
|
+
// and all iterators before iter in the non-reverse iteration order.
|
|
1695
|
+
// Every successful erase invalidates all reverse iterators.
|
|
1696
|
+
//
|
|
1697
|
+
// No erase is provided for reverse_iterator or const_reverse_iterator
|
|
1698
|
+
// to make it harder to shoot yourself in the foot by erasing while
|
|
1699
|
+
// reverse-iterating. You can write that as map.erase(map.iter(riter))
|
|
1700
|
+
// if you really need it.
|
|
1701
|
+
|
|
1702
|
+
/// @methodset Iterators
|
|
1703
|
+
reverse_iterator rbegin() { return this->table_.values_; }
|
|
1704
|
+
/// @methodset Iterators
|
|
1705
|
+
const_reverse_iterator rbegin() const { return crbegin(); }
|
|
1706
|
+
/// @methodset Iterators
|
|
1707
|
+
const_reverse_iterator crbegin() const { return this->table_.values_; }
|
|
1708
|
+
|
|
1709
|
+
/// @methodset Iterators
|
|
1710
|
+
reverse_iterator rend() { return this->table_.values_ + this->table_.size(); }
|
|
1711
|
+
/// @methodset Iterators
|
|
1712
|
+
const_reverse_iterator rend() const { return crend(); }
|
|
1713
|
+
/// @methodset Iterators
|
|
1714
|
+
const_reverse_iterator crend() const {
|
|
1715
|
+
return this->table_.values_ + this->table_.size();
|
|
1716
|
+
}
|
|
1717
|
+
|
|
1718
|
+
/// Explicit conversions between iterator and reverse_iterator
|
|
1719
|
+
/// @methodset Iterators
|
|
1720
|
+
iterator iter(reverse_iterator riter) { return this->table_.iter(riter); }
|
|
1721
|
+
const_iterator iter(const_reverse_iterator riter) const {
|
|
1722
|
+
return this->table_.iter(riter);
|
|
1723
|
+
}
|
|
1724
|
+
|
|
1725
|
+
/// @copydoc iter
|
|
1726
|
+
reverse_iterator riter(iterator it) { return this->table_.riter(it); }
|
|
1727
|
+
const_reverse_iterator riter(const_iterator it) const {
|
|
1728
|
+
return this->table_.riter(it);
|
|
1729
|
+
}
|
|
1730
|
+
|
|
1731
|
+
friend Range<const_reverse_iterator> tag_invoke(
|
|
1732
|
+
order_preserving_reinsertion_view_fn, F14VectorMap const& c) noexcept {
|
|
1733
|
+
return {c.rbegin(), c.rend()};
|
|
1734
|
+
}
|
|
1735
|
+
};
|
|
1736
|
+
#endif // FOLLY_F14_VECTOR_INTRINSICS_AVAILABLE
|
|
1737
|
+
|
|
1738
|
+
template <
|
|
1739
|
+
typename InputIt,
|
|
1740
|
+
typename Hasher = f14::DefaultHasher<iterator_key_type_t<InputIt>>,
|
|
1741
|
+
typename KeyEqual = f14::DefaultKeyEqual<iterator_key_type_t<InputIt>>,
|
|
1742
|
+
typename Alloc = f14::DefaultAlloc<iterator_value_type_t<InputIt>>,
|
|
1743
|
+
typename = detail::RequireInputIterator<InputIt>,
|
|
1744
|
+
typename = detail::RequireNotAllocator<Hasher>,
|
|
1745
|
+
typename = detail::RequireNotAllocator<KeyEqual>,
|
|
1746
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1747
|
+
F14VectorMap(
|
|
1748
|
+
InputIt, InputIt, std::size_t = {}, Hasher = {}, KeyEqual = {}, Alloc = {})
|
|
1749
|
+
-> F14VectorMap<
|
|
1750
|
+
iterator_key_type_t<InputIt>,
|
|
1751
|
+
iterator_mapped_type_t<InputIt>,
|
|
1752
|
+
Hasher,
|
|
1753
|
+
KeyEqual,
|
|
1754
|
+
Alloc>;
|
|
1755
|
+
|
|
1756
|
+
template <
|
|
1757
|
+
typename InputIt,
|
|
1758
|
+
typename Alloc,
|
|
1759
|
+
typename = detail::RequireInputIterator<InputIt>,
|
|
1760
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1761
|
+
F14VectorMap(InputIt, InputIt, std::size_t, Alloc)
|
|
1762
|
+
-> F14VectorMap<
|
|
1763
|
+
iterator_key_type_t<InputIt>,
|
|
1764
|
+
iterator_mapped_type_t<InputIt>,
|
|
1765
|
+
f14::DefaultHasher<iterator_key_type_t<InputIt>>,
|
|
1766
|
+
f14::DefaultKeyEqual<iterator_key_type_t<InputIt>>,
|
|
1767
|
+
Alloc>;
|
|
1768
|
+
|
|
1769
|
+
template <
|
|
1770
|
+
typename InputIt,
|
|
1771
|
+
typename Hasher,
|
|
1772
|
+
typename Alloc,
|
|
1773
|
+
typename = detail::RequireInputIterator<InputIt>,
|
|
1774
|
+
typename = detail::RequireNotAllocator<Hasher>,
|
|
1775
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1776
|
+
F14VectorMap(InputIt, InputIt, std::size_t, Hasher, Alloc)
|
|
1777
|
+
-> F14VectorMap<
|
|
1778
|
+
iterator_key_type_t<InputIt>,
|
|
1779
|
+
iterator_mapped_type_t<InputIt>,
|
|
1780
|
+
Hasher,
|
|
1781
|
+
f14::DefaultKeyEqual<iterator_key_type_t<InputIt>>,
|
|
1782
|
+
Alloc>;
|
|
1783
|
+
|
|
1784
|
+
template <
|
|
1785
|
+
typename Key,
|
|
1786
|
+
typename Mapped,
|
|
1787
|
+
typename Hasher = f14::DefaultHasher<Key>,
|
|
1788
|
+
typename KeyEqual = f14::DefaultKeyEqual<Key>,
|
|
1789
|
+
typename Alloc = f14::DefaultAlloc<std::pair<const Key, Mapped>>,
|
|
1790
|
+
typename = detail::RequireNotAllocator<Hasher>,
|
|
1791
|
+
typename = detail::RequireNotAllocator<KeyEqual>,
|
|
1792
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1793
|
+
F14VectorMap(
|
|
1794
|
+
std::initializer_list<std::pair<Key, Mapped>>,
|
|
1795
|
+
std::size_t = {},
|
|
1796
|
+
Hasher = {},
|
|
1797
|
+
KeyEqual = {},
|
|
1798
|
+
Alloc = {}) -> F14VectorMap<Key, Mapped, Hasher, KeyEqual, Alloc>;
|
|
1799
|
+
|
|
1800
|
+
template <
|
|
1801
|
+
typename Key,
|
|
1802
|
+
typename Mapped,
|
|
1803
|
+
typename Alloc,
|
|
1804
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1805
|
+
F14VectorMap(std::initializer_list<std::pair<Key, Mapped>>, std::size_t, Alloc)
|
|
1806
|
+
-> F14VectorMap<
|
|
1807
|
+
Key,
|
|
1808
|
+
Mapped,
|
|
1809
|
+
f14::DefaultHasher<Key>,
|
|
1810
|
+
f14::DefaultKeyEqual<Key>,
|
|
1811
|
+
Alloc>;
|
|
1812
|
+
|
|
1813
|
+
template <
|
|
1814
|
+
typename Key,
|
|
1815
|
+
typename Mapped,
|
|
1816
|
+
typename Hasher,
|
|
1817
|
+
typename Alloc,
|
|
1818
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1819
|
+
F14VectorMap(
|
|
1820
|
+
std::initializer_list<std::pair<Key, Mapped>>, std::size_t, Hasher, Alloc)
|
|
1821
|
+
-> F14VectorMap<Key, Mapped, Hasher, f14::DefaultKeyEqual<Key>, Alloc>;
|
|
1822
|
+
|
|
1823
|
+
#if FOLLY_F14_VECTOR_INTRINSICS_AVAILABLE
|
|
1824
|
+
/**
|
|
1825
|
+
* F14FastMap is, under the hood, either an F14ValueMap or an F14VectorMap.
|
|
1826
|
+
* F14FastMap chooses which of these two representations to use based on the
|
|
1827
|
+
* size of a node.
|
|
1828
|
+
*/
|
|
1829
|
+
template <
|
|
1830
|
+
typename Key,
|
|
1831
|
+
typename Mapped,
|
|
1832
|
+
typename Hasher,
|
|
1833
|
+
typename KeyEqual,
|
|
1834
|
+
typename Alloc>
|
|
1835
|
+
class F14FastMap : public std::conditional_t<
|
|
1836
|
+
(sizeof(std::pair<Key const, Mapped>) < 24),
|
|
1837
|
+
F14ValueMap<Key, Mapped, Hasher, KeyEqual, Alloc>,
|
|
1838
|
+
f14::detail::F14VectorMapImpl<
|
|
1839
|
+
Key,
|
|
1840
|
+
Mapped,
|
|
1841
|
+
Hasher,
|
|
1842
|
+
KeyEqual,
|
|
1843
|
+
Alloc,
|
|
1844
|
+
std::true_type>> {
|
|
1845
|
+
using Super = std::conditional_t<
|
|
1846
|
+
sizeof(std::pair<Key const, Mapped>) < 24,
|
|
1847
|
+
F14ValueMap<Key, Mapped, Hasher, KeyEqual, Alloc>,
|
|
1848
|
+
f14::detail::F14VectorMapImpl<
|
|
1849
|
+
Key,
|
|
1850
|
+
Mapped,
|
|
1851
|
+
Hasher,
|
|
1852
|
+
KeyEqual,
|
|
1853
|
+
Alloc,
|
|
1854
|
+
std::true_type>>;
|
|
1855
|
+
|
|
1856
|
+
public:
|
|
1857
|
+
using typename Super::value_type;
|
|
1858
|
+
|
|
1859
|
+
F14FastMap() = default;
|
|
1860
|
+
|
|
1861
|
+
using Super::Super;
|
|
1862
|
+
|
|
1863
|
+
F14FastMap& operator=(std::initializer_list<value_type> ilist) {
|
|
1864
|
+
Super::operator=(ilist);
|
|
1865
|
+
return *this;
|
|
1866
|
+
}
|
|
1867
|
+
|
|
1868
|
+
/// @methodset Modifiers
|
|
1869
|
+
void swap(F14FastMap& rhs) noexcept(Super::Policy::kSwapIsNoexcept) {
|
|
1870
|
+
this->table_.swap(rhs.table_);
|
|
1871
|
+
}
|
|
1872
|
+
};
|
|
1873
|
+
#endif // if FOLLY_F14_VECTOR_INTRINSICS_AVAILABLE
|
|
1874
|
+
|
|
1875
|
+
template <
|
|
1876
|
+
typename InputIt,
|
|
1877
|
+
typename Hasher = f14::DefaultHasher<iterator_key_type_t<InputIt>>,
|
|
1878
|
+
typename KeyEqual = f14::DefaultKeyEqual<iterator_key_type_t<InputIt>>,
|
|
1879
|
+
typename Alloc = f14::DefaultAlloc<iterator_value_type_t<InputIt>>,
|
|
1880
|
+
typename = detail::RequireInputIterator<InputIt>,
|
|
1881
|
+
typename = detail::RequireNotAllocator<Hasher>,
|
|
1882
|
+
typename = detail::RequireNotAllocator<KeyEqual>,
|
|
1883
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1884
|
+
F14FastMap(
|
|
1885
|
+
InputIt, InputIt, std::size_t = {}, Hasher = {}, KeyEqual = {}, Alloc = {})
|
|
1886
|
+
-> F14FastMap<
|
|
1887
|
+
iterator_key_type_t<InputIt>,
|
|
1888
|
+
iterator_mapped_type_t<InputIt>,
|
|
1889
|
+
Hasher,
|
|
1890
|
+
KeyEqual,
|
|
1891
|
+
Alloc>;
|
|
1892
|
+
|
|
1893
|
+
template <
|
|
1894
|
+
typename InputIt,
|
|
1895
|
+
typename Alloc,
|
|
1896
|
+
typename = detail::RequireInputIterator<InputIt>,
|
|
1897
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1898
|
+
F14FastMap(InputIt, InputIt, std::size_t, Alloc)
|
|
1899
|
+
-> F14FastMap<
|
|
1900
|
+
iterator_key_type_t<InputIt>,
|
|
1901
|
+
iterator_mapped_type_t<InputIt>,
|
|
1902
|
+
f14::DefaultHasher<iterator_key_type_t<InputIt>>,
|
|
1903
|
+
f14::DefaultKeyEqual<iterator_key_type_t<InputIt>>,
|
|
1904
|
+
Alloc>;
|
|
1905
|
+
|
|
1906
|
+
template <
|
|
1907
|
+
typename InputIt,
|
|
1908
|
+
typename Hasher,
|
|
1909
|
+
typename Alloc,
|
|
1910
|
+
typename = detail::RequireInputIterator<InputIt>,
|
|
1911
|
+
typename = detail::RequireNotAllocator<Hasher>,
|
|
1912
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1913
|
+
F14FastMap(InputIt, InputIt, std::size_t, Hasher, Alloc)
|
|
1914
|
+
-> F14FastMap<
|
|
1915
|
+
iterator_key_type_t<InputIt>,
|
|
1916
|
+
iterator_mapped_type_t<InputIt>,
|
|
1917
|
+
Hasher,
|
|
1918
|
+
f14::DefaultKeyEqual<iterator_key_type_t<InputIt>>,
|
|
1919
|
+
Alloc>;
|
|
1920
|
+
|
|
1921
|
+
template <
|
|
1922
|
+
typename Key,
|
|
1923
|
+
typename Mapped,
|
|
1924
|
+
typename Hasher = f14::DefaultHasher<Key>,
|
|
1925
|
+
typename KeyEqual = f14::DefaultKeyEqual<Key>,
|
|
1926
|
+
typename Alloc = f14::DefaultAlloc<std::pair<const Key, Mapped>>,
|
|
1927
|
+
typename = detail::RequireNotAllocator<Hasher>,
|
|
1928
|
+
typename = detail::RequireNotAllocator<KeyEqual>,
|
|
1929
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1930
|
+
F14FastMap(
|
|
1931
|
+
std::initializer_list<std::pair<Key, Mapped>>,
|
|
1932
|
+
std::size_t = {},
|
|
1933
|
+
Hasher = {},
|
|
1934
|
+
KeyEqual = {},
|
|
1935
|
+
Alloc = {}) -> F14FastMap<Key, Mapped, Hasher, KeyEqual, Alloc>;
|
|
1936
|
+
|
|
1937
|
+
template <
|
|
1938
|
+
typename Key,
|
|
1939
|
+
typename Mapped,
|
|
1940
|
+
typename Alloc,
|
|
1941
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1942
|
+
F14FastMap(std::initializer_list<std::pair<Key, Mapped>>, std::size_t, Alloc)
|
|
1943
|
+
-> F14FastMap<
|
|
1944
|
+
Key,
|
|
1945
|
+
Mapped,
|
|
1946
|
+
f14::DefaultHasher<Key>,
|
|
1947
|
+
f14::DefaultKeyEqual<Key>,
|
|
1948
|
+
Alloc>;
|
|
1949
|
+
|
|
1950
|
+
template <
|
|
1951
|
+
typename Key,
|
|
1952
|
+
typename Mapped,
|
|
1953
|
+
typename Hasher,
|
|
1954
|
+
typename Alloc,
|
|
1955
|
+
typename = detail::RequireAllocator<Alloc>>
|
|
1956
|
+
F14FastMap(
|
|
1957
|
+
std::initializer_list<std::pair<Key, Mapped>>, std::size_t, Hasher, Alloc)
|
|
1958
|
+
-> F14FastMap<Key, Mapped, Hasher, f14::DefaultKeyEqual<Key>, Alloc>;
|
|
1959
|
+
|
|
1960
|
+
} // namespace folly
|
|
1961
|
+
|
|
1962
|
+
namespace folly {
|
|
1963
|
+
namespace f14 {
|
|
1964
|
+
namespace detail {
|
|
1965
|
+
template <typename M>
|
|
1966
|
+
bool mapsEqual(M const& lhs, M const& rhs) {
|
|
1967
|
+
if (lhs.size() != rhs.size()) {
|
|
1968
|
+
return false;
|
|
1969
|
+
}
|
|
1970
|
+
for (auto& kv : lhs) {
|
|
1971
|
+
if (!rhs.containsEqualValue(kv)) {
|
|
1972
|
+
return false;
|
|
1973
|
+
}
|
|
1974
|
+
}
|
|
1975
|
+
return true;
|
|
1976
|
+
}
|
|
1977
|
+
} // namespace detail
|
|
1978
|
+
} // namespace f14
|
|
1979
|
+
|
|
1980
|
+
template <typename K, typename M, typename H, typename E, typename A>
|
|
1981
|
+
bool operator==(
|
|
1982
|
+
F14ValueMap<K, M, H, E, A> const& lhs,
|
|
1983
|
+
F14ValueMap<K, M, H, E, A> const& rhs) {
|
|
1984
|
+
return mapsEqual(lhs, rhs);
|
|
1985
|
+
}
|
|
1986
|
+
|
|
1987
|
+
template <typename K, typename M, typename H, typename E, typename A>
|
|
1988
|
+
bool operator!=(
|
|
1989
|
+
F14ValueMap<K, M, H, E, A> const& lhs,
|
|
1990
|
+
F14ValueMap<K, M, H, E, A> const& rhs) {
|
|
1991
|
+
return !(lhs == rhs);
|
|
1992
|
+
}
|
|
1993
|
+
|
|
1994
|
+
template <typename K, typename M, typename H, typename E, typename A>
|
|
1995
|
+
bool operator==(
|
|
1996
|
+
F14NodeMap<K, M, H, E, A> const& lhs,
|
|
1997
|
+
F14NodeMap<K, M, H, E, A> const& rhs) {
|
|
1998
|
+
return mapsEqual(lhs, rhs);
|
|
1999
|
+
}
|
|
2000
|
+
|
|
2001
|
+
template <typename K, typename M, typename H, typename E, typename A>
|
|
2002
|
+
bool operator!=(
|
|
2003
|
+
F14NodeMap<K, M, H, E, A> const& lhs,
|
|
2004
|
+
F14NodeMap<K, M, H, E, A> const& rhs) {
|
|
2005
|
+
return !(lhs == rhs);
|
|
2006
|
+
}
|
|
2007
|
+
|
|
2008
|
+
template <typename K, typename M, typename H, typename E, typename A>
|
|
2009
|
+
bool operator==(
|
|
2010
|
+
F14VectorMap<K, M, H, E, A> const& lhs,
|
|
2011
|
+
F14VectorMap<K, M, H, E, A> const& rhs) {
|
|
2012
|
+
return mapsEqual(lhs, rhs);
|
|
2013
|
+
}
|
|
2014
|
+
|
|
2015
|
+
template <typename K, typename M, typename H, typename E, typename A>
|
|
2016
|
+
bool operator!=(
|
|
2017
|
+
F14VectorMap<K, M, H, E, A> const& lhs,
|
|
2018
|
+
F14VectorMap<K, M, H, E, A> const& rhs) {
|
|
2019
|
+
return !(lhs == rhs);
|
|
2020
|
+
}
|
|
2021
|
+
|
|
2022
|
+
template <typename K, typename M, typename H, typename E, typename A>
|
|
2023
|
+
bool operator==(
|
|
2024
|
+
F14FastMap<K, M, H, E, A> const& lhs,
|
|
2025
|
+
F14FastMap<K, M, H, E, A> const& rhs) {
|
|
2026
|
+
return mapsEqual(lhs, rhs);
|
|
2027
|
+
}
|
|
2028
|
+
|
|
2029
|
+
template <typename K, typename M, typename H, typename E, typename A>
|
|
2030
|
+
bool operator!=(
|
|
2031
|
+
F14FastMap<K, M, H, E, A> const& lhs,
|
|
2032
|
+
F14FastMap<K, M, H, E, A> const& rhs) {
|
|
2033
|
+
return !(lhs == rhs);
|
|
2034
|
+
}
|
|
2035
|
+
|
|
2036
|
+
template <typename K, typename M, typename H, typename E, typename A>
|
|
2037
|
+
void swap(
|
|
2038
|
+
F14ValueMap<K, M, H, E, A>& lhs,
|
|
2039
|
+
F14ValueMap<K, M, H, E, A>& rhs) noexcept(noexcept(lhs.swap(rhs))) {
|
|
2040
|
+
lhs.swap(rhs);
|
|
2041
|
+
}
|
|
2042
|
+
|
|
2043
|
+
template <typename K, typename M, typename H, typename E, typename A>
|
|
2044
|
+
void swap(
|
|
2045
|
+
F14NodeMap<K, M, H, E, A>& lhs,
|
|
2046
|
+
F14NodeMap<K, M, H, E, A>& rhs) noexcept(noexcept(lhs.swap(rhs))) {
|
|
2047
|
+
lhs.swap(rhs);
|
|
2048
|
+
}
|
|
2049
|
+
|
|
2050
|
+
template <typename K, typename M, typename H, typename E, typename A>
|
|
2051
|
+
void swap(
|
|
2052
|
+
F14VectorMap<K, M, H, E, A>& lhs,
|
|
2053
|
+
F14VectorMap<K, M, H, E, A>& rhs) noexcept(noexcept(lhs.swap(rhs))) {
|
|
2054
|
+
lhs.swap(rhs);
|
|
2055
|
+
}
|
|
2056
|
+
|
|
2057
|
+
template <typename K, typename M, typename H, typename E, typename A>
|
|
2058
|
+
void swap(
|
|
2059
|
+
F14FastMap<K, M, H, E, A>& lhs,
|
|
2060
|
+
F14FastMap<K, M, H, E, A>& rhs) noexcept(noexcept(lhs.swap(rhs))) {
|
|
2061
|
+
lhs.swap(rhs);
|
|
2062
|
+
}
|
|
2063
|
+
|
|
2064
|
+
template <
|
|
2065
|
+
typename K,
|
|
2066
|
+
typename M,
|
|
2067
|
+
typename H,
|
|
2068
|
+
typename E,
|
|
2069
|
+
typename A,
|
|
2070
|
+
typename Pred>
|
|
2071
|
+
std::size_t erase_if(F14ValueMap<K, M, H, E, A>& c, Pred pred) {
|
|
2072
|
+
return f14::detail::erase_if_impl(c, pred);
|
|
2073
|
+
}
|
|
2074
|
+
|
|
2075
|
+
template <
|
|
2076
|
+
typename K,
|
|
2077
|
+
typename M,
|
|
2078
|
+
typename H,
|
|
2079
|
+
typename E,
|
|
2080
|
+
typename A,
|
|
2081
|
+
typename Pred>
|
|
2082
|
+
std::size_t erase_if(F14NodeMap<K, M, H, E, A>& c, Pred pred) {
|
|
2083
|
+
return f14::detail::erase_if_impl(c, pred);
|
|
2084
|
+
}
|
|
2085
|
+
|
|
2086
|
+
template <
|
|
2087
|
+
typename K,
|
|
2088
|
+
typename M,
|
|
2089
|
+
typename H,
|
|
2090
|
+
typename E,
|
|
2091
|
+
typename A,
|
|
2092
|
+
typename Pred>
|
|
2093
|
+
std::size_t erase_if(F14VectorMap<K, M, H, E, A>& c, Pred pred) {
|
|
2094
|
+
return f14::detail::erase_if_impl(c, pred);
|
|
2095
|
+
}
|
|
2096
|
+
|
|
2097
|
+
template <
|
|
2098
|
+
typename K,
|
|
2099
|
+
typename M,
|
|
2100
|
+
typename H,
|
|
2101
|
+
typename E,
|
|
2102
|
+
typename A,
|
|
2103
|
+
typename Pred>
|
|
2104
|
+
std::size_t erase_if(F14FastMap<K, M, H, E, A>& c, Pred pred) {
|
|
2105
|
+
return f14::detail::erase_if_impl(c, pred);
|
|
2106
|
+
}
|
|
2107
|
+
|
|
2108
|
+
} // namespace folly
|