react-native-windows 0.81.34 → 0.81.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Directory.Build.props +1 -16
- package/Folly/ThreadNameStub.cpp +4 -6
- package/Microsoft.ReactNative/Fabric/Composition/BorderPrimitive.cpp +1 -1
- package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.cpp +27 -4
- package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp +8 -4
- package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +7 -3
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +1 -7
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj.filters +0 -3
- package/PropertySheets/Generated/PackageVersion.g.props +3 -3
- package/PropertySheets/React.Cpp.props +3 -3
- package/ReactCommon/ReactCommon.vcxproj +0 -10
- package/ReactCommon/packages.lock.win32.json +0 -10
- package/Scripts/Tfs/Layout-Desktop-Headers.ps1 +4 -37
- package/Shared/Shared.vcxitems +2 -0
- package/{Folly → external}/.clang-format +0 -1
- package/external/External.vcxitems +10 -0
- package/external/fast-float/.syncignore +11 -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/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 +12 -0
- package/external/fmt/CONTRIBUTING.md +20 -0
- package/external/fmt/LICENSE +27 -0
- package/{fmt → external/fmt}/cgmanifest.json +1 -1
- package/external/fmt/fmt.vcxitems +28 -0
- package/external/fmt/include/fmt/args.h +228 -0
- package/{fmt/TEMP_UntilFmtUpdate/core.h → external/fmt/include/fmt/base.h} +1188 -1036
- 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 +61 -0
- package/external/folly/LICENSE +200 -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/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/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/hash/SpookyHashV2.h +6 -1
- 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/sync-config.json +8 -0
- package/package.json +3 -3
- package/template/cpp-app/proj/MyApp.sln +0 -33
- package/template/cpp-lib/proj/MyLib.sln +0 -33
- package/template/cs-app/proj/MyApp.sln +0 -33
- package/template/cs-lib/proj/MyLib.sln +0 -33
- package/templates/cpp-app/windows/MyApp.sln +0 -33
- package/templates/cpp-lib/windows/MyLib.sln +0 -33
- package/Folly/Folly.vcxproj +0 -383
- package/Folly/Folly.vcxproj.filters +0 -558
- package/Folly/Folly.win32.vcxproj +0 -11
- package/Folly/packages.lock.win32.json +0 -20
- package/fmt/fmt.vcxproj +0 -163
- package/fmt/fmt.vcxproj.filters +0 -59
- package/fmt/fmt.win32.vcxproj +0 -10
- package/fmt/pch.cpp +0 -4
- package/fmt/pch.h +0 -2
- /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,1711 @@
|
|
|
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
|
+
/*
|
|
18
|
+
* Nicholas Ormrod (njormrod)
|
|
19
|
+
* Andrei Alexandrescu (aalexandre)
|
|
20
|
+
*
|
|
21
|
+
* FBVector is Facebook's drop-in implementation of std::vector. It has special
|
|
22
|
+
* optimizations for use with relocatable types and jemalloc.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
#pragma once
|
|
26
|
+
|
|
27
|
+
//=============================================================================
|
|
28
|
+
// headers
|
|
29
|
+
|
|
30
|
+
#include <algorithm>
|
|
31
|
+
#include <cassert>
|
|
32
|
+
#include <iterator>
|
|
33
|
+
#include <memory>
|
|
34
|
+
#include <stdexcept>
|
|
35
|
+
#include <type_traits>
|
|
36
|
+
#include <utility>
|
|
37
|
+
|
|
38
|
+
#include <folly/FormatTraits.h>
|
|
39
|
+
#include <folly/Likely.h>
|
|
40
|
+
#include <folly/ScopeGuard.h>
|
|
41
|
+
#include <folly/Traits.h>
|
|
42
|
+
#include <folly/lang/CheckedMath.h>
|
|
43
|
+
#include <folly/lang/Exception.h>
|
|
44
|
+
#include <folly/lang/Hint.h>
|
|
45
|
+
#include <folly/memory/Malloc.h>
|
|
46
|
+
|
|
47
|
+
//=============================================================================
|
|
48
|
+
// forward declaration
|
|
49
|
+
|
|
50
|
+
namespace folly {
|
|
51
|
+
template <class T, class Allocator = std::allocator<T>>
|
|
52
|
+
class fbvector;
|
|
53
|
+
} // namespace folly
|
|
54
|
+
|
|
55
|
+
//=============================================================================
|
|
56
|
+
// unrolling
|
|
57
|
+
|
|
58
|
+
#define FOLLY_FBV_UNROLL_PTR(first, last, OP) \
|
|
59
|
+
do { \
|
|
60
|
+
for (; (last) - (first) >= 4; (first) += 4) { \
|
|
61
|
+
OP(((first) + 0)); \
|
|
62
|
+
OP(((first) + 1)); \
|
|
63
|
+
OP(((first) + 2)); \
|
|
64
|
+
OP(((first) + 3)); \
|
|
65
|
+
} \
|
|
66
|
+
for (; (first) != (last); ++(first)) \
|
|
67
|
+
OP((first)); \
|
|
68
|
+
} while (0)
|
|
69
|
+
|
|
70
|
+
//=============================================================================
|
|
71
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
72
|
+
// //
|
|
73
|
+
// fbvector class //
|
|
74
|
+
// //
|
|
75
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
76
|
+
|
|
77
|
+
namespace folly {
|
|
78
|
+
|
|
79
|
+
namespace detail {
|
|
80
|
+
inline void* thunk_return_nullptr() {
|
|
81
|
+
return nullptr;
|
|
82
|
+
}
|
|
83
|
+
} // namespace detail
|
|
84
|
+
|
|
85
|
+
template <class T, class Allocator>
|
|
86
|
+
class fbvector {
|
|
87
|
+
//===========================================================================
|
|
88
|
+
//---------------------------------------------------------------------------
|
|
89
|
+
// implementation
|
|
90
|
+
private:
|
|
91
|
+
typedef std::allocator_traits<Allocator> A;
|
|
92
|
+
|
|
93
|
+
struct Impl : public Allocator {
|
|
94
|
+
// typedefs
|
|
95
|
+
typedef typename A::pointer pointer;
|
|
96
|
+
typedef typename A::size_type size_type;
|
|
97
|
+
|
|
98
|
+
// data
|
|
99
|
+
pointer b_, e_, z_;
|
|
100
|
+
|
|
101
|
+
// constructors
|
|
102
|
+
Impl() : Allocator(), b_(nullptr), e_(nullptr), z_(nullptr) {}
|
|
103
|
+
/* implicit */ Impl(const Allocator& alloc)
|
|
104
|
+
: Allocator(alloc), b_(nullptr), e_(nullptr), z_(nullptr) {}
|
|
105
|
+
/* implicit */ Impl(Allocator&& alloc)
|
|
106
|
+
: Allocator(std::move(alloc)), b_(nullptr), e_(nullptr), z_(nullptr) {}
|
|
107
|
+
|
|
108
|
+
/* implicit */ Impl(size_type n, const Allocator& alloc = Allocator())
|
|
109
|
+
: Allocator(alloc) {
|
|
110
|
+
init(n);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
Impl(Impl&& other) noexcept
|
|
114
|
+
: Allocator(std::move(other)),
|
|
115
|
+
b_(other.b_),
|
|
116
|
+
e_(other.e_),
|
|
117
|
+
z_(other.z_) {
|
|
118
|
+
other.b_ = other.e_ = other.z_ = nullptr;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// destructor
|
|
122
|
+
~Impl() { destroy(); }
|
|
123
|
+
|
|
124
|
+
// allocation
|
|
125
|
+
// note that 'allocate' and 'deallocate' are inherited from Allocator
|
|
126
|
+
T* D_allocate(size_type n) {
|
|
127
|
+
if (usingStdAllocator) {
|
|
128
|
+
return static_cast<T*>(checkedMalloc(n * sizeof(T)));
|
|
129
|
+
} else {
|
|
130
|
+
return std::allocator_traits<Allocator>::allocate(*this, n);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
void D_deallocate(T* p, size_type n) noexcept {
|
|
135
|
+
if (usingStdAllocator) {
|
|
136
|
+
free(p);
|
|
137
|
+
} else {
|
|
138
|
+
std::allocator_traits<Allocator>::deallocate(*this, p, n);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// helpers
|
|
143
|
+
void swapData(Impl& other) {
|
|
144
|
+
std::swap(b_, other.b_);
|
|
145
|
+
std::swap(e_, other.e_);
|
|
146
|
+
std::swap(z_, other.z_);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// data ops
|
|
150
|
+
inline void destroy() noexcept {
|
|
151
|
+
if (b_) {
|
|
152
|
+
// THIS DISPATCH CODE IS DUPLICATED IN fbvector::D_destroy_range_a.
|
|
153
|
+
// It has been inlined here for speed. It calls the static fbvector
|
|
154
|
+
// methods to perform the actual destruction.
|
|
155
|
+
if (usingStdAllocator) {
|
|
156
|
+
S_destroy_range(b_, e_);
|
|
157
|
+
} else {
|
|
158
|
+
S_destroy_range_a(*this, b_, e_);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
D_deallocate(b_, size_type(z_ - b_));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
void init(size_type n) {
|
|
166
|
+
if (FOLLY_UNLIKELY(n == 0)) {
|
|
167
|
+
b_ = e_ = z_ = nullptr;
|
|
168
|
+
} else {
|
|
169
|
+
size_type sz = folly::goodMallocSize(n * sizeof(T)) / sizeof(T);
|
|
170
|
+
b_ = D_allocate(sz);
|
|
171
|
+
e_ = b_;
|
|
172
|
+
z_ = b_ + sz;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
void set(pointer newB, size_type newSize, size_type newCap) {
|
|
177
|
+
z_ = newB + newCap;
|
|
178
|
+
e_ = newB + newSize;
|
|
179
|
+
b_ = newB;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
void reset(size_type newCap) {
|
|
183
|
+
destroy();
|
|
184
|
+
auto rollback = makeGuard([&] { init(0); });
|
|
185
|
+
init(newCap);
|
|
186
|
+
rollback.dismiss();
|
|
187
|
+
}
|
|
188
|
+
void reset() { // same as reset(0)
|
|
189
|
+
destroy();
|
|
190
|
+
b_ = e_ = z_ = nullptr;
|
|
191
|
+
}
|
|
192
|
+
} impl_;
|
|
193
|
+
|
|
194
|
+
static void swap(Impl& a, Impl& b) {
|
|
195
|
+
using std::swap;
|
|
196
|
+
if (!usingStdAllocator) {
|
|
197
|
+
swap(static_cast<Allocator&>(a), static_cast<Allocator&>(b));
|
|
198
|
+
}
|
|
199
|
+
a.swapData(b);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
//===========================================================================
|
|
203
|
+
//---------------------------------------------------------------------------
|
|
204
|
+
// types and constants
|
|
205
|
+
public:
|
|
206
|
+
typedef T value_type;
|
|
207
|
+
typedef value_type& reference;
|
|
208
|
+
typedef const value_type& const_reference;
|
|
209
|
+
typedef T* iterator;
|
|
210
|
+
typedef const T* const_iterator;
|
|
211
|
+
typedef size_t size_type;
|
|
212
|
+
typedef typename std::make_signed<size_type>::type difference_type;
|
|
213
|
+
typedef Allocator allocator_type;
|
|
214
|
+
typedef typename A::pointer pointer;
|
|
215
|
+
typedef typename A::const_pointer const_pointer;
|
|
216
|
+
typedef std::reverse_iterator<iterator> reverse_iterator;
|
|
217
|
+
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
|
218
|
+
|
|
219
|
+
private:
|
|
220
|
+
static constexpr bool should_pass_by_value =
|
|
221
|
+
std::is_trivially_copyable<T>::value &&
|
|
222
|
+
sizeof(T) <= 16; // don't force large structures to be passed by value
|
|
223
|
+
typedef typename std::conditional<should_pass_by_value, T, const T&>::type VT;
|
|
224
|
+
typedef typename std::conditional<should_pass_by_value, T, T&&>::type MT;
|
|
225
|
+
|
|
226
|
+
static constexpr bool usingStdAllocator =
|
|
227
|
+
std::is_same<Allocator, std::allocator<T>>::value;
|
|
228
|
+
typedef std::bool_constant<
|
|
229
|
+
usingStdAllocator || A::propagate_on_container_move_assignment::value>
|
|
230
|
+
moveIsSwap;
|
|
231
|
+
|
|
232
|
+
//===========================================================================
|
|
233
|
+
//---------------------------------------------------------------------------
|
|
234
|
+
// allocator helpers
|
|
235
|
+
|
|
236
|
+
//---------------------------------------------------------------------------
|
|
237
|
+
// allocate
|
|
238
|
+
|
|
239
|
+
T* M_allocate(size_type n) { return impl_.D_allocate(n); }
|
|
240
|
+
|
|
241
|
+
//---------------------------------------------------------------------------
|
|
242
|
+
// deallocate
|
|
243
|
+
|
|
244
|
+
void M_deallocate(T* p, size_type n) noexcept { impl_.D_deallocate(p, n); }
|
|
245
|
+
|
|
246
|
+
//---------------------------------------------------------------------------
|
|
247
|
+
// construct
|
|
248
|
+
|
|
249
|
+
// GCC is very sensitive to the exact way that construct is called. For
|
|
250
|
+
// that reason there are several different specializations of construct.
|
|
251
|
+
|
|
252
|
+
template <typename U, typename... Args>
|
|
253
|
+
void M_construct(U* p, Args&&... args) {
|
|
254
|
+
if (usingStdAllocator) {
|
|
255
|
+
new (p) U(std::forward<Args>(args)...);
|
|
256
|
+
} else {
|
|
257
|
+
std::allocator_traits<Allocator>::construct(
|
|
258
|
+
impl_, p, std::forward<Args>(args)...);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
template <typename U, typename... Args>
|
|
263
|
+
static void S_construct(U* p, Args&&... args) {
|
|
264
|
+
new (p) U(std::forward<Args>(args)...);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
template <typename U, typename... Args>
|
|
268
|
+
static void S_construct_a(Allocator& a, U* p, Args&&... args) {
|
|
269
|
+
std::allocator_traits<Allocator>::construct(
|
|
270
|
+
a, p, std::forward<Args>(args)...);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// scalar optimization
|
|
274
|
+
// TODO we can expand this optimization to: default copyable and assignable
|
|
275
|
+
template <
|
|
276
|
+
typename U,
|
|
277
|
+
typename Enable = typename std::enable_if<std::is_scalar<U>::value>::type>
|
|
278
|
+
void M_construct(U* p, U arg) {
|
|
279
|
+
if (usingStdAllocator) {
|
|
280
|
+
*p = arg;
|
|
281
|
+
} else {
|
|
282
|
+
std::allocator_traits<Allocator>::construct(impl_, p, arg);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
template <
|
|
287
|
+
typename U,
|
|
288
|
+
typename Enable = typename std::enable_if<std::is_scalar<U>::value>::type>
|
|
289
|
+
static void S_construct(U* p, U arg) {
|
|
290
|
+
*p = arg;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
template <
|
|
294
|
+
typename U,
|
|
295
|
+
typename Enable = typename std::enable_if<std::is_scalar<U>::value>::type>
|
|
296
|
+
static void S_construct_a(Allocator& a, U* p, U arg) {
|
|
297
|
+
std::allocator_traits<Allocator>::construct(a, p, arg);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// const& optimization
|
|
301
|
+
template <
|
|
302
|
+
typename U,
|
|
303
|
+
typename Enable =
|
|
304
|
+
typename std::enable_if<!std::is_scalar<U>::value>::type>
|
|
305
|
+
void M_construct(U* p, const U& value) {
|
|
306
|
+
if (usingStdAllocator) {
|
|
307
|
+
new (p) U(value);
|
|
308
|
+
} else {
|
|
309
|
+
std::allocator_traits<Allocator>::construct(impl_, p, value);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
template <
|
|
314
|
+
typename U,
|
|
315
|
+
typename Enable =
|
|
316
|
+
typename std::enable_if<!std::is_scalar<U>::value>::type>
|
|
317
|
+
static void S_construct(U* p, const U& value) {
|
|
318
|
+
new (p) U(value);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
template <
|
|
322
|
+
typename U,
|
|
323
|
+
typename Enable =
|
|
324
|
+
typename std::enable_if<!std::is_scalar<U>::value>::type>
|
|
325
|
+
static void S_construct_a(Allocator& a, U* p, const U& value) {
|
|
326
|
+
std::allocator_traits<Allocator>::construct(a, p, value);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
//---------------------------------------------------------------------------
|
|
330
|
+
// destroy
|
|
331
|
+
|
|
332
|
+
void M_destroy(T* p) noexcept {
|
|
333
|
+
if (usingStdAllocator) {
|
|
334
|
+
if (!std::is_trivially_destructible<T>::value) {
|
|
335
|
+
p->~T();
|
|
336
|
+
}
|
|
337
|
+
} else {
|
|
338
|
+
std::allocator_traits<Allocator>::destroy(impl_, p);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
//===========================================================================
|
|
343
|
+
//---------------------------------------------------------------------------
|
|
344
|
+
// algorithmic helpers
|
|
345
|
+
private:
|
|
346
|
+
//---------------------------------------------------------------------------
|
|
347
|
+
// destroy_range
|
|
348
|
+
|
|
349
|
+
// wrappers
|
|
350
|
+
void M_destroy_range_e(T* pos) noexcept {
|
|
351
|
+
D_destroy_range_a(pos, impl_.e_);
|
|
352
|
+
impl_.e_ = pos;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// dispatch
|
|
356
|
+
// THIS DISPATCH CODE IS DUPLICATED IN IMPL. SEE IMPL FOR DETAILS.
|
|
357
|
+
void D_destroy_range_a(T* first, T* last) noexcept {
|
|
358
|
+
if (usingStdAllocator) {
|
|
359
|
+
S_destroy_range(first, last);
|
|
360
|
+
} else {
|
|
361
|
+
S_destroy_range_a(impl_, first, last);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// allocator
|
|
366
|
+
static void S_destroy_range_a(Allocator& a, T* first, T* last) noexcept {
|
|
367
|
+
for (; first != last; ++first) {
|
|
368
|
+
std::allocator_traits<Allocator>::destroy(a, first);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// optimized
|
|
373
|
+
static void S_destroy_range(T* first, T* last) noexcept {
|
|
374
|
+
if (!std::is_trivially_destructible<T>::value) {
|
|
375
|
+
#define FOLLY_FBV_OP(p) (p)->~T()
|
|
376
|
+
// EXPERIMENTAL DATA on fbvector<vector<int>> (where each vector<int> has
|
|
377
|
+
// size 0), were vector<int> to be relocatable.
|
|
378
|
+
// The unrolled version seems to work faster for small to medium sized
|
|
379
|
+
// fbvectors. It gets a 10% speedup on fbvectors of size 1024, 64, and
|
|
380
|
+
// 16.
|
|
381
|
+
// The simple loop version seems to work faster for large fbvectors. The
|
|
382
|
+
// unrolled version is about 6% slower on fbvectors on size 16384.
|
|
383
|
+
// The two methods seem tied for very large fbvectors. The unrolled
|
|
384
|
+
// version is about 0.5% slower on size 262144.
|
|
385
|
+
|
|
386
|
+
// for (; first != last; ++first) first->~T();
|
|
387
|
+
FOLLY_FBV_UNROLL_PTR(first, last, FOLLY_FBV_OP);
|
|
388
|
+
#undef FOLLY_FBV_OP
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
//---------------------------------------------------------------------------
|
|
393
|
+
// uninitialized_fill_n
|
|
394
|
+
|
|
395
|
+
// wrappers
|
|
396
|
+
void M_uninitialized_fill_n_e(size_type sz) {
|
|
397
|
+
D_uninitialized_fill_n_a(impl_.e_, sz);
|
|
398
|
+
impl_.e_ += sz;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
void M_uninitialized_fill_n_e(size_type sz, VT value) {
|
|
402
|
+
D_uninitialized_fill_n_a(impl_.e_, sz, value);
|
|
403
|
+
impl_.e_ += sz;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
// dispatch
|
|
407
|
+
void D_uninitialized_fill_n_a(T* dest, size_type sz) {
|
|
408
|
+
if (usingStdAllocator) {
|
|
409
|
+
S_uninitialized_fill_n(dest, sz);
|
|
410
|
+
} else {
|
|
411
|
+
S_uninitialized_fill_n_a(impl_, dest, sz);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
void D_uninitialized_fill_n_a(T* dest, size_type sz, VT value) {
|
|
416
|
+
if (usingStdAllocator) {
|
|
417
|
+
S_uninitialized_fill_n(dest, sz, value);
|
|
418
|
+
} else {
|
|
419
|
+
S_uninitialized_fill_n_a(impl_, dest, sz, value);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// allocator
|
|
424
|
+
template <typename... Args>
|
|
425
|
+
static void S_uninitialized_fill_n_a(
|
|
426
|
+
Allocator& a, T* dest, size_type sz, Args&&... args) {
|
|
427
|
+
auto b = dest;
|
|
428
|
+
T* e = nullptr;
|
|
429
|
+
if (!folly::checked_add(&e, dest, sz)) {
|
|
430
|
+
throw_exception<std::length_error>("FBVector exceeded max size.");
|
|
431
|
+
}
|
|
432
|
+
auto rollback = makeGuard([&] { S_destroy_range_a(a, dest, b); });
|
|
433
|
+
for (; b != e; ++b) {
|
|
434
|
+
std::allocator_traits<Allocator>::construct(
|
|
435
|
+
a, b, std::forward<Args>(args)...);
|
|
436
|
+
}
|
|
437
|
+
rollback.dismiss();
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// optimized
|
|
441
|
+
static void S_uninitialized_fill_n(T* dest, size_type n) {
|
|
442
|
+
if (folly::IsZeroInitializable<T>::value) {
|
|
443
|
+
if (FOLLY_LIKELY(n != 0)) {
|
|
444
|
+
T* sz = nullptr;
|
|
445
|
+
if (!folly::checked_add(&sz, dest, n)) {
|
|
446
|
+
throw_exception<std::length_error>("FBVector exceeded max size.");
|
|
447
|
+
}
|
|
448
|
+
std::memset((void*)dest, 0, sizeof(T) * n);
|
|
449
|
+
}
|
|
450
|
+
} else {
|
|
451
|
+
auto b = dest;
|
|
452
|
+
T* e = nullptr;
|
|
453
|
+
if (!folly::checked_add(&e, dest, n)) {
|
|
454
|
+
throw_exception<std::length_error>("FBVector exceeded max size.");
|
|
455
|
+
}
|
|
456
|
+
auto rollback = makeGuard([&] {
|
|
457
|
+
--b;
|
|
458
|
+
for (; b >= dest; --b) {
|
|
459
|
+
b->~T();
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
for (; b != e; ++b) {
|
|
463
|
+
S_construct(b);
|
|
464
|
+
}
|
|
465
|
+
rollback.dismiss();
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
static void S_uninitialized_fill_n(T* dest, size_type n, const T& value) {
|
|
470
|
+
auto b = dest;
|
|
471
|
+
T* e = nullptr;
|
|
472
|
+
if (!folly::checked_add(&e, dest, n)) {
|
|
473
|
+
throw_exception<std::length_error>("FBVector exceeded max size.");
|
|
474
|
+
}
|
|
475
|
+
auto rollback = makeGuard([&] { S_destroy_range(dest, b); });
|
|
476
|
+
for (; b != e; ++b) {
|
|
477
|
+
S_construct(b, value);
|
|
478
|
+
}
|
|
479
|
+
rollback.dismiss();
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
//---------------------------------------------------------------------------
|
|
483
|
+
// uninitialized_copy
|
|
484
|
+
|
|
485
|
+
// it is possible to add an optimization for the case where
|
|
486
|
+
// It = move(T*) and IsRelocatable<T> and Is0Initializeable<T>
|
|
487
|
+
|
|
488
|
+
// wrappers
|
|
489
|
+
template <typename It>
|
|
490
|
+
void M_uninitialized_copy_e(It first, It last) {
|
|
491
|
+
D_uninitialized_copy_a(impl_.e_, first, last);
|
|
492
|
+
impl_.e_ += std::distance(first, last);
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
template <typename It>
|
|
496
|
+
void M_uninitialized_move_e(It first, It last) {
|
|
497
|
+
D_uninitialized_move_a(impl_.e_, first, last);
|
|
498
|
+
impl_.e_ += std::distance(first, last);
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// dispatch
|
|
502
|
+
template <typename It>
|
|
503
|
+
void D_uninitialized_copy_a(T* dest, It first, It last) {
|
|
504
|
+
if (usingStdAllocator) {
|
|
505
|
+
if (std::is_trivially_copyable<T>::value) {
|
|
506
|
+
S_uninitialized_copy_bits(dest, first, last);
|
|
507
|
+
} else {
|
|
508
|
+
S_uninitialized_copy(dest, first, last);
|
|
509
|
+
}
|
|
510
|
+
} else {
|
|
511
|
+
S_uninitialized_copy_a(impl_, dest, first, last);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
template <typename It>
|
|
516
|
+
void D_uninitialized_move_a(T* dest, It first, It last) {
|
|
517
|
+
D_uninitialized_copy_a(
|
|
518
|
+
dest, std::make_move_iterator(first), std::make_move_iterator(last));
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
// allocator
|
|
522
|
+
template <typename It>
|
|
523
|
+
static void S_uninitialized_copy_a(Allocator& a, T* dest, It first, It last) {
|
|
524
|
+
auto b = dest;
|
|
525
|
+
auto rollback = makeGuard([&] { S_destroy_range_a(a, dest, b); });
|
|
526
|
+
for (; first != last; ++first, ++b) {
|
|
527
|
+
std::allocator_traits<Allocator>::construct(a, b, *first);
|
|
528
|
+
}
|
|
529
|
+
rollback.dismiss();
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// optimized
|
|
533
|
+
template <typename It>
|
|
534
|
+
static void S_uninitialized_copy(T* dest, It first, It last) {
|
|
535
|
+
auto b = dest;
|
|
536
|
+
auto rollback = makeGuard([&] { S_destroy_range(dest, b); });
|
|
537
|
+
for (; first != last; ++first, ++b) {
|
|
538
|
+
S_construct(b, *first);
|
|
539
|
+
}
|
|
540
|
+
rollback.dismiss();
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
static void S_uninitialized_copy_bits(
|
|
544
|
+
T* dest, const T* first, const T* last) {
|
|
545
|
+
if (last != first) {
|
|
546
|
+
std::memcpy((void*)dest, (void*)first, (last - first) * sizeof(T));
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
static void S_uninitialized_copy_bits(
|
|
551
|
+
T* dest, std::move_iterator<T*> first, std::move_iterator<T*> last) {
|
|
552
|
+
T* bFirst = first.base();
|
|
553
|
+
T* bLast = last.base();
|
|
554
|
+
if (bLast != bFirst) {
|
|
555
|
+
std::memcpy((void*)dest, (void*)bFirst, (bLast - bFirst) * sizeof(T));
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
template <typename It>
|
|
560
|
+
static void S_uninitialized_copy_bits(T* dest, It first, It last) {
|
|
561
|
+
S_uninitialized_copy(dest, first, last);
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
//---------------------------------------------------------------------------
|
|
565
|
+
// copy_n
|
|
566
|
+
|
|
567
|
+
// This function is "unsafe": it assumes that the iterator can be advanced at
|
|
568
|
+
// least n times. However, as a private function, that unsafety is managed
|
|
569
|
+
// wholly by fbvector itself.
|
|
570
|
+
|
|
571
|
+
template <typename It>
|
|
572
|
+
static It S_copy_n(T* dest, It first, size_type n) {
|
|
573
|
+
auto e = dest + n;
|
|
574
|
+
for (; dest != e; ++dest, ++first) {
|
|
575
|
+
*dest = *first;
|
|
576
|
+
}
|
|
577
|
+
return first;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
static const T* S_copy_n(T* dest, const T* first, size_type n) {
|
|
581
|
+
if (std::is_trivially_copyable<T>::value) {
|
|
582
|
+
std::memcpy((void*)dest, (void*)first, n * sizeof(T));
|
|
583
|
+
return first + n;
|
|
584
|
+
} else {
|
|
585
|
+
return S_copy_n<const T*>(dest, first, n);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
static std::move_iterator<T*> S_copy_n(
|
|
590
|
+
T* dest, std::move_iterator<T*> mIt, size_type n) {
|
|
591
|
+
if (std::is_trivially_copyable<T>::value) {
|
|
592
|
+
T* first = mIt.base();
|
|
593
|
+
std::memcpy((void*)dest, (void*)first, n * sizeof(T));
|
|
594
|
+
return std::make_move_iterator(first + n);
|
|
595
|
+
} else {
|
|
596
|
+
return S_copy_n<std::move_iterator<T*>>(dest, mIt, n);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
//===========================================================================
|
|
601
|
+
//---------------------------------------------------------------------------
|
|
602
|
+
// relocation helpers
|
|
603
|
+
private:
|
|
604
|
+
// Relocation is divided into three parts:
|
|
605
|
+
//
|
|
606
|
+
// 1: relocate_move
|
|
607
|
+
// Performs the actual movement of data from point a to point b.
|
|
608
|
+
//
|
|
609
|
+
// 2: relocate_done
|
|
610
|
+
// Destroys the old data.
|
|
611
|
+
//
|
|
612
|
+
// 3: relocate_undo
|
|
613
|
+
// Destoys the new data and restores the old data.
|
|
614
|
+
//
|
|
615
|
+
// The three steps are used because there may be an exception after part 1
|
|
616
|
+
// has completed. If that is the case, then relocate_undo can nullify the
|
|
617
|
+
// initial move. Otherwise, relocate_done performs the last bit of tidying
|
|
618
|
+
// up.
|
|
619
|
+
//
|
|
620
|
+
// The relocation trio may use either memcpy, move, or copy. It is decided
|
|
621
|
+
// by the following case statement:
|
|
622
|
+
//
|
|
623
|
+
// IsRelocatable && usingStdAllocator -> memcpy
|
|
624
|
+
// has_nothrow_move && usingStdAllocator -> move
|
|
625
|
+
// cannot copy -> move
|
|
626
|
+
// default -> copy
|
|
627
|
+
//
|
|
628
|
+
// If the class is non-copyable then it must be movable. However, if the
|
|
629
|
+
// move constructor is not noexcept, i.e. an error could be thrown, then
|
|
630
|
+
// relocate_undo will be unable to restore the old data, for fear of a
|
|
631
|
+
// second exception being thrown. This is a known and unavoidable
|
|
632
|
+
// deficiency. In lieu of a strong exception guarantee, relocate_undo does
|
|
633
|
+
// the next best thing: it provides a weak exception guarantee by
|
|
634
|
+
// destroying the new data, but leaving the old data in an indeterminate
|
|
635
|
+
// state. Note that that indeterminate state will be valid, since the
|
|
636
|
+
// old data has not been destroyed; it has merely been the source of a
|
|
637
|
+
// move, which is required to leave the source in a valid state.
|
|
638
|
+
|
|
639
|
+
// wrappers
|
|
640
|
+
void M_relocate(T* newB) {
|
|
641
|
+
relocate_move(newB, impl_.b_, impl_.e_);
|
|
642
|
+
relocate_done(newB, impl_.b_, impl_.e_);
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
// dispatch type trait
|
|
646
|
+
typedef std::bool_constant<
|
|
647
|
+
folly::IsRelocatable<T>::value && usingStdAllocator>
|
|
648
|
+
relocate_use_memcpy;
|
|
649
|
+
|
|
650
|
+
typedef std::bool_constant<
|
|
651
|
+
(std::is_nothrow_move_constructible<T>::value && usingStdAllocator) ||
|
|
652
|
+
!std::is_copy_constructible<T>::value>
|
|
653
|
+
relocate_use_move;
|
|
654
|
+
|
|
655
|
+
// move
|
|
656
|
+
void relocate_move(T* dest, T* first, T* last) {
|
|
657
|
+
relocate_move_or_memcpy(dest, first, last, relocate_use_memcpy());
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
void relocate_move_or_memcpy(T* dest, T* first, T* last, std::true_type) {
|
|
661
|
+
if (first != nullptr) {
|
|
662
|
+
std::memcpy((void*)dest, (void*)first, (last - first) * sizeof(T));
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
void relocate_move_or_memcpy(T* dest, T* first, T* last, std::false_type) {
|
|
667
|
+
relocate_move_or_copy(dest, first, last, relocate_use_move());
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
void relocate_move_or_copy(T* dest, T* first, T* last, std::true_type) {
|
|
671
|
+
D_uninitialized_move_a(dest, first, last);
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
void relocate_move_or_copy(T* dest, T* first, T* last, std::false_type) {
|
|
675
|
+
D_uninitialized_copy_a(dest, first, last);
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
// done
|
|
679
|
+
void relocate_done(T* /*dest*/, T* first, T* last) noexcept {
|
|
680
|
+
if (folly::IsRelocatable<T>::value && usingStdAllocator) {
|
|
681
|
+
// used memcpy; data has been relocated, do not call destructor
|
|
682
|
+
} else {
|
|
683
|
+
D_destroy_range_a(first, last);
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
// undo
|
|
688
|
+
void relocate_undo(T* dest, T* first, T* last) noexcept {
|
|
689
|
+
if (folly::IsRelocatable<T>::value && usingStdAllocator) {
|
|
690
|
+
// used memcpy, old data is still valid, nothing to do
|
|
691
|
+
} else if (
|
|
692
|
+
std::is_nothrow_move_constructible<T>::value && usingStdAllocator) {
|
|
693
|
+
// noexcept move everything back, aka relocate_move
|
|
694
|
+
relocate_move(first, dest, dest + (last - first));
|
|
695
|
+
} else if (!std::is_copy_constructible<T>::value) {
|
|
696
|
+
// weak guarantee
|
|
697
|
+
D_destroy_range_a(dest, dest + (last - first));
|
|
698
|
+
} else {
|
|
699
|
+
// used copy, old data is still valid
|
|
700
|
+
D_destroy_range_a(dest, dest + (last - first));
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
//===========================================================================
|
|
705
|
+
//---------------------------------------------------------------------------
|
|
706
|
+
// construct/copy/destroy
|
|
707
|
+
public:
|
|
708
|
+
fbvector() = default;
|
|
709
|
+
|
|
710
|
+
explicit fbvector(const Allocator& a) : impl_(a) {}
|
|
711
|
+
|
|
712
|
+
explicit fbvector(size_type n, const Allocator& a = Allocator())
|
|
713
|
+
: impl_(n, a) {
|
|
714
|
+
M_uninitialized_fill_n_e(n);
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
fbvector(size_type n, VT value, const Allocator& a = Allocator())
|
|
718
|
+
: impl_(n, a) {
|
|
719
|
+
M_uninitialized_fill_n_e(n, value);
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
template <
|
|
723
|
+
class It,
|
|
724
|
+
class Category = typename std::iterator_traits<It>::iterator_category>
|
|
725
|
+
fbvector(It first, It last, const Allocator& a = Allocator())
|
|
726
|
+
: fbvector(first, last, a, Category()) {}
|
|
727
|
+
|
|
728
|
+
fbvector(const fbvector& other)
|
|
729
|
+
: impl_(
|
|
730
|
+
other.size(),
|
|
731
|
+
A::select_on_container_copy_construction(other.impl_)) {
|
|
732
|
+
M_uninitialized_copy_e(other.begin(), other.end());
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
fbvector(fbvector&& other) noexcept : impl_(std::move(other.impl_)) {}
|
|
736
|
+
|
|
737
|
+
fbvector(const fbvector& other, const Allocator& a)
|
|
738
|
+
: fbvector(other.begin(), other.end(), a) {}
|
|
739
|
+
|
|
740
|
+
/* may throw */ fbvector(fbvector&& other, const Allocator& a) : impl_(a) {
|
|
741
|
+
if (impl_ == other.impl_) {
|
|
742
|
+
impl_.swapData(other.impl_);
|
|
743
|
+
} else {
|
|
744
|
+
impl_.init(other.size());
|
|
745
|
+
M_uninitialized_move_e(other.begin(), other.end());
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
fbvector(std::initializer_list<T> il, const Allocator& a = Allocator())
|
|
750
|
+
: fbvector(il.begin(), il.end(), a) {}
|
|
751
|
+
|
|
752
|
+
~fbvector() = default; // the cleanup occurs in impl_
|
|
753
|
+
|
|
754
|
+
fbvector& operator=(const fbvector& other) {
|
|
755
|
+
if (FOLLY_UNLIKELY(this == &other)) {
|
|
756
|
+
return *this;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
if (!usingStdAllocator &&
|
|
760
|
+
A::propagate_on_container_copy_assignment::value) {
|
|
761
|
+
if (impl_ != other.impl_) {
|
|
762
|
+
// can't use other's different allocator to clean up self
|
|
763
|
+
impl_.reset();
|
|
764
|
+
}
|
|
765
|
+
(Allocator&)impl_ = (Allocator&)other.impl_;
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
assign(other.begin(), other.end());
|
|
769
|
+
return *this;
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
fbvector& operator=(fbvector&& other) {
|
|
773
|
+
if (FOLLY_UNLIKELY(this == &other)) {
|
|
774
|
+
return *this;
|
|
775
|
+
}
|
|
776
|
+
moveFrom(std::move(other), moveIsSwap());
|
|
777
|
+
return *this;
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
fbvector& operator=(std::initializer_list<T> il) {
|
|
781
|
+
assign(il.begin(), il.end());
|
|
782
|
+
return *this;
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
template <
|
|
786
|
+
class It,
|
|
787
|
+
class Category = typename std::iterator_traits<It>::iterator_category>
|
|
788
|
+
void assign(It first, It last) {
|
|
789
|
+
assign(first, last, Category());
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
void assign(size_type n, VT value) {
|
|
793
|
+
if (n > capacity()) {
|
|
794
|
+
// Not enough space. Do not reserve in place, since we will
|
|
795
|
+
// discard the old values anyways.
|
|
796
|
+
if (dataIsInternalAndNotVT(value)) {
|
|
797
|
+
T copy(std::move(value));
|
|
798
|
+
impl_.reset(n);
|
|
799
|
+
M_uninitialized_fill_n_e(n, copy);
|
|
800
|
+
} else {
|
|
801
|
+
impl_.reset(n);
|
|
802
|
+
M_uninitialized_fill_n_e(n, value);
|
|
803
|
+
}
|
|
804
|
+
} else if (n <= size()) {
|
|
805
|
+
auto newE = impl_.b_ + n;
|
|
806
|
+
std::fill(impl_.b_, newE, value);
|
|
807
|
+
M_destroy_range_e(newE);
|
|
808
|
+
} else {
|
|
809
|
+
std::fill(impl_.b_, impl_.e_, value);
|
|
810
|
+
M_uninitialized_fill_n_e(n - size(), value);
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
void assign(std::initializer_list<T> il) { assign(il.begin(), il.end()); }
|
|
815
|
+
|
|
816
|
+
allocator_type get_allocator() const noexcept { return impl_; }
|
|
817
|
+
|
|
818
|
+
private:
|
|
819
|
+
// contract dispatch for iterator types fbvector(It first, It last)
|
|
820
|
+
template <class ForwardIterator>
|
|
821
|
+
fbvector(
|
|
822
|
+
ForwardIterator first,
|
|
823
|
+
ForwardIterator last,
|
|
824
|
+
const Allocator& a,
|
|
825
|
+
std::forward_iterator_tag)
|
|
826
|
+
: impl_(size_type(std::distance(first, last)), a) {
|
|
827
|
+
M_uninitialized_copy_e(first, last);
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
template <class InputIterator>
|
|
831
|
+
fbvector(
|
|
832
|
+
InputIterator first,
|
|
833
|
+
InputIterator last,
|
|
834
|
+
const Allocator& a,
|
|
835
|
+
std::input_iterator_tag)
|
|
836
|
+
: impl_(a) {
|
|
837
|
+
for (; first != last; ++first) {
|
|
838
|
+
emplace_back(*first);
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
// contract dispatch for allocator movement in operator=(fbvector&&)
|
|
843
|
+
void moveFrom(fbvector&& other, std::true_type) { swap(impl_, other.impl_); }
|
|
844
|
+
void moveFrom(fbvector&& other, std::false_type) {
|
|
845
|
+
if (impl_ == other.impl_) {
|
|
846
|
+
impl_.swapData(other.impl_);
|
|
847
|
+
} else {
|
|
848
|
+
impl_.reset(other.size());
|
|
849
|
+
M_uninitialized_move_e(other.begin(), other.end());
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
// contract dispatch for iterator types in assign(It first, It last)
|
|
854
|
+
template <class ForwardIterator>
|
|
855
|
+
void assign(
|
|
856
|
+
ForwardIterator first, ForwardIterator last, std::forward_iterator_tag) {
|
|
857
|
+
const auto newSize = size_type(std::distance(first, last));
|
|
858
|
+
if (newSize > capacity()) {
|
|
859
|
+
impl_.reset(newSize);
|
|
860
|
+
M_uninitialized_copy_e(first, last);
|
|
861
|
+
} else if (newSize <= size()) {
|
|
862
|
+
auto newEnd = std::copy(first, last, impl_.b_);
|
|
863
|
+
M_destroy_range_e(newEnd);
|
|
864
|
+
} else {
|
|
865
|
+
auto mid = S_copy_n(impl_.b_, first, size());
|
|
866
|
+
M_uninitialized_copy_e<decltype(last)>(mid, last);
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
template <class InputIterator>
|
|
871
|
+
void assign(
|
|
872
|
+
InputIterator first, InputIterator last, std::input_iterator_tag) {
|
|
873
|
+
auto p = impl_.b_;
|
|
874
|
+
for (; first != last && p != impl_.e_; ++first, ++p) {
|
|
875
|
+
*p = *first;
|
|
876
|
+
}
|
|
877
|
+
if (p != impl_.e_) {
|
|
878
|
+
M_destroy_range_e(p);
|
|
879
|
+
} else {
|
|
880
|
+
for (; first != last; ++first) {
|
|
881
|
+
emplace_back(*first);
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
// contract dispatch for aliasing under VT optimization
|
|
887
|
+
bool dataIsInternalAndNotVT(const T& t) {
|
|
888
|
+
if (should_pass_by_value) {
|
|
889
|
+
return false;
|
|
890
|
+
}
|
|
891
|
+
return dataIsInternal(t);
|
|
892
|
+
}
|
|
893
|
+
bool dataIsInternal(const T& t) {
|
|
894
|
+
return FOLLY_UNLIKELY(
|
|
895
|
+
impl_.b_ <= std::addressof(t) && std::addressof(t) < impl_.e_);
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
//===========================================================================
|
|
899
|
+
//---------------------------------------------------------------------------
|
|
900
|
+
// iterators
|
|
901
|
+
public:
|
|
902
|
+
iterator begin() noexcept { return impl_.b_; }
|
|
903
|
+
const_iterator begin() const noexcept { return impl_.b_; }
|
|
904
|
+
iterator end() noexcept { return impl_.e_; }
|
|
905
|
+
const_iterator end() const noexcept { return impl_.e_; }
|
|
906
|
+
reverse_iterator rbegin() noexcept { return reverse_iterator(end()); }
|
|
907
|
+
const_reverse_iterator rbegin() const noexcept {
|
|
908
|
+
return const_reverse_iterator(end());
|
|
909
|
+
}
|
|
910
|
+
reverse_iterator rend() noexcept { return reverse_iterator(begin()); }
|
|
911
|
+
const_reverse_iterator rend() const noexcept {
|
|
912
|
+
return const_reverse_iterator(begin());
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
const_iterator cbegin() const noexcept { return impl_.b_; }
|
|
916
|
+
const_iterator cend() const noexcept { return impl_.e_; }
|
|
917
|
+
const_reverse_iterator crbegin() const noexcept {
|
|
918
|
+
return const_reverse_iterator(end());
|
|
919
|
+
}
|
|
920
|
+
const_reverse_iterator crend() const noexcept {
|
|
921
|
+
return const_reverse_iterator(begin());
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
//===========================================================================
|
|
925
|
+
//---------------------------------------------------------------------------
|
|
926
|
+
// capacity
|
|
927
|
+
public:
|
|
928
|
+
size_type size() const noexcept { return size_type(impl_.e_ - impl_.b_); }
|
|
929
|
+
|
|
930
|
+
size_type max_size() const noexcept {
|
|
931
|
+
// good luck gettin' there
|
|
932
|
+
return ~size_type(0);
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
void resize(size_type n) {
|
|
936
|
+
if (n <= size()) {
|
|
937
|
+
M_destroy_range_e(impl_.b_ + n);
|
|
938
|
+
} else {
|
|
939
|
+
reserve(n);
|
|
940
|
+
M_uninitialized_fill_n_e(n - size());
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
void resize(size_type n, VT t) {
|
|
945
|
+
if (n <= size()) {
|
|
946
|
+
M_destroy_range_e(impl_.b_ + n);
|
|
947
|
+
} else if (dataIsInternalAndNotVT(t) && n > capacity()) {
|
|
948
|
+
T copy(t);
|
|
949
|
+
reserve(n);
|
|
950
|
+
M_uninitialized_fill_n_e(n - size(), copy);
|
|
951
|
+
} else {
|
|
952
|
+
reserve(n);
|
|
953
|
+
M_uninitialized_fill_n_e(n - size(), t);
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
size_type capacity() const noexcept { return size_type(impl_.z_ - impl_.b_); }
|
|
958
|
+
|
|
959
|
+
bool empty() const noexcept { return impl_.b_ == impl_.e_; }
|
|
960
|
+
|
|
961
|
+
void reserve(size_type n) {
|
|
962
|
+
if (n <= capacity()) {
|
|
963
|
+
return;
|
|
964
|
+
}
|
|
965
|
+
if (impl_.b_ && reserve_in_place(n)) {
|
|
966
|
+
return;
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
auto newCap = folly::goodMallocSize(n * sizeof(T)) / sizeof(T);
|
|
970
|
+
auto newB = M_allocate(newCap);
|
|
971
|
+
{
|
|
972
|
+
auto rollback = makeGuard([&] { M_deallocate(newB, newCap); });
|
|
973
|
+
M_relocate(newB);
|
|
974
|
+
rollback.dismiss();
|
|
975
|
+
}
|
|
976
|
+
if (impl_.b_) {
|
|
977
|
+
M_deallocate(impl_.b_, size_type(impl_.z_ - impl_.b_));
|
|
978
|
+
}
|
|
979
|
+
impl_.z_ = newB + newCap;
|
|
980
|
+
impl_.e_ = newB + (impl_.e_ - impl_.b_);
|
|
981
|
+
impl_.b_ = newB;
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
void shrink_to_fit() noexcept {
|
|
985
|
+
if (empty()) {
|
|
986
|
+
impl_.reset();
|
|
987
|
+
return;
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
auto const newCapacityBytes = folly::goodMallocSize(size() * sizeof(T));
|
|
991
|
+
auto const newCap = newCapacityBytes / sizeof(T);
|
|
992
|
+
auto const oldCap = capacity();
|
|
993
|
+
|
|
994
|
+
if (newCap >= oldCap) {
|
|
995
|
+
return;
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
void* p = impl_.b_;
|
|
999
|
+
// xallocx() will shrink to precisely newCapacityBytes (which was generated
|
|
1000
|
+
// by goodMallocSize()) if it successfully shrinks in place.
|
|
1001
|
+
if ((usingJEMalloc() && usingStdAllocator) &&
|
|
1002
|
+
newCapacityBytes >= folly::jemallocMinInPlaceExpandable &&
|
|
1003
|
+
xallocx(p, newCapacityBytes, 0, 0) == newCapacityBytes) {
|
|
1004
|
+
impl_.z_ += newCap - oldCap;
|
|
1005
|
+
} else {
|
|
1006
|
+
T* newB = static_cast<T*>(catch_exception(
|
|
1007
|
+
[&] { return M_allocate(newCap); }, //
|
|
1008
|
+
&detail::thunk_return_nullptr));
|
|
1009
|
+
if (!newB) {
|
|
1010
|
+
return;
|
|
1011
|
+
}
|
|
1012
|
+
if (!catch_exception(
|
|
1013
|
+
[&] { return M_relocate(newB), true; },
|
|
1014
|
+
[&] { return M_deallocate(newB, newCap), false; })) {
|
|
1015
|
+
return;
|
|
1016
|
+
}
|
|
1017
|
+
if (impl_.b_) {
|
|
1018
|
+
M_deallocate(impl_.b_, size_type(impl_.z_ - impl_.b_));
|
|
1019
|
+
}
|
|
1020
|
+
impl_.z_ = newB + newCap;
|
|
1021
|
+
impl_.e_ = newB + (impl_.e_ - impl_.b_);
|
|
1022
|
+
impl_.b_ = newB;
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
private:
|
|
1027
|
+
bool reserve_in_place(size_type n) {
|
|
1028
|
+
if (!usingStdAllocator || !usingJEMalloc()) {
|
|
1029
|
+
return false;
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
// jemalloc can never grow in place blocks smaller than 4096 bytes.
|
|
1033
|
+
if ((impl_.z_ - impl_.b_) * sizeof(T) <
|
|
1034
|
+
folly::jemallocMinInPlaceExpandable) {
|
|
1035
|
+
return false;
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
auto const newCapacityBytes = folly::goodMallocSize(n * sizeof(T));
|
|
1039
|
+
void* p = impl_.b_;
|
|
1040
|
+
if (xallocx(p, newCapacityBytes, 0, 0) == newCapacityBytes) {
|
|
1041
|
+
impl_.z_ = impl_.b_ + newCapacityBytes / sizeof(T);
|
|
1042
|
+
return true;
|
|
1043
|
+
}
|
|
1044
|
+
return false;
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
//===========================================================================
|
|
1048
|
+
//---------------------------------------------------------------------------
|
|
1049
|
+
// element access
|
|
1050
|
+
public:
|
|
1051
|
+
reference operator[](size_type n) {
|
|
1052
|
+
assert(n < size());
|
|
1053
|
+
return impl_.b_[n];
|
|
1054
|
+
}
|
|
1055
|
+
const_reference operator[](size_type n) const {
|
|
1056
|
+
assert(n < size());
|
|
1057
|
+
return impl_.b_[n];
|
|
1058
|
+
}
|
|
1059
|
+
const_reference at(size_type n) const {
|
|
1060
|
+
if (FOLLY_UNLIKELY(n >= size())) {
|
|
1061
|
+
throw_exception<std::out_of_range>(
|
|
1062
|
+
"fbvector: index is greater than size.");
|
|
1063
|
+
}
|
|
1064
|
+
return (*this)[n];
|
|
1065
|
+
}
|
|
1066
|
+
reference at(size_type n) {
|
|
1067
|
+
auto const& cThis = *this;
|
|
1068
|
+
return const_cast<reference>(cThis.at(n));
|
|
1069
|
+
}
|
|
1070
|
+
reference front() {
|
|
1071
|
+
assert(!empty());
|
|
1072
|
+
return *impl_.b_;
|
|
1073
|
+
}
|
|
1074
|
+
const_reference front() const {
|
|
1075
|
+
assert(!empty());
|
|
1076
|
+
return *impl_.b_;
|
|
1077
|
+
}
|
|
1078
|
+
reference back() {
|
|
1079
|
+
assert(!empty());
|
|
1080
|
+
return impl_.e_[-1];
|
|
1081
|
+
}
|
|
1082
|
+
const_reference back() const {
|
|
1083
|
+
assert(!empty());
|
|
1084
|
+
return impl_.e_[-1];
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
//===========================================================================
|
|
1088
|
+
//---------------------------------------------------------------------------
|
|
1089
|
+
// data access
|
|
1090
|
+
public:
|
|
1091
|
+
T* data() noexcept { return impl_.b_; }
|
|
1092
|
+
const T* data() const noexcept { return impl_.b_; }
|
|
1093
|
+
|
|
1094
|
+
//===========================================================================
|
|
1095
|
+
//---------------------------------------------------------------------------
|
|
1096
|
+
// modifiers (common)
|
|
1097
|
+
public:
|
|
1098
|
+
template <class... Args>
|
|
1099
|
+
reference emplace_back(Args&&... args) {
|
|
1100
|
+
if (impl_.e_ != impl_.z_) {
|
|
1101
|
+
M_construct(impl_.e_, std::forward<Args>(args)...);
|
|
1102
|
+
++impl_.e_;
|
|
1103
|
+
} else {
|
|
1104
|
+
emplace_back_aux(std::forward<Args>(args)...);
|
|
1105
|
+
}
|
|
1106
|
+
return back();
|
|
1107
|
+
}
|
|
1108
|
+
|
|
1109
|
+
void push_back(const T& value) {
|
|
1110
|
+
if (impl_.e_ != impl_.z_) {
|
|
1111
|
+
M_construct(impl_.e_, value);
|
|
1112
|
+
++impl_.e_;
|
|
1113
|
+
} else {
|
|
1114
|
+
emplace_back_aux(value);
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1118
|
+
void push_back(T&& value) {
|
|
1119
|
+
if (impl_.e_ != impl_.z_) {
|
|
1120
|
+
M_construct(impl_.e_, std::move(value));
|
|
1121
|
+
++impl_.e_;
|
|
1122
|
+
} else {
|
|
1123
|
+
emplace_back_aux(std::move(value));
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
void pop_back() {
|
|
1128
|
+
assert(!empty());
|
|
1129
|
+
--impl_.e_;
|
|
1130
|
+
M_destroy(impl_.e_);
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
void swap(fbvector& other) noexcept {
|
|
1134
|
+
if (!usingStdAllocator && A::propagate_on_container_swap::value) {
|
|
1135
|
+
swap(impl_, other.impl_);
|
|
1136
|
+
} else {
|
|
1137
|
+
impl_.swapData(other.impl_);
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
void clear() noexcept { M_destroy_range_e(impl_.b_); }
|
|
1142
|
+
|
|
1143
|
+
private:
|
|
1144
|
+
// std::vector implements a similar function with a different growth
|
|
1145
|
+
// strategy: empty() ? 1 : capacity() * 2.
|
|
1146
|
+
//
|
|
1147
|
+
// fbvector grows differently on two counts:
|
|
1148
|
+
//
|
|
1149
|
+
// (1) initial size
|
|
1150
|
+
// Instead of growing to size 1 from empty, fbvector allocates at least
|
|
1151
|
+
// 64 bytes. You may still use reserve to reserve a lesser amount of
|
|
1152
|
+
// memory.
|
|
1153
|
+
// (2) 1.5x
|
|
1154
|
+
// For medium-sized vectors, the growth strategy is 1.5x. See the docs
|
|
1155
|
+
// for details.
|
|
1156
|
+
// This does not apply to very small or very large fbvectors. This is a
|
|
1157
|
+
// heuristic.
|
|
1158
|
+
// A nice addition to fbvector would be the capability of having a user-
|
|
1159
|
+
// defined growth strategy, probably as part of the allocator.
|
|
1160
|
+
//
|
|
1161
|
+
|
|
1162
|
+
size_type computePushBackCapacity() const {
|
|
1163
|
+
if (capacity() == 0) {
|
|
1164
|
+
return std::max(64 / sizeof(T), size_type(1));
|
|
1165
|
+
}
|
|
1166
|
+
if (capacity() < folly::jemallocMinInPlaceExpandable / sizeof(T)) {
|
|
1167
|
+
return capacity() * 2;
|
|
1168
|
+
}
|
|
1169
|
+
if (capacity() > 4096 * 32 / sizeof(T)) {
|
|
1170
|
+
return capacity() * 2;
|
|
1171
|
+
}
|
|
1172
|
+
return (capacity() * 3 + 1) / 2;
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
template <class... Args>
|
|
1176
|
+
void emplace_back_aux(Args&&... args) {
|
|
1177
|
+
size_type byte_sz =
|
|
1178
|
+
folly::goodMallocSize(computePushBackCapacity() * sizeof(T));
|
|
1179
|
+
if (usingStdAllocator && usingJEMalloc() &&
|
|
1180
|
+
((impl_.z_ - impl_.b_) * sizeof(T) >=
|
|
1181
|
+
folly::jemallocMinInPlaceExpandable)) {
|
|
1182
|
+
// Try to reserve in place.
|
|
1183
|
+
// Ask xallocx to allocate in place at least size()+1 and at most sz
|
|
1184
|
+
// space.
|
|
1185
|
+
// xallocx will allocate as much as possible within that range, which
|
|
1186
|
+
// is the best possible outcome: if sz space is available, take it all,
|
|
1187
|
+
// otherwise take as much as possible. If nothing is available, then
|
|
1188
|
+
// fail.
|
|
1189
|
+
// In this fashion, we never relocate if there is a possibility of
|
|
1190
|
+
// expanding in place, and we never reallocate by less than the desired
|
|
1191
|
+
// amount unless we cannot expand further. Hence we will not reallocate
|
|
1192
|
+
// sub-optimally twice in a row (modulo the blocking memory being freed).
|
|
1193
|
+
size_type lower = folly::goodMallocSize(sizeof(T) + size() * sizeof(T));
|
|
1194
|
+
size_type upper = byte_sz;
|
|
1195
|
+
size_type extra = upper - lower;
|
|
1196
|
+
|
|
1197
|
+
void* p = impl_.b_;
|
|
1198
|
+
size_t actual;
|
|
1199
|
+
|
|
1200
|
+
if ((actual = xallocx(p, lower, extra, 0)) >= lower) {
|
|
1201
|
+
impl_.z_ = impl_.b_ + actual / sizeof(T);
|
|
1202
|
+
M_construct(impl_.e_, std::forward<Args>(args)...);
|
|
1203
|
+
++impl_.e_;
|
|
1204
|
+
return;
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
// Reallocation failed. Perform a manual relocation.
|
|
1209
|
+
size_type sz = byte_sz / sizeof(T);
|
|
1210
|
+
auto newB = M_allocate(sz);
|
|
1211
|
+
auto newE = newB + size();
|
|
1212
|
+
{
|
|
1213
|
+
auto rollback1 = makeGuard([&] { M_deallocate(newB, sz); });
|
|
1214
|
+
if (folly::IsRelocatable<T>::value && usingStdAllocator) {
|
|
1215
|
+
// For linear memory access, relocate before construction.
|
|
1216
|
+
// By the test condition, relocate is noexcept.
|
|
1217
|
+
// Note that there is no cleanup to do if M_construct throws - that's
|
|
1218
|
+
// one of the beauties of relocation.
|
|
1219
|
+
// Benchmarks for this code have high variance, and seem to be close.
|
|
1220
|
+
relocate_move(newB, impl_.b_, impl_.e_);
|
|
1221
|
+
M_construct(newE, std::forward<Args>(args)...);
|
|
1222
|
+
++newE;
|
|
1223
|
+
} else {
|
|
1224
|
+
M_construct(newE, std::forward<Args>(args)...);
|
|
1225
|
+
++newE;
|
|
1226
|
+
auto rollback2 = makeGuard([&] { M_destroy(newE - 1); });
|
|
1227
|
+
M_relocate(newB);
|
|
1228
|
+
rollback2.dismiss();
|
|
1229
|
+
}
|
|
1230
|
+
rollback1.dismiss();
|
|
1231
|
+
}
|
|
1232
|
+
if (impl_.b_) {
|
|
1233
|
+
M_deallocate(impl_.b_, size());
|
|
1234
|
+
}
|
|
1235
|
+
impl_.b_ = newB;
|
|
1236
|
+
impl_.e_ = newE;
|
|
1237
|
+
impl_.z_ = newB + sz;
|
|
1238
|
+
}
|
|
1239
|
+
|
|
1240
|
+
//===========================================================================
|
|
1241
|
+
//---------------------------------------------------------------------------
|
|
1242
|
+
// modifiers (erase)
|
|
1243
|
+
public:
|
|
1244
|
+
iterator erase(const_iterator position) {
|
|
1245
|
+
return erase(position, position + 1);
|
|
1246
|
+
}
|
|
1247
|
+
|
|
1248
|
+
iterator erase(const_iterator first, const_iterator last) {
|
|
1249
|
+
assert(isValid(first) && isValid(last));
|
|
1250
|
+
assert(first <= last);
|
|
1251
|
+
if (first != last) {
|
|
1252
|
+
if (last == end()) {
|
|
1253
|
+
M_destroy_range_e((iterator)first);
|
|
1254
|
+
} else {
|
|
1255
|
+
if (folly::IsRelocatable<T>::value && usingStdAllocator) {
|
|
1256
|
+
D_destroy_range_a((iterator)first, (iterator)last);
|
|
1257
|
+
if (last - first >= cend() - last) {
|
|
1258
|
+
std::memcpy((void*)first, (void*)last, (cend() - last) * sizeof(T));
|
|
1259
|
+
} else {
|
|
1260
|
+
std::memmove(
|
|
1261
|
+
(void*)first, (void*)last, (cend() - last) * sizeof(T));
|
|
1262
|
+
}
|
|
1263
|
+
impl_.e_ -= (last - first);
|
|
1264
|
+
} else {
|
|
1265
|
+
std::copy(
|
|
1266
|
+
std::make_move_iterator((iterator)last),
|
|
1267
|
+
std::make_move_iterator(end()),
|
|
1268
|
+
(iterator)first);
|
|
1269
|
+
auto newEnd = impl_.e_ - std::distance(first, last);
|
|
1270
|
+
M_destroy_range_e(newEnd);
|
|
1271
|
+
}
|
|
1272
|
+
}
|
|
1273
|
+
}
|
|
1274
|
+
return (iterator)first;
|
|
1275
|
+
}
|
|
1276
|
+
|
|
1277
|
+
//===========================================================================
|
|
1278
|
+
//---------------------------------------------------------------------------
|
|
1279
|
+
// modifiers (insert)
|
|
1280
|
+
private: // we have the private section first because it defines some macros
|
|
1281
|
+
bool isValid(const_iterator it) { return cbegin() <= it && it <= cend(); }
|
|
1282
|
+
|
|
1283
|
+
size_type computeInsertCapacity(size_type n) {
|
|
1284
|
+
size_type nc = std::max(computePushBackCapacity(), size() + n);
|
|
1285
|
+
size_type ac = folly::goodMallocSize(nc * sizeof(T)) / sizeof(T);
|
|
1286
|
+
return ac;
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
//---------------------------------------------------------------------------
|
|
1290
|
+
//
|
|
1291
|
+
// make_window takes an fbvector, and creates an uninitialized gap (a
|
|
1292
|
+
// window) at the given position, of the given size. The fbvector must
|
|
1293
|
+
// have enough capacity.
|
|
1294
|
+
//
|
|
1295
|
+
// Explanation by picture.
|
|
1296
|
+
//
|
|
1297
|
+
// 123456789______
|
|
1298
|
+
// ^
|
|
1299
|
+
// make_window here of size 3
|
|
1300
|
+
//
|
|
1301
|
+
// 1234___56789___
|
|
1302
|
+
//
|
|
1303
|
+
// If something goes wrong and the window must be destroyed, use
|
|
1304
|
+
// undo_window to provide a weak exception guarantee. It destroys
|
|
1305
|
+
// the right ledge.
|
|
1306
|
+
//
|
|
1307
|
+
// 1234___________
|
|
1308
|
+
//
|
|
1309
|
+
//---------------------------------------------------------------------------
|
|
1310
|
+
//
|
|
1311
|
+
// wrap_frame takes an inverse window and relocates an fbvector around it.
|
|
1312
|
+
// The fbvector must have at least as many elements as the left ledge.
|
|
1313
|
+
//
|
|
1314
|
+
// Explanation by picture.
|
|
1315
|
+
//
|
|
1316
|
+
// START
|
|
1317
|
+
// fbvector: inverse window:
|
|
1318
|
+
// 123456789______ _____abcde_______
|
|
1319
|
+
// [idx][ n ]
|
|
1320
|
+
//
|
|
1321
|
+
// RESULT
|
|
1322
|
+
// _______________ 12345abcde6789___
|
|
1323
|
+
//
|
|
1324
|
+
//---------------------------------------------------------------------------
|
|
1325
|
+
//
|
|
1326
|
+
// insert_use_fresh_memory returns true iff the fbvector should use a fresh
|
|
1327
|
+
// block of memory for the insertion. If the fbvector does not have enough
|
|
1328
|
+
// spare capacity, then it must return true. Otherwise either true or false
|
|
1329
|
+
// may be returned.
|
|
1330
|
+
//
|
|
1331
|
+
//---------------------------------------------------------------------------
|
|
1332
|
+
//
|
|
1333
|
+
// These three functions, make_window, wrap_frame, and
|
|
1334
|
+
// insert_use_fresh_memory, can be combined into a uniform interface.
|
|
1335
|
+
// Since that interface involves a lot of case-work, it is built into
|
|
1336
|
+
// some macros: FOLLY_FBVECTOR_INSERT_(PRE|START|TRY|END)
|
|
1337
|
+
// Macros are used in an attempt to let GCC perform better optimizations,
|
|
1338
|
+
// especially control flow optimization.
|
|
1339
|
+
//
|
|
1340
|
+
|
|
1341
|
+
//---------------------------------------------------------------------------
|
|
1342
|
+
// window
|
|
1343
|
+
|
|
1344
|
+
void make_window(iterator position, size_type n) {
|
|
1345
|
+
// The result is guaranteed to be non-negative, so use an unsigned type:
|
|
1346
|
+
size_type tail = size_type(std::distance(position, impl_.e_));
|
|
1347
|
+
|
|
1348
|
+
if (tail <= n) {
|
|
1349
|
+
relocate_move(position + n, position, impl_.e_);
|
|
1350
|
+
relocate_done(position + n, position, impl_.e_);
|
|
1351
|
+
impl_.e_ += n;
|
|
1352
|
+
} else {
|
|
1353
|
+
if (folly::IsRelocatable<T>::value && usingStdAllocator) {
|
|
1354
|
+
compiler_may_unsafely_assume(position != nullptr);
|
|
1355
|
+
std::memmove((void*)(position + n), (void*)position, tail * sizeof(T));
|
|
1356
|
+
impl_.e_ += n;
|
|
1357
|
+
} else {
|
|
1358
|
+
D_uninitialized_move_a(impl_.e_, impl_.e_ - n, impl_.e_);
|
|
1359
|
+
{
|
|
1360
|
+
auto rollback = makeGuard([&] {
|
|
1361
|
+
D_destroy_range_a(impl_.e_ - n, impl_.e_ + n);
|
|
1362
|
+
impl_.e_ -= n;
|
|
1363
|
+
});
|
|
1364
|
+
std::copy_backward(
|
|
1365
|
+
std::make_move_iterator(position),
|
|
1366
|
+
std::make_move_iterator(impl_.e_ - n),
|
|
1367
|
+
impl_.e_);
|
|
1368
|
+
rollback.dismiss();
|
|
1369
|
+
}
|
|
1370
|
+
impl_.e_ += n;
|
|
1371
|
+
D_destroy_range_a(position, position + n);
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
|
|
1376
|
+
void undo_window(iterator position, size_type n) noexcept {
|
|
1377
|
+
D_destroy_range_a(position + n, impl_.e_);
|
|
1378
|
+
impl_.e_ = position;
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1381
|
+
//---------------------------------------------------------------------------
|
|
1382
|
+
// frame
|
|
1383
|
+
|
|
1384
|
+
void wrap_frame(T* ledge, size_type idx, size_type n) {
|
|
1385
|
+
assert(size() >= idx);
|
|
1386
|
+
assert(n != 0);
|
|
1387
|
+
|
|
1388
|
+
relocate_move(ledge, impl_.b_, impl_.b_ + idx);
|
|
1389
|
+
{
|
|
1390
|
+
auto rollback = makeGuard([&] { //
|
|
1391
|
+
relocate_undo(ledge, impl_.b_, impl_.b_ + idx);
|
|
1392
|
+
});
|
|
1393
|
+
relocate_move(ledge + idx + n, impl_.b_ + idx, impl_.e_);
|
|
1394
|
+
rollback.dismiss();
|
|
1395
|
+
}
|
|
1396
|
+
relocate_done(ledge, impl_.b_, impl_.b_ + idx);
|
|
1397
|
+
relocate_done(ledge + idx + n, impl_.b_ + idx, impl_.e_);
|
|
1398
|
+
}
|
|
1399
|
+
|
|
1400
|
+
//---------------------------------------------------------------------------
|
|
1401
|
+
// use fresh?
|
|
1402
|
+
|
|
1403
|
+
bool insert_use_fresh(bool at_end, size_type n) {
|
|
1404
|
+
if (at_end) {
|
|
1405
|
+
if (size() + n <= capacity()) {
|
|
1406
|
+
return false;
|
|
1407
|
+
}
|
|
1408
|
+
if (reserve_in_place(size() + n)) {
|
|
1409
|
+
return false;
|
|
1410
|
+
}
|
|
1411
|
+
return true;
|
|
1412
|
+
}
|
|
1413
|
+
|
|
1414
|
+
if (size() + n > capacity()) {
|
|
1415
|
+
return true;
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1418
|
+
return false;
|
|
1419
|
+
}
|
|
1420
|
+
|
|
1421
|
+
//---------------------------------------------------------------------------
|
|
1422
|
+
// interface
|
|
1423
|
+
|
|
1424
|
+
template <
|
|
1425
|
+
typename IsInternalFunc,
|
|
1426
|
+
typename InsertInternalFunc,
|
|
1427
|
+
typename ConstructFunc,
|
|
1428
|
+
typename DestroyFunc>
|
|
1429
|
+
iterator do_real_insert(
|
|
1430
|
+
const_iterator cpos,
|
|
1431
|
+
size_type n,
|
|
1432
|
+
IsInternalFunc&& isInternalFunc,
|
|
1433
|
+
InsertInternalFunc&& insertInternalFunc,
|
|
1434
|
+
ConstructFunc&& constructFunc,
|
|
1435
|
+
DestroyFunc&& destroyFunc) {
|
|
1436
|
+
if (n == 0) {
|
|
1437
|
+
return iterator(cpos);
|
|
1438
|
+
}
|
|
1439
|
+
bool at_end = cpos == cend();
|
|
1440
|
+
bool fresh = insert_use_fresh(at_end, n);
|
|
1441
|
+
if (!at_end) {
|
|
1442
|
+
if (!fresh && isInternalFunc()) {
|
|
1443
|
+
// check for internal data (technically not required by the standard)
|
|
1444
|
+
return insertInternalFunc();
|
|
1445
|
+
}
|
|
1446
|
+
assert(isValid(cpos));
|
|
1447
|
+
}
|
|
1448
|
+
T* position = const_cast<T*>(cpos);
|
|
1449
|
+
size_type idx = size_type(std::distance(impl_.b_, position));
|
|
1450
|
+
T* b;
|
|
1451
|
+
size_type newCap; /* intentionally uninitialized */
|
|
1452
|
+
|
|
1453
|
+
if (fresh) {
|
|
1454
|
+
newCap = computeInsertCapacity(n);
|
|
1455
|
+
b = M_allocate(newCap);
|
|
1456
|
+
} else {
|
|
1457
|
+
if (!at_end) {
|
|
1458
|
+
make_window(position, n);
|
|
1459
|
+
} else {
|
|
1460
|
+
impl_.e_ += n;
|
|
1461
|
+
}
|
|
1462
|
+
b = impl_.b_;
|
|
1463
|
+
}
|
|
1464
|
+
|
|
1465
|
+
T* start = b + idx;
|
|
1466
|
+
{
|
|
1467
|
+
auto rollback = makeGuard([&] {
|
|
1468
|
+
if (fresh) {
|
|
1469
|
+
M_deallocate(b, newCap);
|
|
1470
|
+
} else {
|
|
1471
|
+
if (!at_end) {
|
|
1472
|
+
undo_window(position, n);
|
|
1473
|
+
} else {
|
|
1474
|
+
impl_.e_ -= n;
|
|
1475
|
+
}
|
|
1476
|
+
}
|
|
1477
|
+
});
|
|
1478
|
+
// construct the inserted elements
|
|
1479
|
+
constructFunc(start);
|
|
1480
|
+
rollback.dismiss();
|
|
1481
|
+
}
|
|
1482
|
+
|
|
1483
|
+
if (fresh) {
|
|
1484
|
+
{
|
|
1485
|
+
auto rollback = makeGuard([&] {
|
|
1486
|
+
// delete the inserted elements (exception has been thrown)
|
|
1487
|
+
destroyFunc(start);
|
|
1488
|
+
M_deallocate(b, newCap);
|
|
1489
|
+
});
|
|
1490
|
+
wrap_frame(b, idx, n);
|
|
1491
|
+
rollback.dismiss();
|
|
1492
|
+
}
|
|
1493
|
+
if (impl_.b_) {
|
|
1494
|
+
M_deallocate(impl_.b_, capacity());
|
|
1495
|
+
}
|
|
1496
|
+
impl_.set(b, size() + n, newCap);
|
|
1497
|
+
return impl_.b_ + idx;
|
|
1498
|
+
} else {
|
|
1499
|
+
return position;
|
|
1500
|
+
}
|
|
1501
|
+
}
|
|
1502
|
+
|
|
1503
|
+
public:
|
|
1504
|
+
template <class... Args>
|
|
1505
|
+
iterator emplace(const_iterator cpos, Args&&... args) {
|
|
1506
|
+
return do_real_insert(
|
|
1507
|
+
cpos,
|
|
1508
|
+
1,
|
|
1509
|
+
[&] { return false; },
|
|
1510
|
+
[&] { return iterator{}; },
|
|
1511
|
+
[&](iterator start) {
|
|
1512
|
+
M_construct(start, std::forward<Args>(args)...);
|
|
1513
|
+
},
|
|
1514
|
+
[&](iterator start) { M_destroy(start); });
|
|
1515
|
+
}
|
|
1516
|
+
|
|
1517
|
+
iterator insert(const_iterator cpos, const T& value) {
|
|
1518
|
+
return do_real_insert(
|
|
1519
|
+
cpos,
|
|
1520
|
+
1,
|
|
1521
|
+
[&] { return dataIsInternal(value); },
|
|
1522
|
+
[&] { return insert(cpos, T(value)); },
|
|
1523
|
+
[&](iterator start) { M_construct(start, value); },
|
|
1524
|
+
[&](iterator start) { M_destroy(start); });
|
|
1525
|
+
}
|
|
1526
|
+
|
|
1527
|
+
iterator insert(const_iterator cpos, T&& value) {
|
|
1528
|
+
return do_real_insert(
|
|
1529
|
+
cpos,
|
|
1530
|
+
1,
|
|
1531
|
+
[&] { return dataIsInternal(value); },
|
|
1532
|
+
[&] { return insert(cpos, T(std::move(value))); },
|
|
1533
|
+
[&](iterator start) { M_construct(start, std::move(value)); },
|
|
1534
|
+
[&](iterator start) { M_destroy(start); });
|
|
1535
|
+
}
|
|
1536
|
+
|
|
1537
|
+
iterator insert(const_iterator cpos, size_type n, VT value) {
|
|
1538
|
+
return do_real_insert(
|
|
1539
|
+
cpos,
|
|
1540
|
+
n,
|
|
1541
|
+
[&] { return dataIsInternalAndNotVT(value); },
|
|
1542
|
+
[&] { return insert(cpos, n, T(value)); },
|
|
1543
|
+
[&](iterator start) { D_uninitialized_fill_n_a(start, n, value); },
|
|
1544
|
+
[&](iterator start) { D_destroy_range_a(start, start + n); });
|
|
1545
|
+
}
|
|
1546
|
+
|
|
1547
|
+
template <
|
|
1548
|
+
class It,
|
|
1549
|
+
class Category = typename std::iterator_traits<It>::iterator_category>
|
|
1550
|
+
iterator insert(const_iterator cpos, It first, It last) {
|
|
1551
|
+
return insert(cpos, first, last, Category());
|
|
1552
|
+
}
|
|
1553
|
+
|
|
1554
|
+
iterator insert(const_iterator cpos, std::initializer_list<T> il) {
|
|
1555
|
+
return insert(cpos, il.begin(), il.end());
|
|
1556
|
+
}
|
|
1557
|
+
|
|
1558
|
+
//---------------------------------------------------------------------------
|
|
1559
|
+
// insert dispatch for iterator types
|
|
1560
|
+
private:
|
|
1561
|
+
template <class FIt>
|
|
1562
|
+
iterator insert(
|
|
1563
|
+
const_iterator cpos, FIt first, FIt last, std::forward_iterator_tag) {
|
|
1564
|
+
size_type n = size_type(std::distance(first, last));
|
|
1565
|
+
return do_real_insert(
|
|
1566
|
+
cpos,
|
|
1567
|
+
n,
|
|
1568
|
+
[&] { return false; },
|
|
1569
|
+
[&] { return iterator{}; },
|
|
1570
|
+
[&](iterator start) { D_uninitialized_copy_a(start, first, last); },
|
|
1571
|
+
[&](iterator start) { D_destroy_range_a(start, start + n); });
|
|
1572
|
+
}
|
|
1573
|
+
|
|
1574
|
+
template <class IIt>
|
|
1575
|
+
iterator insert(
|
|
1576
|
+
const_iterator cpos, IIt first, IIt last, std::input_iterator_tag) {
|
|
1577
|
+
T* position = const_cast<T*>(cpos);
|
|
1578
|
+
assert(isValid(position));
|
|
1579
|
+
size_type idx = std::distance(begin(), position);
|
|
1580
|
+
|
|
1581
|
+
fbvector storage(
|
|
1582
|
+
std::make_move_iterator(position),
|
|
1583
|
+
std::make_move_iterator(end()),
|
|
1584
|
+
A::select_on_container_copy_construction(impl_));
|
|
1585
|
+
M_destroy_range_e(position);
|
|
1586
|
+
for (; first != last; ++first) {
|
|
1587
|
+
emplace_back(*first);
|
|
1588
|
+
}
|
|
1589
|
+
insert(
|
|
1590
|
+
cend(),
|
|
1591
|
+
std::make_move_iterator(storage.begin()),
|
|
1592
|
+
std::make_move_iterator(storage.end()));
|
|
1593
|
+
return impl_.b_ + idx;
|
|
1594
|
+
}
|
|
1595
|
+
|
|
1596
|
+
//===========================================================================
|
|
1597
|
+
//---------------------------------------------------------------------------
|
|
1598
|
+
// lexicographical functions
|
|
1599
|
+
public:
|
|
1600
|
+
bool operator==(const fbvector& other) const {
|
|
1601
|
+
return size() == other.size() && std::equal(begin(), end(), other.begin());
|
|
1602
|
+
}
|
|
1603
|
+
|
|
1604
|
+
bool operator!=(const fbvector& other) const { return !(*this == other); }
|
|
1605
|
+
|
|
1606
|
+
bool operator<(const fbvector& other) const {
|
|
1607
|
+
return std::lexicographical_compare(
|
|
1608
|
+
begin(), end(), other.begin(), other.end());
|
|
1609
|
+
}
|
|
1610
|
+
|
|
1611
|
+
bool operator>(const fbvector& other) const { return other < *this; }
|
|
1612
|
+
|
|
1613
|
+
bool operator<=(const fbvector& other) const { return !(*this > other); }
|
|
1614
|
+
|
|
1615
|
+
bool operator>=(const fbvector& other) const { return !(*this < other); }
|
|
1616
|
+
|
|
1617
|
+
//===========================================================================
|
|
1618
|
+
//---------------------------------------------------------------------------
|
|
1619
|
+
// friends
|
|
1620
|
+
private:
|
|
1621
|
+
template <class _T, class _A>
|
|
1622
|
+
friend _T* relinquish(fbvector<_T, _A>&);
|
|
1623
|
+
|
|
1624
|
+
template <class _T, class _A>
|
|
1625
|
+
friend void attach(fbvector<_T, _A>&, _T* data, size_t sz, size_t cap);
|
|
1626
|
+
|
|
1627
|
+
}; // class fbvector
|
|
1628
|
+
|
|
1629
|
+
//=============================================================================
|
|
1630
|
+
//-----------------------------------------------------------------------------
|
|
1631
|
+
// specialized functions
|
|
1632
|
+
|
|
1633
|
+
template <class T, class A>
|
|
1634
|
+
void swap(fbvector<T, A>& lhs, fbvector<T, A>& rhs) noexcept {
|
|
1635
|
+
lhs.swap(rhs);
|
|
1636
|
+
}
|
|
1637
|
+
|
|
1638
|
+
//=============================================================================
|
|
1639
|
+
//-----------------------------------------------------------------------------
|
|
1640
|
+
// other
|
|
1641
|
+
|
|
1642
|
+
namespace detail {
|
|
1643
|
+
|
|
1644
|
+
// Format support.
|
|
1645
|
+
template <class T, class A>
|
|
1646
|
+
struct IndexableTraits<fbvector<T, A>>
|
|
1647
|
+
: public IndexableTraitsSeq<fbvector<T, A>> {};
|
|
1648
|
+
|
|
1649
|
+
} // namespace detail
|
|
1650
|
+
|
|
1651
|
+
template <class T, class A>
|
|
1652
|
+
void compactResize(fbvector<T, A>* v, size_t sz) {
|
|
1653
|
+
v->resize(sz);
|
|
1654
|
+
v->shrink_to_fit();
|
|
1655
|
+
}
|
|
1656
|
+
|
|
1657
|
+
// DANGER
|
|
1658
|
+
//
|
|
1659
|
+
// relinquish and attach are not a members function specifically so that it is
|
|
1660
|
+
// awkward to call them. It is very easy to shoot yourself in the foot with
|
|
1661
|
+
// these functions.
|
|
1662
|
+
//
|
|
1663
|
+
// If you call relinquish, then it is your responsibility to free the data
|
|
1664
|
+
// and the storage, both of which may have been generated in a non-standard
|
|
1665
|
+
// way through the fbvector's allocator.
|
|
1666
|
+
//
|
|
1667
|
+
// If you call attach, it is your responsibility to ensure that the fbvector
|
|
1668
|
+
// is fresh (size and capacity both zero), and that the supplied data is
|
|
1669
|
+
// capable of being manipulated by the allocator.
|
|
1670
|
+
// It is acceptable to supply a stack pointer IF:
|
|
1671
|
+
// (1) The vector's data does not outlive the stack pointer. This includes
|
|
1672
|
+
// extension of the data's life through a move operation.
|
|
1673
|
+
// (2) The pointer has enough capacity that the vector will never be
|
|
1674
|
+
// relocated.
|
|
1675
|
+
// (3) Insert is not called on the vector; these functions have leeway to
|
|
1676
|
+
// relocate the vector even if there is enough capacity.
|
|
1677
|
+
// (4) A stack pointer is compatible with the fbvector's allocator.
|
|
1678
|
+
//
|
|
1679
|
+
|
|
1680
|
+
template <class T, class A>
|
|
1681
|
+
T* relinquish(fbvector<T, A>& v) {
|
|
1682
|
+
T* ret = v.data();
|
|
1683
|
+
v.impl_.b_ = v.impl_.e_ = v.impl_.z_ = nullptr;
|
|
1684
|
+
return ret;
|
|
1685
|
+
}
|
|
1686
|
+
|
|
1687
|
+
template <class T, class A>
|
|
1688
|
+
void attach(fbvector<T, A>& v, T* data, size_t sz, size_t cap) {
|
|
1689
|
+
assert(v.data() == nullptr);
|
|
1690
|
+
v.impl_.b_ = data;
|
|
1691
|
+
v.impl_.e_ = data + sz;
|
|
1692
|
+
v.impl_.z_ = data + cap;
|
|
1693
|
+
}
|
|
1694
|
+
|
|
1695
|
+
template <
|
|
1696
|
+
class InputIt,
|
|
1697
|
+
class Allocator =
|
|
1698
|
+
std::allocator<typename std::iterator_traits<InputIt>::value_type>>
|
|
1699
|
+
fbvector(InputIt, InputIt, Allocator = Allocator())
|
|
1700
|
+
-> fbvector<typename std::iterator_traits<InputIt>::value_type, Allocator>;
|
|
1701
|
+
|
|
1702
|
+
template <class T, class A, class U>
|
|
1703
|
+
void erase(fbvector<T, A>& v, U value) {
|
|
1704
|
+
v.erase(std::remove(v.begin(), v.end(), value), v.end());
|
|
1705
|
+
}
|
|
1706
|
+
|
|
1707
|
+
template <class T, class A, class Predicate>
|
|
1708
|
+
void erase_if(fbvector<T, A>& v, Predicate predicate) {
|
|
1709
|
+
v.erase(std::remove_if(v.begin(), v.end(), std::ref(predicate)), v.end());
|
|
1710
|
+
}
|
|
1711
|
+
} // namespace folly
|