react-native-windows 0.81.34 → 0.81.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (927) hide show
  1. package/Directory.Build.props +1 -16
  2. package/Folly/ThreadNameStub.cpp +4 -6
  3. package/Microsoft.ReactNative/Fabric/Composition/BorderPrimitive.cpp +1 -1
  4. package/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.cpp +27 -4
  5. package/Microsoft.ReactNative/Fabric/Composition/ScrollViewComponentView.cpp +8 -4
  6. package/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp +7 -3
  7. package/Microsoft.ReactNative/Fabric/Composition/TooltipService.cpp +48 -2
  8. package/Microsoft.ReactNative/Fabric/WindowsImageManager.cpp +40 -13
  9. package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +1 -7
  10. package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj.filters +0 -3
  11. package/PropertySheets/Generated/PackageVersion.g.props +3 -3
  12. package/PropertySheets/React.Cpp.props +3 -3
  13. package/ReactCommon/ReactCommon.vcxproj +0 -10
  14. package/ReactCommon/packages.lock.win32.json +0 -10
  15. package/Scripts/Tfs/Layout-Desktop-Headers.ps1 +4 -37
  16. package/Scripts/creaternwlib.cmd +2 -2
  17. package/Shared/Shared.vcxitems +2 -0
  18. package/{Folly → external}/.clang-format +0 -1
  19. package/external/External.vcxitems +10 -0
  20. package/external/fast-float/.syncignore +10 -0
  21. package/external/fast-float/LICENSE-APACHE +190 -0
  22. package/external/fast-float/LICENSE-BOOST +23 -0
  23. package/external/fast-float/LICENSE-MIT +27 -0
  24. package/external/fast-float/README.md +545 -0
  25. package/external/fast-float/cgmanifest.json +15 -0
  26. package/external/fast-float/fast-float.vcxitems +14 -0
  27. package/external/fast-float/include/fast_float/ascii_number.h +588 -0
  28. package/external/fast-float/include/fast_float/bigint.h +638 -0
  29. package/external/fast-float/include/fast_float/constexpr_feature_detect.h +46 -0
  30. package/external/fast-float/include/fast_float/decimal_to_binary.h +212 -0
  31. package/external/fast-float/include/fast_float/digit_comparison.h +457 -0
  32. package/external/fast-float/include/fast_float/fast_float.h +59 -0
  33. package/external/fast-float/include/fast_float/fast_table.h +708 -0
  34. package/external/fast-float/include/fast_float/float_common.h +1240 -0
  35. package/external/fast-float/include/fast_float/parse_number.h +399 -0
  36. package/external/fast-float/sync-config.json +8 -0
  37. package/external/fmt/.syncignore +10 -0
  38. package/external/fmt/CONTRIBUTING.md +20 -0
  39. package/external/fmt/LICENSE +27 -0
  40. package/external/fmt/README.md +484 -0
  41. package/{fmt → external/fmt}/cgmanifest.json +1 -1
  42. package/external/fmt/doc/ChangeLog-old.md +3290 -0
  43. package/external/fmt/doc/api.md +650 -0
  44. package/external/fmt/doc/fmt.css +61 -0
  45. package/external/fmt/doc/fmt.js +4 -0
  46. package/external/fmt/doc/get-started.md +222 -0
  47. package/external/fmt/doc/index.md +151 -0
  48. package/external/fmt/doc/perf.svg +1 -0
  49. package/external/fmt/doc/python-license.txt +290 -0
  50. package/external/fmt/doc/syntax.md +887 -0
  51. package/external/fmt/fmt.vcxitems +28 -0
  52. package/external/fmt/include/fmt/args.h +228 -0
  53. package/{fmt/TEMP_UntilFmtUpdate/core.h → external/fmt/include/fmt/base.h} +1188 -1036
  54. package/external/fmt/include/fmt/chrono.h +2432 -0
  55. package/external/fmt/include/fmt/color.h +612 -0
  56. package/external/fmt/include/fmt/compile.h +529 -0
  57. package/external/fmt/include/fmt/core.h +5 -0
  58. package/external/fmt/include/fmt/format-inl.h +1928 -0
  59. package/external/fmt/include/fmt/format.h +4427 -0
  60. package/external/fmt/include/fmt/os.h +439 -0
  61. package/external/fmt/include/fmt/ostream.h +211 -0
  62. package/external/fmt/include/fmt/printf.h +656 -0
  63. package/external/fmt/include/fmt/ranges.h +882 -0
  64. package/external/fmt/include/fmt/std.h +699 -0
  65. package/external/fmt/include/fmt/xchar.h +322 -0
  66. package/external/fmt/src/fmt.cc +135 -0
  67. package/external/fmt/src/format.cc +43 -0
  68. package/external/fmt/src/os.cc +403 -0
  69. package/external/fmt/sync-config.json +8 -0
  70. package/external/folly/.syncignore +60 -0
  71. package/external/folly/LICENSE +200 -0
  72. package/external/folly/README.md +263 -0
  73. package/{fmt → external/folly/folly}/.clang-format +0 -1
  74. package/external/folly/folly/AtomicHashArray-inl.h +546 -0
  75. package/external/folly/folly/AtomicHashArray.h +431 -0
  76. package/external/folly/folly/AtomicHashMap-inl.h +653 -0
  77. package/external/folly/folly/AtomicHashMap.h +484 -0
  78. package/external/folly/folly/AtomicIntrusiveLinkedList.h +206 -0
  79. package/external/folly/folly/AtomicLinkedList.h +110 -0
  80. package/external/folly/folly/AtomicUnorderedMap.h +522 -0
  81. package/external/folly/folly/BUCK +1631 -0
  82. package/external/folly/folly/BUILD_MODE.bzl +72 -0
  83. package/external/folly/folly/Benchmark.cpp +986 -0
  84. package/external/folly/folly/Benchmark.h +680 -0
  85. package/external/folly/folly/BenchmarkUtil.h +47 -0
  86. package/external/folly/folly/Bits.h +17 -0
  87. package/external/folly/folly/CMakeLists.txt +110 -0
  88. package/external/folly/folly/CPortability.h +338 -0
  89. package/external/folly/folly/CancellationToken-inl.h +449 -0
  90. package/external/folly/folly/CancellationToken.cpp +250 -0
  91. package/external/folly/folly/CancellationToken.h +365 -0
  92. package/external/folly/folly/Chrono.h +132 -0
  93. package/external/folly/folly/ClockGettimeWrappers.cpp +93 -0
  94. package/external/folly/folly/ClockGettimeWrappers.h +29 -0
  95. package/external/folly/folly/ConcurrentBitSet.h +157 -0
  96. package/external/folly/folly/ConcurrentLazy.h +74 -0
  97. package/external/folly/folly/ConcurrentSkipList-inl.h +341 -0
  98. package/external/folly/folly/ConcurrentSkipList.h +824 -0
  99. package/external/folly/folly/ConstructorCallbackList.h +158 -0
  100. package/external/folly/folly/Conv.h +2026 -0
  101. package/external/folly/folly/CppAttributes.h +170 -0
  102. package/external/folly/folly/CpuId.h +297 -0
  103. package/external/folly/folly/DefaultKeepAliveExecutor.h +172 -0
  104. package/external/folly/folly/Demangle.cpp +255 -0
  105. package/external/folly/folly/Demangle.h +73 -0
  106. package/external/folly/folly/DiscriminatedPtr.h +236 -0
  107. package/external/folly/folly/DynamicConverter.h +17 -0
  108. package/external/folly/folly/Exception.h +150 -0
  109. package/external/folly/folly/ExceptionString.cpp +51 -0
  110. package/external/folly/folly/ExceptionString.h +33 -0
  111. package/external/folly/folly/ExceptionWrapper-inl.h +264 -0
  112. package/external/folly/folly/ExceptionWrapper.cpp +37 -0
  113. package/external/folly/folly/ExceptionWrapper.h +377 -0
  114. package/external/folly/folly/Executor.cpp +111 -0
  115. package/external/folly/folly/Executor.h +351 -0
  116. package/external/folly/folly/Expected.h +1725 -0
  117. package/external/folly/folly/FBString.h +2888 -0
  118. package/external/folly/folly/FBVector.h +17 -0
  119. package/external/folly/folly/File.cpp +180 -0
  120. package/external/folly/folly/File.h +177 -0
  121. package/external/folly/folly/FileUtil.cpp +378 -0
  122. package/external/folly/folly/FileUtil.h +332 -0
  123. package/external/folly/folly/Fingerprint.cpp +135 -0
  124. package/external/folly/folly/Fingerprint.h +289 -0
  125. package/external/folly/folly/FixedString.h +2965 -0
  126. package/external/folly/folly/FollyMemcpy.cpp +30 -0
  127. package/external/folly/folly/FollyMemcpy.h +23 -0
  128. package/external/folly/folly/FollyMemset.cpp +29 -0
  129. package/external/folly/folly/FollyMemset.h +25 -0
  130. package/external/folly/folly/Format-inl.h +1152 -0
  131. package/external/folly/folly/Format.cpp +429 -0
  132. package/external/folly/folly/Format.h +463 -0
  133. package/external/folly/folly/FormatArg.h +285 -0
  134. package/external/folly/folly/FormatTraits.h +65 -0
  135. package/external/folly/folly/Function.h +1159 -0
  136. package/external/folly/folly/GLog.h +85 -0
  137. package/external/folly/folly/GroupVarint.cpp +153 -0
  138. package/external/folly/folly/GroupVarint.h +630 -0
  139. package/external/folly/folly/Hash.h +20 -0
  140. package/external/folly/folly/IPAddress.cpp +490 -0
  141. package/external/folly/folly/IPAddress.h +667 -0
  142. package/external/folly/folly/IPAddressException.h +82 -0
  143. package/external/folly/folly/IPAddressV4.cpp +305 -0
  144. package/external/folly/folly/IPAddressV4.h +495 -0
  145. package/external/folly/folly/IPAddressV6.cpp +541 -0
  146. package/external/folly/folly/IPAddressV6.h +627 -0
  147. package/external/folly/folly/Indestructible.h +164 -0
  148. package/external/folly/folly/IndexedMemPool.h +550 -0
  149. package/external/folly/folly/IntrusiveList.h +17 -0
  150. package/external/folly/folly/Lazy.h +142 -0
  151. package/external/folly/folly/Likely.h +76 -0
  152. package/external/folly/folly/MPMCPipeline.h +280 -0
  153. package/external/folly/folly/MPMCQueue.h +1556 -0
  154. package/external/folly/folly/MacAddress.cpp +188 -0
  155. package/external/folly/folly/MacAddress.h +260 -0
  156. package/external/folly/folly/MapUtil.h +17 -0
  157. package/external/folly/folly/Math.h +258 -0
  158. package/external/folly/folly/MaybeManagedPtr.h +120 -0
  159. package/external/folly/folly/Memory.h +900 -0
  160. package/external/folly/folly/MicroLock.cpp +76 -0
  161. package/external/folly/folly/MicroLock.h +354 -0
  162. package/external/folly/folly/MicroSpinLock.h +17 -0
  163. package/external/folly/folly/MoveWrapper.h +76 -0
  164. package/external/folly/folly/ObserverContainer.h +1026 -0
  165. package/external/folly/folly/Optional.h +743 -0
  166. package/external/folly/folly/Overload.h +325 -0
  167. package/external/folly/folly/PackedSyncPtr.h +147 -0
  168. package/external/folly/folly/Padded.h +464 -0
  169. package/external/folly/folly/Poly-inl.h +230 -0
  170. package/external/folly/folly/Poly.h +1095 -0
  171. package/external/folly/folly/PolyException.h +43 -0
  172. package/external/folly/folly/Portability.h +644 -0
  173. package/external/folly/folly/Preprocessor.h +236 -0
  174. package/external/folly/folly/ProducerConsumerQueue.h +182 -0
  175. package/external/folly/folly/RWSpinLock.h +17 -0
  176. package/external/folly/folly/Random-inl.h +86 -0
  177. package/external/folly/folly/Random.cpp +184 -0
  178. package/external/folly/folly/Random.h +434 -0
  179. package/external/folly/folly/Range.h +1772 -0
  180. package/external/folly/folly/Replaceable.h +636 -0
  181. package/external/folly/folly/ScopeGuard.cpp +29 -0
  182. package/external/folly/folly/ScopeGuard.h +420 -0
  183. package/external/folly/folly/SharedMutex.cpp +81 -0
  184. package/external/folly/folly/SharedMutex.h +1751 -0
  185. package/external/folly/folly/Singleton-inl.h +332 -0
  186. package/external/folly/folly/Singleton.cpp +512 -0
  187. package/external/folly/folly/Singleton.h +891 -0
  188. package/external/folly/folly/SingletonThreadLocal.cpp +53 -0
  189. package/external/folly/folly/SingletonThreadLocal.h +263 -0
  190. package/external/folly/folly/SocketAddress.cpp +786 -0
  191. package/external/folly/folly/SocketAddress.h +768 -0
  192. package/external/folly/folly/SpinLock.h +55 -0
  193. package/external/folly/folly/String-inl.h +668 -0
  194. package/external/folly/folly/String.cpp +777 -0
  195. package/external/folly/folly/String.h +767 -0
  196. package/external/folly/folly/Subprocess.cpp +1142 -0
  197. package/external/folly/folly/Subprocess.h +1055 -0
  198. package/external/folly/folly/Synchronized.h +1833 -0
  199. package/external/folly/folly/SynchronizedPtr.h +106 -0
  200. package/external/folly/folly/ThreadCachedInt.h +175 -0
  201. package/external/folly/folly/ThreadLocal.h +478 -0
  202. package/external/folly/folly/TimeoutQueue.cpp +78 -0
  203. package/external/folly/folly/TimeoutQueue.h +123 -0
  204. package/external/folly/folly/TokenBucket.h +673 -0
  205. package/external/folly/folly/Traits.h +1442 -0
  206. package/external/folly/folly/Try-inl.h +372 -0
  207. package/external/folly/folly/Try.cpp +23 -0
  208. package/external/folly/folly/Try.h +728 -0
  209. package/external/folly/folly/UTF8String.h +56 -0
  210. package/external/folly/folly/Unicode.cpp +201 -0
  211. package/external/folly/folly/Unicode.h +94 -0
  212. package/external/folly/folly/Unit.h +65 -0
  213. package/external/folly/folly/Uri-inl.h +101 -0
  214. package/external/folly/folly/Uri.cpp +190 -0
  215. package/external/folly/folly/Uri.h +142 -0
  216. package/external/folly/folly/Utility.h +932 -0
  217. package/external/folly/folly/VERSION +1 -0
  218. package/external/folly/folly/Varint.h +230 -0
  219. package/external/folly/folly/VirtualExecutor.h +17 -0
  220. package/external/folly/folly/algorithm/simd/BUCK +47 -0
  221. package/external/folly/folly/algorithm/simd/Contains.cpp +42 -0
  222. package/external/folly/folly/algorithm/simd/Contains.h +116 -0
  223. package/external/folly/folly/algorithm/simd/FindFixed.h +301 -0
  224. package/external/folly/folly/algorithm/simd/Ignore.h +52 -0
  225. package/external/folly/folly/algorithm/simd/Movemask.h +207 -0
  226. package/external/folly/folly/algorithm/simd/detail/BUCK +70 -0
  227. package/external/folly/folly/algorithm/simd/detail/ContainsImpl.h +91 -0
  228. package/external/folly/folly/algorithm/simd/detail/SimdAnyOf.h +83 -0
  229. package/external/folly/folly/algorithm/simd/detail/SimdForEach.h +209 -0
  230. package/external/folly/folly/algorithm/simd/detail/SimdPlatform.h +445 -0
  231. package/external/folly/folly/algorithm/simd/detail/Traits.h +125 -0
  232. package/external/folly/folly/algorithm/simd/detail/UnrollUtils.h +126 -0
  233. package/external/folly/folly/base64.h +264 -0
  234. package/external/folly/folly/chrono/BUCK +29 -0
  235. package/external/folly/folly/chrono/Clock.h +65 -0
  236. package/external/folly/folly/chrono/Conv.h +712 -0
  237. package/external/folly/folly/chrono/test/BUCK +26 -0
  238. package/external/folly/folly/chrono/test/ClockTest.cpp +68 -0
  239. package/external/folly/folly/chrono/test/ConvTest.cpp +652 -0
  240. package/external/folly/folly/concurrency/AtomicSharedPtr.h +387 -0
  241. package/external/folly/folly/concurrency/BUCK +170 -0
  242. package/external/folly/folly/concurrency/CacheLocality.h +460 -0
  243. package/external/folly/folly/concurrency/ConcurrentHashMap.h +822 -0
  244. package/external/folly/folly/concurrency/CoreCachedSharedPtr.h +232 -0
  245. package/external/folly/folly/concurrency/DeadlockDetector.cpp +27 -0
  246. package/external/folly/folly/concurrency/DeadlockDetector.h +44 -0
  247. package/external/folly/folly/concurrency/DynamicBoundedQueue.h +751 -0
  248. package/external/folly/folly/concurrency/PriorityUnboundedQueueSet.h +207 -0
  249. package/external/folly/folly/concurrency/ProcessLocalUniqueId.cpp +46 -0
  250. package/external/folly/folly/concurrency/ProcessLocalUniqueId.h +38 -0
  251. package/external/folly/folly/concurrency/SingletonRelaxedCounter.h +325 -0
  252. package/external/folly/folly/concurrency/ThreadCachedSynchronized.h +227 -0
  253. package/external/folly/folly/concurrency/UnboundedQueue.h +891 -0
  254. package/external/folly/folly/concurrency/container/BUCK +77 -0
  255. package/external/folly/folly/concurrency/container/FlatCombiningPriorityQueue.h +426 -0
  256. package/external/folly/folly/concurrency/container/LockFreeRingBuffer.h +306 -0
  257. package/external/folly/folly/concurrency/container/RelaxedConcurrentPriorityQueue.h +1212 -0
  258. package/external/folly/folly/concurrency/container/SingleWriterFixedHashMap.h +322 -0
  259. package/external/folly/folly/concurrency/container/atomic_grow_array.h +564 -0
  260. package/external/folly/folly/concurrency/container/test/BUCK +75 -0
  261. package/external/folly/folly/concurrency/container/test/FlatCombiningPriorityQueueTest.cpp +570 -0
  262. package/external/folly/folly/concurrency/container/test/LockFreeRingBufferTest.cpp +276 -0
  263. package/external/folly/folly/concurrency/container/test/RelaxedConcurrentPriorityQueueTest.cpp +1570 -0
  264. package/external/folly/folly/concurrency/container/test/SingleWriterFixedHashMapTest.cpp +401 -0
  265. package/external/folly/folly/concurrency/container/test/atomic_grow_array_test.cpp +187 -0
  266. package/external/folly/folly/concurrency/detail/AtomicSharedPtr-detail.h +212 -0
  267. package/external/folly/folly/concurrency/detail/ConcurrentHashMap-detail.h +1911 -0
  268. package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.cpp +43 -0
  269. package/external/folly/folly/concurrency/memory/AtomicReadMostlyMainPtr.h +190 -0
  270. package/external/folly/folly/concurrency/memory/BUCK +53 -0
  271. package/external/folly/folly/concurrency/memory/PrimaryPtr.h +338 -0
  272. package/external/folly/folly/concurrency/memory/ReadMostlySharedPtr.h +511 -0
  273. package/external/folly/folly/concurrency/memory/TLRefCount.h +228 -0
  274. package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrBenchmark.cpp +56 -0
  275. package/external/folly/folly/concurrency/memory/test/AtomicReadMostlyMainPtrTest.cpp +454 -0
  276. package/external/folly/folly/concurrency/memory/test/BUCK +95 -0
  277. package/external/folly/folly/concurrency/memory/test/PrimaryPtrTest.cpp +303 -0
  278. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrBenchmark.cpp +138 -0
  279. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrStressTest.cpp +75 -0
  280. package/external/folly/folly/concurrency/memory/test/ReadMostlySharedPtrTest.cpp +378 -0
  281. package/external/folly/folly/concurrency/memory/test/RefCountBenchmark.cpp +90 -0
  282. package/external/folly/folly/concurrency/memory/test/RefCountTest.cpp +168 -0
  283. package/external/folly/folly/concurrency/test/AtomicSharedPtrCounted.h +156 -0
  284. package/external/folly/folly/concurrency/test/AtomicSharedPtrPerformance.cpp +255 -0
  285. package/external/folly/folly/concurrency/test/AtomicSharedPtrTest.cpp +257 -0
  286. package/external/folly/folly/concurrency/test/BUCK +229 -0
  287. package/external/folly/folly/concurrency/test/CacheLocalityBenchmark.cpp +392 -0
  288. package/external/folly/folly/concurrency/test/CacheLocalityTest.cpp +1229 -0
  289. package/external/folly/folly/concurrency/test/ConcurrentHashMapBench.cpp +260 -0
  290. package/external/folly/folly/concurrency/test/ConcurrentHashMapTest.cpp +1242 -0
  291. package/external/folly/folly/concurrency/test/CoreCachedSharedPtrTest.cpp +408 -0
  292. package/external/folly/folly/concurrency/test/DynamicBoundedQueueTest.cpp +984 -0
  293. package/external/folly/folly/concurrency/test/PriorityUnboundedQueueSetTest.cpp +73 -0
  294. package/external/folly/folly/concurrency/test/ProcessLocalUniqueIdTest.cpp +66 -0
  295. package/external/folly/folly/concurrency/test/SingletonRelaxedCounterBench.cpp +101 -0
  296. package/external/folly/folly/concurrency/test/SingletonRelaxedCounterTest.cpp +185 -0
  297. package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedBench.cpp +76 -0
  298. package/external/folly/folly/concurrency/test/ThreadCachedSynchronizedTest.cpp +93 -0
  299. package/external/folly/folly/concurrency/test/UnboundedQueueTest.cpp +1302 -0
  300. package/external/folly/folly/container/Access.h +57 -0
  301. package/external/folly/folly/container/Array.h +87 -0
  302. package/external/folly/folly/container/BUCK +353 -0
  303. package/external/folly/folly/container/BitIterator.h +203 -0
  304. package/external/folly/folly/container/Enumerate.h +162 -0
  305. package/external/folly/folly/container/EvictingCacheMap.h +730 -0
  306. package/external/folly/folly/container/F14.md +300 -0
  307. package/external/folly/folly/container/F14Map-fwd.h +113 -0
  308. package/external/folly/folly/container/F14Map.h +2108 -0
  309. package/external/folly/folly/container/F14Set-fwd.h +95 -0
  310. package/external/folly/folly/container/F14Set.h +1603 -0
  311. package/external/folly/folly/container/FBVector.h +1711 -0
  312. package/external/folly/folly/container/Foreach-inl.h +316 -0
  313. package/external/folly/folly/container/Foreach.h +209 -0
  314. package/external/folly/folly/container/HeterogeneousAccess-fwd.h +33 -0
  315. package/external/folly/folly/container/HeterogeneousAccess.h +171 -0
  316. package/external/folly/folly/container/IntrusiveHeap.h +268 -0
  317. package/external/folly/folly/container/IntrusiveList.h +131 -0
  318. package/external/folly/folly/container/Iterator.h +843 -0
  319. package/external/folly/folly/container/MapUtil.h +376 -0
  320. package/external/folly/folly/container/Merge.h +90 -0
  321. package/external/folly/folly/container/RegexMatchCache.cpp +521 -0
  322. package/external/folly/folly/container/RegexMatchCache.h +699 -0
  323. package/external/folly/folly/container/Reserve.h +109 -0
  324. package/external/folly/folly/container/SparseByteSet.h +123 -0
  325. package/external/folly/folly/container/View.h +81 -0
  326. package/external/folly/folly/container/WeightedEvictingCacheMap.h +651 -0
  327. package/external/folly/folly/container/detail/BUCK +115 -0
  328. package/external/folly/folly/container/detail/BitIteratorDetail.h +87 -0
  329. package/external/folly/folly/container/detail/F14Defaults.h +34 -0
  330. package/external/folly/folly/container/detail/F14IntrinsicsAvailability.h +67 -0
  331. package/external/folly/folly/container/detail/F14MapFallback.h +717 -0
  332. package/external/folly/folly/container/detail/F14Mask.h +235 -0
  333. package/external/folly/folly/container/detail/F14Policy.h +1523 -0
  334. package/external/folly/folly/container/detail/F14SetFallback.h +528 -0
  335. package/external/folly/folly/container/detail/F14Table.cpp +71 -0
  336. package/external/folly/folly/container/detail/F14Table.h +2680 -0
  337. package/external/folly/folly/container/detail/Util.h +303 -0
  338. package/external/folly/folly/container/detail/tape_detail.h +135 -0
  339. package/external/folly/folly/container/detail/test/BUCK +14 -0
  340. package/external/folly/folly/container/detail/test/F14DetailTest.cpp +47 -0
  341. package/external/folly/folly/container/heap_vector_types.h +1683 -0
  342. package/external/folly/folly/container/range_traits.h +81 -0
  343. package/external/folly/folly/container/small_vector.h +1476 -0
  344. package/external/folly/folly/container/sorted_vector_types.h +1652 -0
  345. package/external/folly/folly/container/span.h +408 -0
  346. package/external/folly/folly/container/tape.h +608 -0
  347. package/external/folly/folly/container/test/.clang-tidy +12 -0
  348. package/external/folly/folly/container/test/AccessTest.cpp +138 -0
  349. package/external/folly/folly/container/test/ArrayTest.cpp +84 -0
  350. package/external/folly/folly/container/test/BUCK +568 -0
  351. package/external/folly/folly/container/test/BitIteratorBench.cpp +112 -0
  352. package/external/folly/folly/container/test/BitIteratorTest.cpp +109 -0
  353. package/external/folly/folly/container/test/EnumerateTest.cpp +294 -0
  354. package/external/folly/folly/container/test/EvictingCacheMapBench.cpp +80 -0
  355. package/external/folly/folly/container/test/EvictingCacheMapTest.cpp +842 -0
  356. package/external/folly/folly/container/test/F14AsanSupportTest.cpp +143 -0
  357. package/external/folly/folly/container/test/F14FwdTest.cpp +37 -0
  358. package/external/folly/folly/container/test/F14InterprocessTest.cpp +404 -0
  359. package/external/folly/folly/container/test/F14MapTest.cpp +2543 -0
  360. package/external/folly/folly/container/test/F14PolicyTest.cpp +49 -0
  361. package/external/folly/folly/container/test/F14SetTest.cpp +1738 -0
  362. package/external/folly/folly/container/test/F14SmallOverheads.cpp +215 -0
  363. package/external/folly/folly/container/test/F14TestUtil.h +117 -0
  364. package/external/folly/folly/container/test/FBVectorBenchmark.cpp +380 -0
  365. package/external/folly/folly/container/test/FBVectorBenchmarks.cpp.h +100 -0
  366. package/external/folly/folly/container/test/FBVectorTest.cpp +326 -0
  367. package/external/folly/folly/container/test/FBVectorTests.cpp.h +304 -0
  368. package/external/folly/folly/container/test/ForeachBenchmark.cpp +388 -0
  369. package/external/folly/folly/container/test/ForeachTest.cpp +338 -0
  370. package/external/folly/folly/container/test/HashMapsBench.cpp +458 -0
  371. package/external/folly/folly/container/test/HeterogeneousAccessTest.cpp +242 -0
  372. package/external/folly/folly/container/test/IntrusiveHeapTest.cpp +262 -0
  373. package/external/folly/folly/container/test/IteratorTest.cpp +989 -0
  374. package/external/folly/folly/container/test/MapUtilTest.cpp +365 -0
  375. package/external/folly/folly/container/test/MergeTest.cpp +66 -0
  376. package/external/folly/folly/container/test/RegexMatchCacheTest.cpp +634 -0
  377. package/external/folly/folly/container/test/ReserveTest.cpp +173 -0
  378. package/external/folly/folly/container/test/SparseByteSetBenchmark.cpp +153 -0
  379. package/external/folly/folly/container/test/SparseByteSetTest.cpp +117 -0
  380. package/external/folly/folly/container/test/TrackingTypes.h +584 -0
  381. package/external/folly/folly/container/test/UtilTest.cpp +609 -0
  382. package/external/folly/folly/container/test/WeightedEvictingCacheMapTest.cpp +800 -0
  383. package/external/folly/folly/container/test/heap_vector_types_test.cpp +1774 -0
  384. package/external/folly/folly/container/test/range_traits_test.cpp +59 -0
  385. package/external/folly/folly/container/test/small_vector_test.cpp +1571 -0
  386. package/external/folly/folly/container/test/sorted_vector_test.cpp +1589 -0
  387. package/external/folly/folly/container/test/span_test.cpp +520 -0
  388. package/external/folly/folly/container/test/tape_bench.cpp +200 -0
  389. package/external/folly/folly/container/test/tape_test.cpp +590 -0
  390. package/external/folly/folly/defs.bzl +238 -0
  391. package/external/folly/folly/detail/AsyncTrace.cpp +36 -0
  392. package/external/folly/folly/detail/AsyncTrace.h +44 -0
  393. package/external/folly/folly/detail/AtomicHashUtils.h +42 -0
  394. package/external/folly/folly/detail/AtomicUnorderedMapUtils.h +80 -0
  395. package/external/folly/folly/detail/BUCK +406 -0
  396. package/external/folly/folly/detail/DiscriminatedPtrDetail.h +172 -0
  397. package/external/folly/folly/detail/FileUtilDetail.cpp +63 -0
  398. package/external/folly/folly/detail/FileUtilDetail.h +85 -0
  399. package/external/folly/folly/detail/FileUtilVectorDetail.h +81 -0
  400. package/external/folly/folly/detail/FingerprintPolynomial.h +132 -0
  401. package/external/folly/folly/detail/Futex-inl.h +123 -0
  402. package/external/folly/folly/detail/Futex.cpp +273 -0
  403. package/external/folly/folly/detail/Futex.h +109 -0
  404. package/external/folly/folly/detail/GroupVarintDetail.h +101 -0
  405. package/external/folly/folly/detail/IPAddress.cpp +37 -0
  406. package/external/folly/folly/detail/IPAddress.h +57 -0
  407. package/external/folly/folly/detail/IPAddressSource.h +278 -0
  408. package/external/folly/folly/detail/Iterators.h +156 -0
  409. package/external/folly/folly/detail/MPMCPipelineDetail.h +122 -0
  410. package/external/folly/folly/detail/MemoryIdler.cpp +233 -0
  411. package/external/folly/folly/detail/MemoryIdler.h +216 -0
  412. package/external/folly/folly/detail/PerfScoped.cpp +112 -0
  413. package/external/folly/folly/detail/PerfScoped.h +70 -0
  414. package/external/folly/folly/detail/PolyDetail.h +921 -0
  415. package/external/folly/folly/detail/RangeCommon.cpp +55 -0
  416. package/external/folly/folly/detail/RangeCommon.h +93 -0
  417. package/external/folly/folly/detail/RangeSse42.cpp +198 -0
  418. package/external/folly/folly/detail/RangeSse42.h +30 -0
  419. package/external/folly/folly/detail/SimpleSimdStringUtils.cpp +31 -0
  420. package/external/folly/folly/detail/SimpleSimdStringUtils.h +27 -0
  421. package/external/folly/folly/detail/SimpleSimdStringUtilsImpl.h +63 -0
  422. package/external/folly/folly/detail/Singleton.h +34 -0
  423. package/external/folly/folly/detail/SlowFingerprint.h +90 -0
  424. package/external/folly/folly/detail/SocketFastOpen.cpp +175 -0
  425. package/external/folly/folly/detail/SocketFastOpen.h +89 -0
  426. package/external/folly/folly/detail/SplitStringSimd.cpp +84 -0
  427. package/external/folly/folly/detail/SplitStringSimd.h +151 -0
  428. package/external/folly/folly/detail/SplitStringSimdImpl.h +149 -0
  429. package/external/folly/folly/detail/Sse.cpp +35 -0
  430. package/external/folly/folly/detail/Sse.h +45 -0
  431. package/external/folly/folly/detail/StaticSingletonManager.cpp +119 -0
  432. package/external/folly/folly/detail/StaticSingletonManager.h +298 -0
  433. package/external/folly/folly/detail/ThreadLocalDetail.cpp +492 -0
  434. package/external/folly/folly/detail/ThreadLocalDetail.h +800 -0
  435. package/external/folly/folly/detail/TrapOnAvx512.cpp +41 -0
  436. package/external/folly/folly/detail/TrapOnAvx512.h +21 -0
  437. package/external/folly/folly/detail/TurnSequencer.h +295 -0
  438. package/external/folly/folly/detail/TypeList.h +551 -0
  439. package/external/folly/folly/detail/UniqueInstance.cpp +136 -0
  440. package/external/folly/folly/detail/UniqueInstance.h +68 -0
  441. package/external/folly/folly/detail/base64_detail/BUCK +102 -0
  442. package/external/folly/folly/detail/base64_detail/Base64Api.cpp +40 -0
  443. package/external/folly/folly/detail/base64_detail/Base64Api.h +101 -0
  444. package/external/folly/folly/detail/base64_detail/Base64Common.h +80 -0
  445. package/external/folly/folly/detail/base64_detail/Base64Constants.h +79 -0
  446. package/external/folly/folly/detail/base64_detail/Base64HiddenConstants.h +129 -0
  447. package/external/folly/folly/detail/base64_detail/Base64SWAR.cpp +161 -0
  448. package/external/folly/folly/detail/base64_detail/Base64SWAR.h +32 -0
  449. package/external/folly/folly/detail/base64_detail/Base64Scalar.h +262 -0
  450. package/external/folly/folly/detail/base64_detail/Base64Simd.h +102 -0
  451. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.cpp +42 -0
  452. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2.h +33 -0
  453. package/external/folly/folly/detail/base64_detail/Base64_SSE4_2_Platform.h +167 -0
  454. package/external/folly/folly/detail/base64_detail/README.md +392 -0
  455. package/external/folly/folly/detail/base64_detail/tests/BUCK +36 -0
  456. package/external/folly/folly/detail/base64_detail/tests/Base64AgainstScalarTest.cpp +141 -0
  457. package/external/folly/folly/detail/base64_detail/tests/Base64PlatformTest.cpp +273 -0
  458. package/external/folly/folly/detail/base64_detail/tests/Base64SpecialCasesTest.cpp +555 -0
  459. package/external/folly/folly/detail/test/AsyncTraceTest.cpp +43 -0
  460. package/external/folly/folly/detail/test/BUCK +118 -0
  461. package/external/folly/folly/detail/test/FileUtilDetailTest.cpp +56 -0
  462. package/external/folly/folly/detail/test/PerfScopedTest.cpp +107 -0
  463. package/external/folly/folly/detail/test/SimpleSimdStringUtilsTest.cpp +92 -0
  464. package/external/folly/folly/detail/test/SplitStringSimdTest.cpp +242 -0
  465. package/external/folly/folly/detail/test/StaticSingletonManagerTest.cpp +121 -0
  466. package/external/folly/folly/detail/test/ThreadLocalBenchmark.cpp +116 -0
  467. package/external/folly/folly/detail/test/ThreadLocalDetailTest.cpp +194 -0
  468. package/external/folly/folly/detail/test/TrapOnAvx512TestNegative.cpp +29 -0
  469. package/external/folly/folly/detail/test/UniqueInstanceTest.cpp +60 -0
  470. package/external/folly/folly/detail/thread_local_globals.cpp +69 -0
  471. package/external/folly/folly/detail/thread_local_globals.h +36 -0
  472. package/external/folly/folly/docs/AtomicHashMap.md +134 -0
  473. package/external/folly/folly/docs/Benchmark.md +310 -0
  474. package/external/folly/folly/docs/Conv.md +291 -0
  475. package/external/folly/folly/docs/Dynamic.md +220 -0
  476. package/external/folly/folly/docs/DynamicConverter.md +71 -0
  477. package/external/folly/folly/docs/Executors.md +63 -0
  478. package/external/folly/folly/docs/FBString.md +46 -0
  479. package/external/folly/folly/docs/FBVector.md +200 -0
  480. package/external/folly/folly/docs/Fbvector--graphical_solutions.png +0 -0
  481. package/external/folly/folly/docs/Format.md +177 -0
  482. package/external/folly/folly/docs/Function.md +92 -0
  483. package/external/folly/folly/docs/Futures.md +263 -0
  484. package/external/folly/folly/docs/GroupVarint.md +46 -0
  485. package/external/folly/folly/docs/Histogram.md +104 -0
  486. package/external/folly/folly/docs/MapUtils.md +80 -0
  487. package/external/folly/folly/docs/Overview.md +263 -0
  488. package/external/folly/folly/docs/PackedSyncPtr.md +77 -0
  489. package/external/folly/folly/docs/Poly.md +500 -0
  490. package/external/folly/folly/docs/ProducerConsumerQueue.md +82 -0
  491. package/external/folly/folly/docs/Rcu.md +218 -0
  492. package/external/folly/folly/docs/SmallLocks.md +24 -0
  493. package/external/folly/folly/docs/Synchronized.md +793 -0
  494. package/external/folly/folly/docs/ThreadCachedInt.md +98 -0
  495. package/external/folly/folly/docs/ThreadLocal.md +105 -0
  496. package/external/folly/folly/docs/Traits.md +161 -0
  497. package/external/folly/folly/docs/small_vector.md +64 -0
  498. package/external/folly/folly/docs/style.css +23 -0
  499. package/external/folly/folly/dynamic-inl.h +17 -0
  500. package/external/folly/folly/dynamic.h +17 -0
  501. package/external/folly/folly/folly_extended_library.bzl +28 -0
  502. package/external/folly/folly/functional/ApplyTuple.h +204 -0
  503. package/external/folly/folly/functional/BUCK +57 -0
  504. package/external/folly/folly/functional/Invoke.h +880 -0
  505. package/external/folly/folly/functional/Partial.h +130 -0
  506. package/external/folly/folly/functional/protocol.h +203 -0
  507. package/external/folly/folly/functional/test/ApplyTupleTest.cpp +549 -0
  508. package/external/folly/folly/functional/test/BUCK +57 -0
  509. package/external/folly/folly/functional/test/InvokeTest.cpp +483 -0
  510. package/external/folly/folly/functional/test/PartialTest.cpp +141 -0
  511. package/external/folly/folly/functional/test/protocol_test.cpp +177 -0
  512. package/external/folly/folly/functional/test/traits_test.cpp +551 -0
  513. package/external/folly/folly/functional/traits.h +675 -0
  514. package/external/folly/folly/hash/BUCK +86 -0
  515. package/external/folly/folly/hash/Checksum.cpp +275 -0
  516. package/external/folly/folly/hash/Checksum.h +94 -0
  517. package/external/folly/folly/hash/FarmHash.h +46 -0
  518. package/external/folly/folly/hash/Hash.h +1045 -0
  519. package/external/folly/folly/hash/MurmurHash.h +86 -0
  520. package/external/folly/folly/hash/SpookyHashV1.cpp +391 -0
  521. package/external/folly/folly/hash/SpookyHashV1.h +307 -0
  522. package/external/folly/folly/hash/SpookyHashV2.cpp +392 -0
  523. package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/hash/SpookyHashV2.h +6 -1
  524. package/external/folly/folly/hash/detail/BUCK +26 -0
  525. package/external/folly/folly/hash/detail/ChecksumDetail.cpp +296 -0
  526. package/external/folly/folly/hash/detail/ChecksumDetail.h +137 -0
  527. package/external/folly/folly/hash/detail/Crc32CombineDetail.cpp +191 -0
  528. package/external/folly/folly/hash/detail/Crc32cDetail.cpp +303 -0
  529. package/external/folly/folly/hash/test/BUCK +132 -0
  530. package/external/folly/folly/hash/test/ChecksumBenchmark.cpp +91 -0
  531. package/external/folly/folly/hash/test/ChecksumTest.cpp +587 -0
  532. package/external/folly/folly/hash/test/FarmHashTest.cpp +41 -0
  533. package/external/folly/folly/hash/test/HashBenchmark.cpp +238 -0
  534. package/external/folly/folly/hash/test/HashTest.cpp +997 -0
  535. package/external/folly/folly/hash/test/MurmurHashTest.cpp +76 -0
  536. package/external/folly/folly/hash/test/SpookyHashV1Test.cpp +559 -0
  537. package/external/folly/folly/hash/test/SpookyHashV2Test.cpp +549 -0
  538. package/external/folly/folly/hash/test/traits_test.cpp +69 -0
  539. package/external/folly/folly/hash/traits.h +115 -0
  540. package/external/folly/folly/json/BUCK +155 -0
  541. package/external/folly/folly/json/DynamicConverter.h +464 -0
  542. package/external/folly/folly/json/DynamicParser-inl.h +316 -0
  543. package/external/folly/folly/json/DynamicParser.cpp +198 -0
  544. package/external/folly/folly/json/DynamicParser.h +394 -0
  545. package/external/folly/folly/json/JSONSchema.cpp +1030 -0
  546. package/external/folly/folly/json/JSONSchema.h +73 -0
  547. package/external/folly/folly/json/JsonMockUtil.h +73 -0
  548. package/external/folly/folly/json/JsonTestUtil.cpp +167 -0
  549. package/external/folly/folly/json/JsonTestUtil.h +88 -0
  550. package/external/folly/folly/json/bser/BUCK +24 -0
  551. package/external/folly/folly/json/bser/Bser.h +107 -0
  552. package/external/folly/folly/json/bser/Dump.cpp +253 -0
  553. package/external/folly/folly/json/bser/Load.cpp +246 -0
  554. package/external/folly/folly/json/bser/test/BUCK +14 -0
  555. package/external/folly/folly/json/bser/test/BserTest.cpp +149 -0
  556. package/external/folly/folly/json/dynamic.cpp +552 -0
  557. package/external/folly/folly/json/dynamic.h +1346 -0
  558. package/external/folly/folly/json/json.h +238 -0
  559. package/external/folly/folly/json/json_patch.cpp +325 -0
  560. package/external/folly/folly/json/json_patch.h +126 -0
  561. package/external/folly/folly/json/json_pointer.cpp +114 -0
  562. package/external/folly/folly/json/json_pointer.h +87 -0
  563. package/external/folly/folly/json/test/BUCK +147 -0
  564. package/external/folly/folly/json/test/DynamicBenchmark.cpp +146 -0
  565. package/external/folly/folly/json/test/DynamicConverterTest.cpp +518 -0
  566. package/external/folly/folly/json/test/DynamicOtherTest.cpp +344 -0
  567. package/external/folly/folly/json/test/DynamicParserTest.cpp +443 -0
  568. package/external/folly/folly/json/test/DynamicTest.cpp +1647 -0
  569. package/external/folly/folly/json/test/JSONSchemaTest.cpp +450 -0
  570. package/external/folly/folly/json/test/JsonBenchmark.cpp +264 -0
  571. package/external/folly/folly/json/test/JsonOtherTest.cpp +51 -0
  572. package/external/folly/folly/json/test/JsonTest.cpp +1153 -0
  573. package/external/folly/folly/json/test/JsonTestUtilTest.cpp +97 -0
  574. package/external/folly/folly/json/test/json_patch_test.cpp +361 -0
  575. package/external/folly/folly/json/test/json_pointer_test.cpp +58 -0
  576. package/external/folly/folly/json/tool/BUCK +13 -0
  577. package/external/folly/folly/json/tool/JSONSchemaTester.cpp +58 -0
  578. package/external/folly/folly/json.h +17 -0
  579. package/external/folly/folly/json_patch.h +17 -0
  580. package/external/folly/folly/json_pointer.h +17 -0
  581. package/external/folly/folly/lang/Access.h +29 -0
  582. package/external/folly/folly/lang/Align.h +240 -0
  583. package/external/folly/folly/lang/Aligned.h +92 -0
  584. package/external/folly/folly/lang/Assume.h +82 -0
  585. package/external/folly/folly/lang/BUCK +287 -0
  586. package/external/folly/folly/lang/Badge.h +108 -0
  587. package/external/folly/folly/lang/Bits.h +570 -0
  588. package/external/folly/folly/lang/BitsClass.h +312 -0
  589. package/external/folly/folly/lang/Builtin.h +74 -0
  590. package/external/folly/folly/lang/CArray.h +34 -0
  591. package/external/folly/folly/lang/CString.cpp +86 -0
  592. package/external/folly/folly/lang/CString.h +55 -0
  593. package/external/folly/folly/lang/Cast.h +51 -0
  594. package/external/folly/folly/lang/CheckedMath.h +253 -0
  595. package/external/folly/folly/lang/CustomizationPoint.h +58 -0
  596. package/external/folly/folly/lang/Exception.cpp +822 -0
  597. package/external/folly/folly/lang/Exception.h +716 -0
  598. package/external/folly/folly/lang/Extern.h +55 -0
  599. package/external/folly/folly/lang/Hint-inl.h +144 -0
  600. package/external/folly/folly/lang/Hint.h +238 -0
  601. package/external/folly/folly/lang/Keep.h +98 -0
  602. package/external/folly/folly/lang/New.h +124 -0
  603. package/external/folly/folly/lang/Ordering.h +140 -0
  604. package/external/folly/folly/lang/Pretty.h +159 -0
  605. package/external/folly/folly/lang/PropagateConst.h +413 -0
  606. package/external/folly/folly/lang/RValueReferenceWrapper.h +152 -0
  607. package/external/folly/folly/lang/SafeAssert.cpp +589 -0
  608. package/external/folly/folly/lang/StaticConst.h +33 -0
  609. package/external/folly/folly/lang/Thunk.h +100 -0
  610. package/external/folly/folly/lang/TypeInfo.h +58 -0
  611. package/external/folly/folly/lang/UncaughtExceptions.cpp +17 -0
  612. package/external/folly/folly/lang/UncaughtExceptions.h +19 -0
  613. package/external/folly/folly/lang/test/AlignTest.cpp +87 -0
  614. package/external/folly/folly/lang/test/AlignedTest.cpp +130 -0
  615. package/external/folly/folly/lang/test/BUCK +258 -0
  616. package/external/folly/folly/lang/test/BadgeTest.cpp +89 -0
  617. package/external/folly/folly/lang/test/BitsBenchmark.cpp +164 -0
  618. package/external/folly/folly/lang/test/BitsClassBenchmark.cpp +122 -0
  619. package/external/folly/folly/lang/test/BitsClassTest.cpp +379 -0
  620. package/external/folly/folly/lang/test/BitsTest.cpp +577 -0
  621. package/external/folly/folly/lang/test/CStringTest.cpp +60 -0
  622. package/external/folly/folly/lang/test/CastTest.cpp +47 -0
  623. package/external/folly/folly/lang/test/CheckedMathTest.cpp +394 -0
  624. package/external/folly/folly/lang/test/ExceptionBench.cpp +427 -0
  625. package/external/folly/folly/lang/test/ExceptionTest.cpp +413 -0
  626. package/external/folly/folly/lang/test/ExternTest.cpp +39 -0
  627. package/external/folly/folly/lang/test/HintTest.cpp +100 -0
  628. package/external/folly/folly/lang/test/NewTest.cpp +38 -0
  629. package/external/folly/folly/lang/test/OrderingTest.cpp +105 -0
  630. package/external/folly/folly/lang/test/PrettyTest.cpp +44 -0
  631. package/external/folly/folly/lang/test/PropagateConstTest.cpp +356 -0
  632. package/external/folly/folly/lang/test/RValueReferenceWrapperTest.cpp +85 -0
  633. package/external/folly/folly/lang/test/SafeAssertTest.cpp +75 -0
  634. package/external/folly/folly/lang/test/ThunkTest.cpp +105 -0
  635. package/external/folly/folly/lang/test/ToAsciiBench.cpp +466 -0
  636. package/external/folly/folly/lang/test/ToAsciiTest.cpp +266 -0
  637. package/external/folly/folly/lang/test/TypeInfoTest.cpp +56 -0
  638. package/external/folly/folly/memcpy.S +292 -0
  639. package/external/folly/folly/memcpy_select_aarch64.cpp +145 -0
  640. package/external/folly/folly/memory/Arena-inl.h +83 -0
  641. package/external/folly/folly/memory/Arena.h +325 -0
  642. package/external/folly/folly/memory/BUCK +191 -0
  643. package/external/folly/folly/memory/JemallocHugePageAllocator.cpp +449 -0
  644. package/external/folly/folly/memory/JemallocHugePageAllocator.h +105 -0
  645. package/external/folly/folly/memory/JemallocHugePageAllocatorTest.cpp +341 -0
  646. package/external/folly/folly/memory/JemallocNodumpAllocator.cpp +176 -0
  647. package/external/folly/folly/memory/JemallocNodumpAllocator.h +119 -0
  648. package/external/folly/folly/memory/JemallocNodumpAllocatorTest.cpp +61 -0
  649. package/external/folly/folly/memory/MallctlHelper.cpp +37 -0
  650. package/external/folly/folly/memory/MallctlHelper.h +167 -0
  651. package/external/folly/folly/memory/Malloc.h +551 -0
  652. package/external/folly/folly/memory/MemoryResource.h +57 -0
  653. package/external/folly/folly/memory/ReentrantAllocator.cpp +162 -0
  654. package/external/folly/folly/memory/ReentrantAllocator.h +261 -0
  655. package/external/folly/folly/memory/SanitizeAddress.cpp +75 -0
  656. package/external/folly/folly/memory/SanitizeAddress.h +117 -0
  657. package/external/folly/folly/memory/SanitizeLeak.cpp +119 -0
  658. package/external/folly/folly/memory/SanitizeLeak.h +108 -0
  659. package/external/folly/folly/memory/ThreadCachedArena.cpp +53 -0
  660. package/external/folly/folly/memory/ThreadCachedArena.h +90 -0
  661. package/external/folly/folly/memory/UninitializedMemoryHacks.h +426 -0
  662. package/external/folly/folly/memory/detail/BUCK +10 -0
  663. package/external/folly/folly/memory/detail/MallocImpl.cpp +52 -0
  664. package/external/folly/folly/memory/detail/MallocImpl.h +97 -0
  665. package/external/folly/folly/memory/not_null-inl.h +522 -0
  666. package/external/folly/folly/memory/not_null.h +449 -0
  667. package/external/folly/folly/memory/test/ArenaTest.cpp +354 -0
  668. package/external/folly/folly/memory/test/BUCK +146 -0
  669. package/external/folly/folly/memory/test/MallctlHelperTest.cpp +169 -0
  670. package/external/folly/folly/memory/test/MallocBenchmark.cpp +91 -0
  671. package/external/folly/folly/memory/test/MallocTest.cpp +78 -0
  672. package/external/folly/folly/memory/test/MemoryResourceTest.cpp +31 -0
  673. package/external/folly/folly/memory/test/ReentrantAllocatorTest.cpp +144 -0
  674. package/external/folly/folly/memory/test/SanitizeAddressTest.cpp +67 -0
  675. package/external/folly/folly/memory/test/SanitizeLeakTest.cpp +139 -0
  676. package/external/folly/folly/memory/test/ThreadCachedArenaTest.cpp +276 -0
  677. package/external/folly/folly/memory/test/UninitializedMemoryHacksODR.cpp +21 -0
  678. package/external/folly/folly/memory/test/UninitializedMemoryHacksTest.cpp +327 -0
  679. package/external/folly/folly/memory/test/not_null_test.cpp +608 -0
  680. package/external/folly/folly/memset.S +245 -0
  681. package/external/folly/folly/memset_select_aarch64.cpp +72 -0
  682. package/external/folly/folly/portability/Asm.h +50 -0
  683. package/external/folly/folly/portability/Atomic.h +31 -0
  684. package/external/folly/folly/portability/BUCK +456 -0
  685. package/external/folly/folly/portability/Builtins.cpp +31 -0
  686. package/external/folly/folly/portability/Builtins.h +161 -0
  687. package/external/folly/folly/portability/Config.h +43 -0
  688. package/external/folly/folly/portability/Constexpr.h +145 -0
  689. package/external/folly/folly/portability/Dirent.cpp +140 -0
  690. package/external/folly/folly/portability/Dirent.h +41 -0
  691. package/external/folly/folly/portability/Event.h +44 -0
  692. package/external/folly/folly/portability/Fcntl.cpp +120 -0
  693. package/external/folly/folly/portability/Fcntl.h +67 -0
  694. package/external/folly/folly/portability/Filesystem.cpp +67 -0
  695. package/external/folly/folly/portability/Filesystem.h +114 -0
  696. package/external/folly/folly/portability/FmtCompile.h +40 -0
  697. package/external/folly/folly/portability/GFlags.h +139 -0
  698. package/external/folly/folly/portability/GMock.h +35 -0
  699. package/external/folly/folly/portability/GTest.h +35 -0
  700. package/external/folly/folly/portability/IOVec.h +34 -0
  701. package/external/folly/folly/portability/Libgen.cpp +59 -0
  702. package/external/folly/folly/portability/Libgen.h +29 -0
  703. package/external/folly/folly/portability/Libunwind.h +21 -0
  704. package/external/folly/folly/portability/Malloc.cpp +31 -0
  705. package/external/folly/folly/portability/Malloc.h +53 -0
  706. package/external/folly/folly/portability/Math.h +90 -0
  707. package/external/folly/folly/portability/Memory.h +26 -0
  708. package/external/folly/folly/portability/OpenSSL.cpp +17 -0
  709. package/external/folly/folly/portability/OpenSSL.h +102 -0
  710. package/external/folly/folly/portability/PThread.cpp +697 -0
  711. package/external/folly/folly/portability/PThread.h +148 -0
  712. package/external/folly/folly/portability/README.md +21 -0
  713. package/external/folly/folly/portability/Sched.cpp +41 -0
  714. package/external/folly/folly/portability/Sched.h +45 -0
  715. package/external/folly/folly/portability/Sockets.cpp +245 -0
  716. package/external/folly/folly/portability/Sockets.h +155 -0
  717. package/external/folly/folly/portability/SourceLocation.h +49 -0
  718. package/external/folly/folly/portability/Stdio.cpp +77 -0
  719. package/external/folly/folly/portability/Stdio.h +32 -0
  720. package/external/folly/folly/portability/Stdlib.cpp +172 -0
  721. package/external/folly/folly/portability/Stdlib.h +64 -0
  722. package/external/folly/folly/portability/String.cpp +53 -0
  723. package/external/folly/folly/portability/String.h +39 -0
  724. package/external/folly/folly/portability/SysFile.cpp +46 -0
  725. package/external/folly/folly/portability/SysFile.h +27 -0
  726. package/external/folly/folly/portability/SysMembarrier.cpp +104 -0
  727. package/external/folly/folly/portability/SysMembarrier.h +26 -0
  728. package/external/folly/folly/portability/SysMman.cpp +242 -0
  729. package/external/folly/folly/portability/SysMman.h +68 -0
  730. package/external/folly/folly/portability/SysResource.cpp +108 -0
  731. package/external/folly/folly/portability/SysResource.h +71 -0
  732. package/external/folly/folly/portability/SysStat.cpp +66 -0
  733. package/external/folly/folly/portability/SysStat.h +52 -0
  734. package/external/folly/folly/portability/SysSyscall.h +73 -0
  735. package/external/folly/folly/portability/SysTime.cpp +62 -0
  736. package/external/folly/folly/portability/SysTime.h +50 -0
  737. package/external/folly/folly/portability/SysTypes.h +44 -0
  738. package/external/folly/folly/portability/SysUio.cpp +179 -0
  739. package/external/folly/folly/portability/SysUio.h +51 -0
  740. package/external/folly/folly/portability/Syslog.h +39 -0
  741. package/external/folly/folly/portability/Time.cpp +357 -0
  742. package/external/folly/folly/portability/Time.h +74 -0
  743. package/external/folly/folly/portability/Unistd.h +111 -0
  744. package/external/folly/folly/portability/Windows.h +108 -0
  745. package/external/folly/folly/portability/openat2.c +30 -0
  746. package/external/folly/folly/portability/openat2.h +39 -0
  747. package/external/folly/folly/portability/test/BUCK +59 -0
  748. package/external/folly/folly/portability/test/ConstexprTest.cpp +102 -0
  749. package/external/folly/folly/portability/test/FilesystemTest.cpp +35 -0
  750. package/external/folly/folly/portability/test/LibgenTest.cpp +35 -0
  751. package/external/folly/folly/portability/test/OpenSSLPortabilityTest.cpp +108 -0
  752. package/external/folly/folly/portability/test/PThreadTest.cpp +80 -0
  753. package/external/folly/folly/portability/test/TimeTest.cpp +90 -0
  754. package/external/folly/folly/small_vector.h +17 -0
  755. package/external/folly/folly/somerge_defs.bzl +399 -0
  756. package/external/folly/folly/sorted_vector_types.h +17 -0
  757. package/external/folly/folly/stop_watch.h +317 -0
  758. package/external/folly/folly/synchronization/AsymmetricThreadFence.cpp +91 -0
  759. package/external/folly/folly/synchronization/AsymmetricThreadFence.h +60 -0
  760. package/external/folly/folly/synchronization/AtomicNotification-inl.h +146 -0
  761. package/external/folly/folly/synchronization/AtomicNotification.cpp +34 -0
  762. package/external/folly/folly/synchronization/AtomicNotification.h +117 -0
  763. package/external/folly/folly/synchronization/AtomicRef.h +181 -0
  764. package/external/folly/folly/synchronization/AtomicStruct.h +150 -0
  765. package/external/folly/folly/synchronization/AtomicUtil-inl.h +482 -0
  766. package/external/folly/folly/synchronization/AtomicUtil.h +179 -0
  767. package/external/folly/folly/synchronization/BUCK +418 -0
  768. package/external/folly/folly/synchronization/Baton.h +419 -0
  769. package/external/folly/folly/synchronization/CallOnce.h +263 -0
  770. package/external/folly/folly/synchronization/DelayedInit.h +179 -0
  771. package/external/folly/folly/synchronization/DistributedMutex-inl.h +1744 -0
  772. package/external/folly/folly/synchronization/DistributedMutex.cpp +27 -0
  773. package/external/folly/folly/synchronization/DistributedMutex.h +342 -0
  774. package/external/folly/folly/synchronization/EventCount.h +200 -0
  775. package/external/folly/folly/synchronization/FlatCombining.h +629 -0
  776. package/external/folly/folly/synchronization/Hazptr-fwd.h +217 -0
  777. package/external/folly/folly/synchronization/Hazptr.cpp +36 -0
  778. package/external/folly/folly/synchronization/Hazptr.h +209 -0
  779. package/external/folly/folly/synchronization/HazptrDomain.cpp +68 -0
  780. package/external/folly/folly/synchronization/HazptrDomain.h +832 -0
  781. package/external/folly/folly/synchronization/HazptrHolder.h +431 -0
  782. package/external/folly/folly/synchronization/HazptrObj.h +533 -0
  783. package/external/folly/folly/synchronization/HazptrObjLinked.h +315 -0
  784. package/external/folly/folly/synchronization/HazptrRec.h +68 -0
  785. package/external/folly/folly/synchronization/HazptrThrLocal.h +180 -0
  786. package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.cpp +46 -0
  787. package/external/folly/folly/synchronization/HazptrThreadPoolExecutor.h +25 -0
  788. package/external/folly/folly/synchronization/Latch.h +160 -0
  789. package/external/folly/folly/synchronization/LifoSem.h +767 -0
  790. package/external/folly/folly/synchronization/Lock.h +887 -0
  791. package/external/folly/folly/synchronization/MicroSpinLock.h +154 -0
  792. package/external/folly/folly/synchronization/NativeSemaphore.h +187 -0
  793. package/external/folly/folly/synchronization/ParkingLot.cpp +37 -0
  794. package/external/folly/folly/synchronization/ParkingLot.h +330 -0
  795. package/external/folly/folly/synchronization/PicoSpinLock.h +167 -0
  796. package/external/folly/folly/synchronization/RWSpinLock.h +549 -0
  797. package/external/folly/folly/synchronization/Rcu.cpp +26 -0
  798. package/external/folly/folly/synchronization/Rcu.h +553 -0
  799. package/external/folly/folly/synchronization/RelaxedAtomic.h +336 -0
  800. package/external/folly/folly/synchronization/SanitizeThread.cpp +141 -0
  801. package/external/folly/folly/synchronization/SanitizeThread.h +166 -0
  802. package/external/folly/folly/synchronization/SaturatingSemaphore.h +324 -0
  803. package/external/folly/folly/synchronization/SmallLocks.h +36 -0
  804. package/external/folly/folly/synchronization/ThrottledLifoSem.h +362 -0
  805. package/external/folly/folly/synchronization/WaitOptions.cpp +25 -0
  806. package/external/folly/folly/synchronization/WaitOptions.h +75 -0
  807. package/external/folly/folly/synchronization/detail/AtomicUtils.h +59 -0
  808. package/external/folly/folly/synchronization/detail/BUCK +104 -0
  809. package/external/folly/folly/synchronization/detail/Hardware.cpp +192 -0
  810. package/external/folly/folly/synchronization/detail/Hardware.h +75 -0
  811. package/external/folly/folly/synchronization/detail/HazptrUtils.h +339 -0
  812. package/external/folly/folly/synchronization/detail/InlineFunctionRef.h +229 -0
  813. package/external/folly/folly/synchronization/detail/Sleeper.cpp +27 -0
  814. package/external/folly/folly/synchronization/detail/Sleeper.h +62 -0
  815. package/external/folly/folly/synchronization/detail/Spin.h +96 -0
  816. package/external/folly/folly/synchronization/detail/ThreadCachedLists.h +174 -0
  817. package/external/folly/folly/synchronization/detail/ThreadCachedReaders.h +189 -0
  818. package/external/folly/folly/synchronization/detail/ThreadCachedTag.h +26 -0
  819. package/external/folly/folly/synchronization/detail/test/BUCK +28 -0
  820. package/external/folly/folly/synchronization/detail/test/HardwareTest.cpp +74 -0
  821. package/external/folly/folly/synchronization/detail/test/InlineFunctionRefTest.cpp +286 -0
  822. package/external/folly/folly/synchronization/example/BUCK +27 -0
  823. package/external/folly/folly/synchronization/example/HazptrLockFreeLIFO.h +88 -0
  824. package/external/folly/folly/synchronization/example/HazptrSWMRSet.h +133 -0
  825. package/external/folly/folly/synchronization/example/HazptrWideCAS.h +62 -0
  826. package/external/folly/folly/synchronization/test/AtomicNotificationTest.cpp +236 -0
  827. package/external/folly/folly/synchronization/test/AtomicRefTest.cpp +170 -0
  828. package/external/folly/folly/synchronization/test/AtomicStructTest.cpp +65 -0
  829. package/external/folly/folly/synchronization/test/AtomicUtilBench.cpp +457 -0
  830. package/external/folly/folly/synchronization/test/AtomicUtilTest.cpp +650 -0
  831. package/external/folly/folly/synchronization/test/BUCK +495 -0
  832. package/external/folly/folly/synchronization/test/Barrier.h +52 -0
  833. package/external/folly/folly/synchronization/test/BarrierTest.cpp +56 -0
  834. package/external/folly/folly/synchronization/test/BatonBenchmark.cpp +77 -0
  835. package/external/folly/folly/synchronization/test/BatonTest.cpp +164 -0
  836. package/external/folly/folly/synchronization/test/BatonTestHelpers.h +118 -0
  837. package/external/folly/folly/synchronization/test/CallOnceBenchmark.cpp +72 -0
  838. package/external/folly/folly/synchronization/test/CallOnceTest.cpp +153 -0
  839. package/external/folly/folly/synchronization/test/DelayedInitTest.cpp +281 -0
  840. package/external/folly/folly/synchronization/test/DistributedMutexTest.cpp +2074 -0
  841. package/external/folly/folly/synchronization/test/EventCountTest.cpp +124 -0
  842. package/external/folly/folly/synchronization/test/FlatCombiningBenchmark.cpp +1789 -0
  843. package/external/folly/folly/synchronization/test/FlatCombiningExamples.h +222 -0
  844. package/external/folly/folly/synchronization/test/FlatCombiningTest.cpp +121 -0
  845. package/external/folly/folly/synchronization/test/FlatCombiningTestHelpers.h +227 -0
  846. package/external/folly/folly/synchronization/test/HazptrTest.cpp +1689 -0
  847. package/external/folly/folly/synchronization/test/LatchTest.cpp +224 -0
  848. package/external/folly/folly/synchronization/test/LifoSemBench.cpp +185 -0
  849. package/external/folly/folly/synchronization/test/LifoSemTests.cpp +353 -0
  850. package/external/folly/folly/synchronization/test/LockTest.cpp +1239 -0
  851. package/external/folly/folly/synchronization/test/NativeSemaphoreTest.cpp +37 -0
  852. package/external/folly/folly/synchronization/test/ParkingLotBenchmark.cpp +239 -0
  853. package/external/folly/folly/synchronization/test/ParkingLotTest.cpp +170 -0
  854. package/external/folly/folly/synchronization/test/RWSpinLockTest.cpp +235 -0
  855. package/external/folly/folly/synchronization/test/RcuBench.cpp +66 -0
  856. package/external/folly/folly/synchronization/test/RcuTest.cpp +330 -0
  857. package/external/folly/folly/synchronization/test/RelaxedAtomicTest.cpp +389 -0
  858. package/external/folly/folly/synchronization/test/SaturatingSemaphoreTest.cpp +166 -0
  859. package/external/folly/folly/synchronization/test/Semaphore.h +242 -0
  860. package/external/folly/folly/synchronization/test/SemaphoreTest.cpp +271 -0
  861. package/external/folly/folly/synchronization/test/SmallLocksBenchmark.cpp +1296 -0
  862. package/external/folly/folly/synchronization/test/SmallLocksTest.cpp +510 -0
  863. package/external/folly/folly/synchronization/test/ThreadCachedEpochBench.h +67 -0
  864. package/external/folly/folly/synchronization/test/ThreadCachedReadersBench.cpp +42 -0
  865. package/external/folly/folly/synchronization/test/ThreadCachedReadersTest.cpp +52 -0
  866. package/external/folly/folly/synchronization/test/ThrottledLifoSemTest.cpp +243 -0
  867. package/external/folly/folly/system/AtFork.cpp +205 -0
  868. package/external/folly/folly/system/AtFork.h +116 -0
  869. package/external/folly/folly/system/AuxVector.h +198 -0
  870. package/external/folly/folly/system/BUCK +144 -0
  871. package/external/folly/folly/system/EnvUtil.cpp +93 -0
  872. package/external/folly/folly/system/EnvUtil.h +113 -0
  873. package/external/folly/folly/system/HardwareConcurrency.cpp +39 -0
  874. package/external/folly/folly/system/HardwareConcurrency.h +23 -0
  875. package/external/folly/folly/system/MemoryMapping.cpp +477 -0
  876. package/external/folly/folly/system/MemoryMapping.h +287 -0
  877. package/external/folly/folly/system/Pid.cpp +87 -0
  878. package/external/folly/folly/system/Pid.h +34 -0
  879. package/external/folly/folly/system/Shell.cpp +33 -0
  880. package/external/folly/folly/system/Shell.h +93 -0
  881. package/external/folly/folly/system/ThreadId.cpp +89 -0
  882. package/external/folly/folly/system/ThreadId.h +62 -0
  883. package/external/folly/folly/system/ThreadName.cpp +330 -0
  884. package/external/folly/folly/system/ThreadName.h +72 -0
  885. package/external/folly/folly/system/test/AtForkTest.cpp +309 -0
  886. package/external/folly/folly/system/test/AuxVectorTest.cpp +55 -0
  887. package/external/folly/folly/system/test/BUCK +120 -0
  888. package/external/folly/folly/system/test/EnvUtilSubprocess.cpp +26 -0
  889. package/external/folly/folly/system/test/EnvUtilTest.cpp +197 -0
  890. package/external/folly/folly/system/test/MemoryMappingTest.cpp +179 -0
  891. package/external/folly/folly/system/test/PidTest.cpp +46 -0
  892. package/external/folly/folly/system/test/ShellTest.cpp +66 -0
  893. package/external/folly/folly/system/test/ThreadIdTest.cpp +114 -0
  894. package/external/folly/folly/system/test/ThreadNameTest.cpp +85 -0
  895. package/external/folly/folly.vcxitems +164 -0
  896. package/external/folly/static/logo.svg +1 -0
  897. package/external/folly/sync-config.json +8 -0
  898. package/package.json +3 -3
  899. package/template/cpp-app/proj/MyApp.sln +0 -33
  900. package/template/cpp-lib/proj/MyLib.sln +0 -33
  901. package/template/cs-app/proj/MyApp.sln +0 -33
  902. package/template/cs-lib/proj/MyLib.sln +0 -33
  903. package/templates/cpp-app/windows/MyApp.sln +0 -33
  904. package/templates/cpp-lib/example/metro.config.js +31 -6
  905. package/templates/cpp-lib/windows/MyLib.sln +0 -33
  906. package/Folly/Folly.vcxproj +0 -383
  907. package/Folly/Folly.vcxproj.filters +0 -558
  908. package/Folly/Folly.win32.vcxproj +0 -11
  909. package/Folly/packages.lock.win32.json +0 -20
  910. package/Scripts/Warm-RnwFeedCache.ps1 +0 -413
  911. package/fmt/fmt.vcxproj +0 -163
  912. package/fmt/fmt.vcxproj.filters +0 -59
  913. package/fmt/fmt.win32.vcxproj +0 -10
  914. package/fmt/pch.cpp +0 -4
  915. package/fmt/pch.h +0 -2
  916. /package/{Folly → external/folly}/Folly.natvis +0 -0
  917. /package/{Folly → external/folly}/cgmanifest.json +0 -0
  918. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/ConstexprMath.h +0 -0
  919. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/Conv.cpp +0 -0
  920. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/chrono/Hardware.h +0 -0
  921. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/concurrency/CacheLocality.cpp +0 -0
  922. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/json/dynamic-inl.h +0 -0
  923. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/json/json.cpp +0 -0
  924. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/SafeAssert.h +0 -0
  925. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/ToAscii.cpp +0 -0
  926. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/lang/ToAscii.h +0 -0
  927. /package/{Folly/TEMP_UntilFollyUpdate → external/folly/folly}/portability/Unistd.cpp +0 -0
@@ -0,0 +1,1571 @@
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
+ #include <folly/small_vector.h>
18
+
19
+ #include <iostream>
20
+ #include <iterator>
21
+ #include <limits>
22
+ #include <memory>
23
+ #include <numeric>
24
+ #include <sstream>
25
+ #include <string>
26
+ #include <unordered_set>
27
+ #include <vector>
28
+
29
+ #include <boost/algorithm/string.hpp>
30
+ #include <fmt/format.h>
31
+
32
+ #include <folly/Conv.h>
33
+ #include <folly/Traits.h>
34
+ #include <folly/container/Iterator.h>
35
+ #include <folly/portability/GTest.h>
36
+ #include <folly/sorted_vector_types.h>
37
+
38
+ using folly::small_vector;
39
+
40
+ using folly::small_vector_policy::policy_in_situ_only;
41
+ using folly::small_vector_policy::policy_size_type;
42
+
43
+ #if FOLLY_X64 || FOLLY_PPC64 || FOLLY_AARCH64 || FOLLY_RISCV64
44
+
45
+ template <typename...>
46
+ struct same_;
47
+ template <typename T>
48
+ struct same_<T, T> {};
49
+
50
+ auto s0 = same_<
51
+ folly::small_vector_policy::
52
+ merge<policy_size_type<uint32_t>, policy_size_type<uint8_t>>::size_type,
53
+ uint8_t>{};
54
+
55
+ // Fast access. Heap only small vector
56
+ static_assert(
57
+ sizeof(small_vector<int, 0>) == 16,
58
+ "Object size is not what we expect for small_vector<int, 0>");
59
+
60
+ static_assert(
61
+ sizeof(small_vector<int, 0, policy_size_type<uint32_t>>) ==
62
+ 4 /* size_ */ + 8,
63
+ "Object size is not what we expect for small_vector<int, 0, uint32_t>");
64
+
65
+ static_assert(
66
+ sizeof(small_vector<double, 0, policy_size_type<uint8_t>>) == 9,
67
+ "Object size is not what we expect for small_vector<double, 0, uint32_t>");
68
+
69
+ static_assert(
70
+ sizeof(small_vector<
71
+ std::pair<int64_t, int64_t>,
72
+ 0,
73
+ policy_size_type<uint32_t>>) == 12,
74
+ "Object size is not what we expect for small_vector<pair<int64_t, int64_t>, 0, uint32_t>");
75
+
76
+ static_assert(
77
+ sizeof(small_vector<int>) == 16,
78
+ "Object size is not what we expect for small_vector<int>");
79
+ static_assert(
80
+ sizeof(small_vector<int32_t, 2>) == 16,
81
+ "Object size is not what we expect for "
82
+ "small_vector<int32_t,2>");
83
+ static_assert(
84
+ sizeof(small_vector<int, 10>) == 10 * sizeof(int) + sizeof(std::size_t),
85
+ "Object size is not what we expect for small_vector<int,10>");
86
+
87
+ static_assert(
88
+ sizeof(small_vector<int32_t, 1, policy_size_type<uint32_t>>) == 8 + 4,
89
+ "small_vector<int32_t,1,uint32_t> is wrong size");
90
+
91
+ // Extra 2 bytes needed for alignment.
92
+ static_assert(
93
+ sizeof(small_vector<int32_t, 1, policy_size_type<uint16_t>>) == 8 + 2 + 2,
94
+ "small_vector<int32_t,1,uint16_t> is wrong size");
95
+ static_assert(
96
+ alignof(small_vector<int32_t, 1, policy_size_type<uint16_t>>) >= 4,
97
+ "small_vector not aligned correctly");
98
+
99
+ // Extra 3 bytes needed for alignment.
100
+ static_assert(
101
+ sizeof(small_vector<int32_t, 1, policy_size_type<uint8_t>>) == 8 + 1 + 3,
102
+ "small_vector<int32_t,1,uint8_t> is wrong size");
103
+ static_assert(
104
+ alignof(small_vector<int32_t, 1, policy_size_type<uint8_t>>) >= 4,
105
+ "small_vector not aligned correctly");
106
+
107
+ static_assert(
108
+ sizeof(small_vector<int16_t, 4, policy_size_type<uint16_t>>) == 10,
109
+ "Sizeof unexpectedly large");
110
+
111
+ #endif
112
+
113
+ static_assert(
114
+ !std::is_trivially_copyable<std::unique_ptr<int>>::value,
115
+ "std::unique_ptr<> is trivially copyable");
116
+
117
+ static_assert(
118
+ alignof(small_vector<folly::aligned_storage_t<32, 32>, 4>) == 32,
119
+ "small_vector not aligned correctly");
120
+
121
+ namespace {
122
+
123
+ template <typename Key, typename Value, size_t N>
124
+ using small_sorted_vector_map = folly::sorted_vector_map<
125
+ Key,
126
+ Value,
127
+ std::less<Key>,
128
+ std::allocator<std::pair<Key, Value>>,
129
+ void,
130
+ folly::small_vector<std::pair<Key, Value>, N>>;
131
+
132
+ template <typename Key, typename Value, size_t N>
133
+ using noheap_sorted_vector_map = folly::sorted_vector_map<
134
+ Key,
135
+ Value,
136
+ std::less<Key>,
137
+ std::allocator<std::pair<Key, Value>>,
138
+ void,
139
+ folly::small_vector<std::pair<Key, Value>, N, policy_in_situ_only<true>>>;
140
+
141
+ template <typename T, size_t N>
142
+ using small_sorted_vector_set = folly::sorted_vector_set<
143
+ T,
144
+ std::less<T>,
145
+ std::allocator<T>,
146
+ void,
147
+ folly::small_vector<T, N>>;
148
+
149
+ template <typename T, size_t N>
150
+ using noheap_sorted_vector_set = folly::sorted_vector_set<
151
+ T,
152
+ std::less<T>,
153
+ std::allocator<T>,
154
+ void,
155
+ folly::small_vector<T, N, policy_in_situ_only<true>>>;
156
+
157
+ struct NontrivialType {
158
+ static int ctored;
159
+ explicit NontrivialType() : a(0) {}
160
+
161
+ /* implicit */ NontrivialType(int a_) : a(a_) { ++ctored; }
162
+
163
+ NontrivialType(NontrivialType const& /* s */) { ++ctored; }
164
+
165
+ NontrivialType& operator=(NontrivialType const& o) {
166
+ a = o.a;
167
+ return *this;
168
+ }
169
+
170
+ int32_t a;
171
+ };
172
+ static_assert(
173
+ !std::is_trivially_copyable<NontrivialType>::value,
174
+ "NontrivialType is trivially copyable");
175
+
176
+ int NontrivialType::ctored = 0;
177
+
178
+ struct TestException {};
179
+
180
+ int throwCounter = 1;
181
+ void MaybeThrow() {
182
+ if (!--throwCounter) {
183
+ throw TestException();
184
+ }
185
+ }
186
+
187
+ const int kMagic = 0xdeadbeef;
188
+ struct Thrower {
189
+ static int alive;
190
+
191
+ Thrower() : magic(kMagic) {
192
+ EXPECT_EQ(magic, kMagic);
193
+ MaybeThrow();
194
+ ++alive;
195
+ }
196
+ Thrower(Thrower const& other) : magic(other.magic) {
197
+ EXPECT_EQ(magic, kMagic);
198
+ MaybeThrow();
199
+ ++alive;
200
+ }
201
+ ~Thrower() noexcept {
202
+ EXPECT_EQ(magic, kMagic);
203
+ magic = 0;
204
+ --alive;
205
+ }
206
+
207
+ Thrower& operator=(Thrower const& /* other */) {
208
+ EXPECT_EQ(magic, kMagic);
209
+ MaybeThrow();
210
+ return *this;
211
+ }
212
+
213
+ // This is just to try to make sure we don't get our member
214
+ // functions called on uninitialized memory.
215
+ int magic;
216
+ };
217
+
218
+ int Thrower::alive = 0;
219
+
220
+ // Type that counts how many exist and doesn't support copy
221
+ // construction.
222
+ struct NoncopyableCounter {
223
+ static int alive;
224
+ NoncopyableCounter() { ++alive; }
225
+ ~NoncopyableCounter() { --alive; }
226
+ NoncopyableCounter(NoncopyableCounter&&) noexcept { ++alive; }
227
+ NoncopyableCounter(NoncopyableCounter const&) = delete;
228
+ NoncopyableCounter& operator=(NoncopyableCounter const&) const = delete;
229
+ NoncopyableCounter& operator=(NoncopyableCounter&&) { return *this; }
230
+ };
231
+ int NoncopyableCounter::alive = 0;
232
+
233
+ static_assert(
234
+ !std::is_trivially_copyable<NoncopyableCounter>::value,
235
+ "NoncopyableCounter is trivially copyable");
236
+
237
+ // Check that throws don't break the basic guarantee for some cases.
238
+ // Uses the method for testing exception safety described at
239
+ // http://www.boost.org/community/exception_safety.html, to force all
240
+ // throwing code paths to occur.
241
+ template <int N>
242
+ struct TestBasicGuarantee {
243
+ folly::small_vector<Thrower, N> vec;
244
+ int const prepopulate;
245
+
246
+ explicit TestBasicGuarantee(int prepopulate_) : prepopulate(prepopulate_) {
247
+ throwCounter = 1000;
248
+ for (int i = 0; i < prepopulate; ++i) {
249
+ vec.emplace_back();
250
+ }
251
+ }
252
+
253
+ ~TestBasicGuarantee() { throwCounter = 1000; }
254
+
255
+ template <class Operation>
256
+ void operator()(int insertCount, Operation const& op) {
257
+ bool done = false;
258
+
259
+ std::unique_ptr<folly::small_vector<Thrower, N>> workingVec;
260
+ for (int counter = 1; !done; ++counter) {
261
+ throwCounter = 1000;
262
+ workingVec = std::make_unique<folly::small_vector<Thrower, N>>(vec);
263
+ throwCounter = counter;
264
+ EXPECT_EQ(Thrower::alive, prepopulate * 2);
265
+ try {
266
+ op(*workingVec);
267
+ done = true;
268
+ } catch (...) {
269
+ // Note that the size of the vector can change if we were
270
+ // inserting somewhere other than the end (it's a basic only
271
+ // guarantee). All we're testing here is that we have the
272
+ // right amount of uninitialized vs initialized memory.
273
+ EXPECT_EQ(Thrower::alive, workingVec->size() + vec.size());
274
+ continue;
275
+ }
276
+
277
+ // If things succeeded.
278
+ EXPECT_EQ(workingVec->size(), prepopulate + insertCount);
279
+ EXPECT_EQ(Thrower::alive, prepopulate * 2 + insertCount);
280
+ }
281
+ }
282
+ };
283
+
284
+ } // namespace
285
+
286
+ template <int N>
287
+ void testBasicGuarantee() {
288
+ for (int prepop = 1; prepop < 30; ++prepop) {
289
+ (TestBasicGuarantee<N>(prepop))( // parens or a mildly vexing parse :(
290
+ 1,
291
+ [&](folly::small_vector<Thrower, N>& v) { v.emplace_back(); });
292
+
293
+ EXPECT_EQ(Thrower::alive, 0);
294
+
295
+ (TestBasicGuarantee<N>(prepop))(1, [&](folly::small_vector<Thrower, N>& v) {
296
+ v.insert(v.begin(), Thrower());
297
+ });
298
+
299
+ EXPECT_EQ(Thrower::alive, 0);
300
+
301
+ (TestBasicGuarantee<N>(prepop))(1, [&](folly::small_vector<Thrower, N>& v) {
302
+ v.insert(v.begin() + 1, Thrower());
303
+ });
304
+
305
+ EXPECT_EQ(Thrower::alive, 0);
306
+ }
307
+
308
+ TestBasicGuarantee<N>(4)(3, [&](folly::small_vector<Thrower, N>& v) {
309
+ std::vector<Thrower> b;
310
+ b.emplace_back();
311
+ b.emplace_back();
312
+ b.emplace_back();
313
+
314
+ /*
315
+ * Apparently if you do the following initializer_list instead
316
+ * of the above push_back's, and one of the Throwers throws,
317
+ * g++4.6 doesn't destruct the previous ones. Heh.
318
+ */
319
+ // b = { Thrower(), Thrower(), Thrower() };
320
+ v.insert(v.begin() + 1, b.begin(), b.end());
321
+ });
322
+
323
+ TestBasicGuarantee<N>(2)(6, [&](folly::small_vector<Thrower, N>& v) {
324
+ std::vector<Thrower> b;
325
+ for (int i = 0; i < 6; ++i) {
326
+ b.emplace_back();
327
+ }
328
+
329
+ v.insert(v.begin() + 1, b.begin(), b.end());
330
+ });
331
+ }
332
+
333
+ TEST(smallVector, BasicGuarantee) {
334
+ testBasicGuarantee<3>();
335
+
336
+ EXPECT_EQ(Thrower::alive, 0);
337
+ try {
338
+ throwCounter = 4;
339
+ folly::small_vector<Thrower, 1> p(14, Thrower());
340
+ } catch (...) {
341
+ }
342
+ EXPECT_EQ(Thrower::alive, 0);
343
+
344
+ // Heap only small_vector
345
+ testBasicGuarantee<0>();
346
+ }
347
+
348
+ // Run this with.
349
+ // MALLOC_CONF=prof_leak:true
350
+ // LD_PRELOAD=${JEMALLOC_PATH}/lib/libjemalloc.so.2
351
+ // LD_PRELOAD="$LD_PRELOAD:"${UNWIND_PATH}/lib/libunwind.so.7
352
+ TEST(smallVector, leakTest) {
353
+ for (int j = 0; j < 1000; ++j) {
354
+ folly::small_vector<int, 10> someVec(300);
355
+ for (int i = 0; i < 10000; ++i) {
356
+ someVec.push_back(12);
357
+ }
358
+ }
359
+
360
+ for (int j = 0; j < 1000; ++j) {
361
+ folly::small_vector<int, 0> someVec(300);
362
+ for (int i = 0; i < 10000; ++i) {
363
+ someVec.push_back(12);
364
+ }
365
+ }
366
+ }
367
+
368
+ TEST(smallVector, leakTestWithTracking) {
369
+ constexpr size_t size = 97;
370
+ constexpr auto count = folly::annotate_object_count_leaked_uncollected;
371
+ auto const base = count();
372
+ small_vector<int> vec;
373
+ vec.resize(size);
374
+ EXPECT_EQ(size, vec.size());
375
+ EXPECT_EQ(base + size_t(folly::kIsSanitizeAddress), count());
376
+ vec.resize(0);
377
+ EXPECT_EQ(0, vec.size());
378
+ EXPECT_EQ(base + size_t(folly::kIsSanitizeAddress), count());
379
+ vec.shrink_to_fit();
380
+ EXPECT_LT(vec.capacity(), size);
381
+ EXPECT_EQ(base, count());
382
+ }
383
+
384
+ TEST(smallVector, leakTestWithLeakedObject) {
385
+ {
386
+ // this case does not actually need leak-tracking
387
+ using vec_t = folly::small_vector<int, 1>;
388
+ constexpr size_t size = 97;
389
+ static auto& vec = *new vec_t();
390
+ vec.resize(size);
391
+ EXPECT_EQ(size, vec.size());
392
+ }
393
+
394
+ {
395
+ // this case does need leak-tracking
396
+ using policy_t = folly::small_vector_policy::policy_size_type<uint32_t>;
397
+ using vec_t = folly::small_vector<int, 1, policy_t>;
398
+ constexpr size_t size = 97;
399
+ static auto& vec = *new vec_t();
400
+ vec.resize(size);
401
+ EXPECT_EQ(size, vec.size());
402
+ }
403
+ }
404
+
405
+ TEST(smallVector, InsertTrivial) {
406
+ folly::small_vector<int> someVec(3, 3);
407
+ someVec.insert(someVec.begin(), 12, 12);
408
+ EXPECT_EQ(someVec.size(), 15);
409
+ for (size_t i = 0; i < someVec.size(); ++i) {
410
+ if (i < 12) {
411
+ EXPECT_EQ(someVec[i], 12);
412
+ } else {
413
+ EXPECT_EQ(someVec[i], 3);
414
+ }
415
+ }
416
+
417
+ // Make sure we insert a larger range so we can test placement new
418
+ // and move inserts
419
+ auto oldSize = someVec.size();
420
+ someVec.insert(someVec.begin() + 1, 30, 30);
421
+ EXPECT_EQ(someVec.size(), oldSize + 30);
422
+ EXPECT_EQ(someVec[0], 12);
423
+ EXPECT_EQ(someVec[1], 30);
424
+ EXPECT_EQ(someVec[31], 12);
425
+ }
426
+
427
+ TEST(smallVector, InsertNontrivial) {
428
+ folly::small_vector<std::string> v1(6, "asd"), v2(7, "wat");
429
+ v1.insert(v1.begin() + 1, v2.begin(), v2.end());
430
+ EXPECT_TRUE(v1.size() == 6 + 7);
431
+ EXPECT_EQ(v1.front(), "asd");
432
+ EXPECT_EQ(v1[1], "wat");
433
+
434
+ // Insert without default constructor
435
+ class TestClass {
436
+ public:
437
+ // explicit TestClass() = default;
438
+ explicit TestClass(std::string s_) : s(s_) {}
439
+ std::string s;
440
+ };
441
+ folly::small_vector<TestClass> v3(5, TestClass("asd"));
442
+ folly::small_vector<TestClass> v4(10, TestClass("wat"));
443
+ v3.insert(v3.begin() + 1, v4.begin(), v4.end());
444
+ EXPECT_TRUE(v3.size() == 5 + 10);
445
+ EXPECT_EQ(v3[0].s, "asd");
446
+ EXPECT_EQ(v3[1].s, "wat");
447
+ EXPECT_EQ(v3[10].s, "wat");
448
+ EXPECT_EQ(v3[11].s, "asd");
449
+ }
450
+
451
+ TEST(smallVector, InsertFromBidirectionalList) {
452
+ folly::small_vector<std::string> v(6, "asd");
453
+ std::list<std::string> l(6, "wat");
454
+ v.insert(v.end(), l.begin(), l.end());
455
+ EXPECT_EQ(v[0], "asd");
456
+ EXPECT_EQ(v[5], "asd");
457
+ EXPECT_EQ(v[6], "wat");
458
+ EXPECT_EQ(v[11], "wat");
459
+ }
460
+
461
+ template <int N>
462
+ void testSwap() {
463
+ folly::small_vector<int, N> somethingVec, emptyVec;
464
+ somethingVec.push_back(1);
465
+ somethingVec.push_back(2);
466
+ somethingVec.push_back(3);
467
+ somethingVec.push_back(4);
468
+
469
+ // Swapping intern'd with intern'd.
470
+ auto vec = somethingVec;
471
+ EXPECT_TRUE(vec == somethingVec);
472
+ EXPECT_FALSE(vec == emptyVec);
473
+ EXPECT_FALSE(somethingVec == emptyVec);
474
+
475
+ // Swapping a heap vector with an intern vector.
476
+ folly::small_vector<int, N> junkVec;
477
+ junkVec.assign(12, 12);
478
+ EXPECT_EQ(junkVec.size(), 12);
479
+ for (auto i : junkVec) {
480
+ EXPECT_EQ(i, 12);
481
+ }
482
+ swap(junkVec, vec);
483
+ EXPECT_TRUE(junkVec == somethingVec);
484
+ EXPECT_EQ(vec.size(), 12);
485
+ for (auto i : vec) {
486
+ EXPECT_EQ(i, 12);
487
+ }
488
+
489
+ // Swapping two heap vectors.
490
+ folly::small_vector<int, N> moreJunk(15, 15);
491
+ EXPECT_EQ(moreJunk.size(), 15);
492
+ for (auto i : moreJunk) {
493
+ EXPECT_EQ(i, 15);
494
+ }
495
+ swap(vec, moreJunk);
496
+ EXPECT_EQ(moreJunk.size(), 12);
497
+ for (auto i : moreJunk) {
498
+ EXPECT_EQ(i, 12);
499
+ }
500
+ EXPECT_EQ(vec.size(), 15);
501
+ for (auto i : vec) {
502
+ EXPECT_EQ(i, 15);
503
+ }
504
+ }
505
+
506
+ TEST(smallVector, Swap) {
507
+ testSwap<10>();
508
+
509
+ // heap only small_vector
510
+ testSwap<0>();
511
+
512
+ // Making a vector heap, then smaller than another non-heap vector,
513
+ // then swapping.
514
+ folly::small_vector<int, 5> shrinker, other(4, 10);
515
+ shrinker = {0, 1, 2, 3, 4, 5, 6, 7, 8};
516
+ shrinker.erase(shrinker.begin() + 2, shrinker.end());
517
+ EXPECT_LT(shrinker.size(), other.size());
518
+ swap(shrinker, other);
519
+ EXPECT_EQ(shrinker.size(), 4);
520
+ EXPECT_TRUE(boost::all(shrinker, boost::is_any_of(std::vector<int>{10})));
521
+ EXPECT_TRUE((other == small_vector<int, 5>{0, 1}));
522
+ }
523
+
524
+ template <int N>
525
+ void testEmplace() {
526
+ NontrivialType::ctored = 0;
527
+
528
+ folly::small_vector<NontrivialType, N> vec;
529
+ vec.reserve(1024);
530
+ {
531
+ auto& emplaced = vec.emplace_back(12);
532
+ EXPECT_EQ(NontrivialType::ctored, 1);
533
+ EXPECT_EQ(vec.front().a, 12);
534
+ EXPECT_TRUE(std::addressof(emplaced) == std::addressof(vec.back()));
535
+ }
536
+ {
537
+ auto& emplaced = vec.emplace_back(13);
538
+ EXPECT_EQ(vec.front().a, 12);
539
+ EXPECT_EQ(vec.back().a, 13);
540
+ EXPECT_EQ(NontrivialType::ctored, 2);
541
+ EXPECT_TRUE(std::addressof(emplaced) == std::addressof(vec.back()));
542
+ }
543
+
544
+ NontrivialType::ctored = 0;
545
+ for (int i = 0; i < 120; ++i) {
546
+ auto& emplaced = vec.emplace_back(i);
547
+ EXPECT_TRUE(std::addressof(emplaced) == std::addressof(vec.back()));
548
+ }
549
+ EXPECT_EQ(NontrivialType::ctored, 120);
550
+ EXPECT_EQ(vec[0].a, 12);
551
+ EXPECT_EQ(vec[1].a, 13);
552
+ EXPECT_EQ(vec.back().a, 119);
553
+
554
+ // We implement emplace() with a temporary (see the implementation
555
+ // for a comment about why), so this should make 2 ctor calls.
556
+ NontrivialType::ctored = 0;
557
+ vec.emplace(vec.begin(), 12);
558
+ EXPECT_EQ(NontrivialType::ctored, 2);
559
+ }
560
+
561
+ TEST(smallVector, Emplace) {
562
+ testEmplace<1>();
563
+ // heap only
564
+ testEmplace<0>();
565
+ }
566
+
567
+ TEST(smallVector, Erase) {
568
+ folly::small_vector<int, 4> notherVec = {1, 2, 3, 4, 5};
569
+ EXPECT_EQ(notherVec.front(), 1);
570
+ EXPECT_EQ(notherVec.size(), 5);
571
+ notherVec.erase(notherVec.begin());
572
+ EXPECT_EQ(notherVec.front(), 2);
573
+ EXPECT_EQ(notherVec.size(), 4);
574
+ EXPECT_EQ(notherVec[2], 4);
575
+ EXPECT_EQ(notherVec[3], 5);
576
+ notherVec.erase(notherVec.begin() + 2);
577
+ EXPECT_EQ(notherVec.size(), 3);
578
+ EXPECT_EQ(notherVec[2], 5);
579
+
580
+ folly::small_vector<int, 2> vec2 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
581
+ vec2.erase(vec2.begin() + 1, vec2.end() - 1);
582
+ folly::small_vector<int, 2> expected = {1, 10};
583
+ EXPECT_TRUE(vec2 == expected);
584
+
585
+ folly::small_vector<std::string, 3> v(102, "ASD");
586
+ v.resize(1024, "D");
587
+ EXPECT_EQ(v.size(), 1024);
588
+ EXPECT_EQ(v.back(), "D");
589
+ EXPECT_EQ(v.front(), "ASD");
590
+ v.resize(1);
591
+ EXPECT_EQ(v.front(), "ASD");
592
+ EXPECT_EQ(v.size(), 1);
593
+ v.resize(0);
594
+ EXPECT_TRUE(v.empty());
595
+
596
+ // test heap only
597
+ folly::small_vector<int, 0> vec3 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
598
+ vec3.erase(vec3.begin() + 1, vec3.end() - 1);
599
+ folly::small_vector<int, 0> expected3 = {1, 10};
600
+ EXPECT_TRUE(vec3 == expected3);
601
+ }
602
+
603
+ template <int N>
604
+ void testGrowShrinkGrow() {
605
+ folly::small_vector<NontrivialType, N> vec = {1, 2, 3, 4, 5};
606
+ std::generate_n(std::back_inserter(vec), 102, std::rand);
607
+
608
+ auto capacity = vec.capacity();
609
+
610
+ auto oldSize = vec.size();
611
+ for (size_t i = 0; i < oldSize; ++i) {
612
+ vec.erase(vec.begin() + (std::rand() % vec.size()));
613
+ EXPECT_EQ(vec.capacity(), capacity);
614
+ }
615
+ EXPECT_TRUE(vec.empty());
616
+
617
+ EXPECT_EQ(vec.capacity(), capacity);
618
+ std::generate_n(std::back_inserter(vec), 102, std::rand);
619
+ EXPECT_EQ(vec.capacity(), capacity);
620
+
621
+ std::generate_n(std::back_inserter(vec), 4096, std::rand);
622
+ EXPECT_GT(vec.capacity(), capacity);
623
+
624
+ vec.resize(10);
625
+ vec.shrink_to_fit();
626
+ EXPECT_LT(vec.capacity(), capacity);
627
+ auto cap = vec.capacity();
628
+ vec.resize(4);
629
+ vec.shrink_to_fit();
630
+ if (N > 4)
631
+ EXPECT_EQ(vec.capacity(), N); // in situ size
632
+ else
633
+ EXPECT_LT(vec.capacity(), cap); // on heap
634
+ }
635
+
636
+ TEST(smallVector, GrowShrinkGrow) {
637
+ testGrowShrinkGrow<7>();
638
+
639
+ testGrowShrinkGrow<0>();
640
+ }
641
+
642
+ TEST(smallVector, Iteration) {
643
+ folly::small_vector<std::string, 3> vec = {"foo", "bar"};
644
+ vec.push_back("blah");
645
+ vec.push_back("blah2");
646
+ vec.push_back("blah3");
647
+ vec.erase(vec.begin() + 2);
648
+
649
+ std::vector<std::string> otherVec;
650
+ for (auto& s : vec) {
651
+ otherVec.push_back(s);
652
+ }
653
+ EXPECT_EQ(otherVec.size(), vec.size());
654
+ if (otherVec.size() == vec.size()) {
655
+ EXPECT_TRUE(std::equal(otherVec.begin(), otherVec.end(), vec.begin()));
656
+ }
657
+
658
+ std::reverse(otherVec.begin(), otherVec.end());
659
+ auto oit = otherVec.begin();
660
+ auto rit = vec.crbegin();
661
+ for (; rit != vec.crend(); ++oit, ++rit) {
662
+ EXPECT_EQ(*oit, *rit);
663
+ }
664
+ }
665
+
666
+ TEST(smallVector, NonCopyableType) {
667
+ folly::small_vector<NontrivialType, 2> vec;
668
+
669
+ for (int i = 0; i < 10; ++i) {
670
+ vec.emplace(vec.begin(), 13);
671
+ }
672
+ EXPECT_EQ(vec.size(), 10);
673
+ auto vec2 = std::move(vec);
674
+ EXPECT_EQ(vec.size(), 0);
675
+ EXPECT_EQ(vec2.size(), 10);
676
+ vec2.clear();
677
+
678
+ folly::small_vector<NoncopyableCounter, 3> vec3;
679
+ for (int i = 0; i < 10; ++i) {
680
+ EXPECT_EQ(vec3.size(), i);
681
+ EXPECT_EQ(NoncopyableCounter::alive, i);
682
+ vec3.insert(vec3.begin(), NoncopyableCounter());
683
+ }
684
+ EXPECT_EQ(vec3.size(), 10);
685
+ EXPECT_EQ(NoncopyableCounter::alive, 10);
686
+
687
+ vec3.insert(vec3.begin() + 3, NoncopyableCounter());
688
+ EXPECT_EQ(NoncopyableCounter::alive, 11);
689
+ auto vec4 = std::move(vec3);
690
+ EXPECT_EQ(NoncopyableCounter::alive, 11);
691
+ vec4.resize(30);
692
+ EXPECT_EQ(NoncopyableCounter::alive, 30);
693
+ vec4.erase(vec4.begin(), vec4.end());
694
+ EXPECT_EQ(vec4.size(), 0);
695
+ EXPECT_EQ(NoncopyableCounter::alive, 0);
696
+
697
+ {
698
+ folly::small_vector<NontrivialType, 0> vec0;
699
+
700
+ for (int i = 0; i < 10; ++i) {
701
+ vec0.emplace(vec0.begin(), 13);
702
+ }
703
+ EXPECT_EQ(vec0.size(), 10);
704
+ auto vec02 = std::move(vec0);
705
+ EXPECT_EQ(vec0.size(), 0);
706
+ EXPECT_EQ(vec02.size(), 10);
707
+ vec02.clear();
708
+ }
709
+ }
710
+
711
+ template <int N>
712
+ void testMoveConstructor() {
713
+ folly::small_vector<std::string, N> v1;
714
+ v1.push_back("asd");
715
+ v1.push_back("bsd");
716
+ auto v2 = std::move(v1);
717
+ EXPECT_EQ(v2.size(), 2);
718
+ EXPECT_EQ(v2[0], "asd");
719
+ EXPECT_EQ(v2[1], "bsd");
720
+
721
+ v1 = std::move(v2);
722
+ EXPECT_EQ(v1.size(), 2);
723
+ EXPECT_EQ(v1[0], "asd");
724
+ EXPECT_EQ(v1[1], "bsd");
725
+ }
726
+
727
+ TEST(smallVector, MoveConstructor) {
728
+ testMoveConstructor<10>();
729
+ testMoveConstructor<0>();
730
+ }
731
+
732
+ TEST(smallVector, NoHeap) {
733
+ typedef folly::small_vector<std::string, 10, policy_in_situ_only<true>>
734
+ Vector;
735
+
736
+ Vector v;
737
+ static_assert(v.max_size() == 10, "max_size is incorrect");
738
+
739
+ for (int i = 0; i < 10; ++i) {
740
+ v.push_back(folly::to<std::string>(i));
741
+ EXPECT_EQ(v.size(), i + 1);
742
+ }
743
+
744
+ bool caught = false;
745
+ try {
746
+ v.insert(v.begin(), "ha");
747
+ } catch (const std::length_error&) {
748
+ caught = true;
749
+ }
750
+ EXPECT_TRUE(caught);
751
+
752
+ // Check max_size works right with various policy combinations.
753
+ folly::small_vector<std::string, 32, policy_size_type<uint32_t>> v4;
754
+ EXPECT_EQ(v4.max_size(), (uint32_t(1) << 30) - 1);
755
+
756
+ /*
757
+ * Test that even when we ask for a small number inlined it'll still
758
+ * inline at least as much as it takes to store the value_type
759
+ * pointer.
760
+ */
761
+ folly::small_vector<char, 1, policy_in_situ_only<true>> notsosmall;
762
+ static_assert(
763
+ notsosmall.max_size() == sizeof(char*), "max_size is incorrect");
764
+ caught = false;
765
+ try {
766
+ notsosmall.push_back(12);
767
+ notsosmall.push_back(13);
768
+ notsosmall.push_back(14);
769
+ } catch (const std::length_error&) {
770
+ caught = true;
771
+ }
772
+ EXPECT_FALSE(caught);
773
+ }
774
+
775
+ TEST(smallVector, MaxSize) {
776
+ folly::small_vector<int, 2, policy_size_type<uint8_t>> vec;
777
+ EXPECT_EQ(vec.max_size(), 63);
778
+ folly::small_vector<int, 2, policy_size_type<uint16_t>> vec2;
779
+ EXPECT_EQ(vec2.max_size(), (1 << 14) - 1);
780
+ }
781
+
782
+ TEST(smallVector, AllHeap) {
783
+ // Use something bigger than the pointer so it can't get inlined.
784
+ struct SomeObj {
785
+ double a, b, c, d, e;
786
+ int val;
787
+ SomeObj(int val_) : val(val_) {}
788
+ bool operator==(SomeObj const& o) const { return o.val == val; }
789
+ };
790
+
791
+ folly::small_vector<SomeObj, 0> vec = {1};
792
+ EXPECT_EQ(vec.size(), 1);
793
+ if (!vec.empty()) {
794
+ EXPECT_TRUE(vec[0] == 1);
795
+ }
796
+ vec.insert(vec.begin(), {0, 1, 2, 3});
797
+ EXPECT_EQ(vec.size(), 5);
798
+ EXPECT_TRUE((vec == folly::small_vector<SomeObj, 0>{0, 1, 2, 3, 1}));
799
+ }
800
+ template <int N>
801
+ void testBasic() {
802
+ typedef folly::small_vector<int, N, policy_size_type<uint32_t>> Vector;
803
+
804
+ Vector a;
805
+
806
+ a.push_back(12);
807
+ EXPECT_EQ(a.front(), 12);
808
+ EXPECT_EQ(a.size(), 1);
809
+ a.push_back(13);
810
+ EXPECT_EQ(a.size(), 2);
811
+ EXPECT_EQ(a.front(), 12);
812
+ EXPECT_EQ(a.back(), 13);
813
+
814
+ a.emplace(a.end(), 32);
815
+ EXPECT_EQ(a.back(), 32);
816
+
817
+ a.emplace(a.begin(), 12);
818
+ EXPECT_EQ(a.front(), 12);
819
+ EXPECT_EQ(a.back(), 32);
820
+ a.erase(a.end() - 1);
821
+ EXPECT_EQ(a.back(), 13);
822
+
823
+ a.push_back(12);
824
+ EXPECT_EQ(a.back(), 12);
825
+ a.pop_back();
826
+ EXPECT_EQ(a.back(), 13);
827
+
828
+ const int s = 12;
829
+ a.push_back(s); // lvalue reference
830
+
831
+ Vector b, c;
832
+ b = a;
833
+ EXPECT_TRUE(b == a);
834
+ c = std::move(b);
835
+ EXPECT_TRUE(c == a);
836
+ EXPECT_TRUE(c != b && b != a);
837
+
838
+ EXPECT_GT(c.size(), 0);
839
+ c.resize(1);
840
+ EXPECT_EQ(c.size(), 1);
841
+
842
+ Vector intCtor(12);
843
+ }
844
+
845
+ TEST(smallVector, Basic) {
846
+ testBasic<3>();
847
+ testBasic<0>();
848
+ }
849
+
850
+ TEST(smallVector, Capacity) {
851
+ folly::small_vector<uint64_t, 1> vec;
852
+ EXPECT_EQ(vec.size(), 0);
853
+ EXPECT_EQ(vec.capacity(), 1);
854
+
855
+ vec.push_back(0);
856
+ EXPECT_EQ(vec.size(), 1);
857
+ EXPECT_EQ(vec.capacity(), 1);
858
+
859
+ vec.push_back(1);
860
+ EXPECT_EQ(vec.size(), 2);
861
+ EXPECT_GT(vec.capacity(), 1);
862
+
863
+ folly::small_vector<uint64_t, 2> vec2;
864
+ EXPECT_EQ(vec2.size(), 0);
865
+ EXPECT_EQ(vec2.capacity(), 2);
866
+
867
+ vec2.push_back(0);
868
+ vec2.push_back(1);
869
+ EXPECT_EQ(vec2.size(), 2);
870
+ EXPECT_EQ(vec2.capacity(), 2);
871
+
872
+ vec2.push_back(2);
873
+ EXPECT_EQ(vec2.size(), 3);
874
+ EXPECT_GT(vec2.capacity(), 2);
875
+
876
+ // Test capacity heapifying logic
877
+ folly::small_vector<unsigned char, 1> vec3;
878
+ const size_t hc_size = 100000;
879
+ for (size_t i = 0; i < hc_size; ++i) {
880
+ auto v = (unsigned char)i;
881
+ vec3.push_back(v);
882
+ EXPECT_EQ(vec3[i], v);
883
+ EXPECT_EQ(vec3.size(), i + 1);
884
+ EXPECT_GT(vec3.capacity(), i);
885
+ }
886
+ for (auto i = hc_size; i > 0; --i) {
887
+ auto v = (unsigned char)(i - 1);
888
+ EXPECT_EQ(vec3.back(), v);
889
+ vec3.pop_back();
890
+ EXPECT_EQ(vec3.size(), i - 1);
891
+ }
892
+ }
893
+
894
+ template <int N>
895
+ void testSelfPushBack() {
896
+ for (int i = 1; i < 33; ++i) {
897
+ folly::small_vector<std::string, N> vec;
898
+ for (int j = 0; j < i; ++j) {
899
+ vec.push_back("abc");
900
+ }
901
+ EXPECT_EQ(vec.size(), i);
902
+ vec.push_back(std::move(vec[0]));
903
+ EXPECT_EQ(vec.size(), i + 1);
904
+
905
+ EXPECT_EQ(vec[i], "abc");
906
+ }
907
+ }
908
+
909
+ TEST(smallVector, SelfPushBack) {
910
+ testSelfPushBack<1>();
911
+ testSelfPushBack<0>();
912
+ }
913
+
914
+ template <int N>
915
+ void testSelfEmplaceBack() {
916
+ for (int i = 1; i < 33; ++i) {
917
+ folly::small_vector<std::string, N> vec;
918
+ for (int j = 0; j < i; ++j) {
919
+ vec.emplace_back("abc");
920
+ }
921
+ EXPECT_EQ(vec.size(), i);
922
+ vec.emplace_back(std::move(vec[0]));
923
+ EXPECT_EQ(vec.size(), i + 1);
924
+
925
+ EXPECT_EQ(vec[i], "abc");
926
+ }
927
+ }
928
+
929
+ TEST(smallVector, SelfEmplaceBack) {
930
+ testSelfEmplaceBack<1>();
931
+ testSelfEmplaceBack<0>();
932
+ }
933
+
934
+ template <int N>
935
+ void testSelfInsert() {
936
+ // end insert
937
+ for (int i = 1; i < 33; ++i) {
938
+ folly::small_vector<std::string, N> vec;
939
+ for (int j = 0; j < i; ++j) {
940
+ vec.push_back("abc");
941
+ }
942
+ EXPECT_EQ(vec.size(), i);
943
+ vec.insert(vec.end(), std::move(vec[0]));
944
+ EXPECT_EQ(vec.size(), i + 1);
945
+
946
+ EXPECT_EQ(vec[i], "abc");
947
+ EXPECT_EQ(vec[vec.size() - 1], "abc");
948
+ }
949
+
950
+ // middle insert
951
+ for (int i = 2; i < 33; ++i) {
952
+ folly::small_vector<std::string, N> vec;
953
+ for (int j = 0; j < i; ++j) {
954
+ vec.push_back("abc");
955
+ }
956
+ EXPECT_EQ(vec.size(), i);
957
+ vec.insert(vec.end() - 1, std::move(vec[0]));
958
+ EXPECT_EQ(vec.size(), i + 1);
959
+
960
+ EXPECT_EQ(vec[i - 1], "abc");
961
+ EXPECT_EQ(vec[i], "abc");
962
+ }
963
+
964
+ // range insert
965
+ for (int i = 2; i < 33; ++i) {
966
+ folly::small_vector<std::string, N> vec;
967
+ // reserve 2 * i space so we don't grow and invalidate references.
968
+ vec.reserve(2 * i);
969
+ for (int j = 0; j < i; ++j) {
970
+ vec.push_back("abc");
971
+ }
972
+ EXPECT_EQ(vec.size(), i);
973
+ vec.insert(vec.end() - 1, vec.begin(), vec.end() - 1);
974
+ EXPECT_EQ(vec.size(), 2 * i - 1);
975
+
976
+ for (auto const& val : vec) {
977
+ EXPECT_EQ(val, "abc");
978
+ }
979
+ }
980
+ }
981
+
982
+ TEST(smallVector, SelfInsert) {
983
+ testSelfInsert<1>();
984
+
985
+ testSelfInsert<0>();
986
+ }
987
+
988
+ struct CheckedInt {
989
+ static const int DEFAULT_VALUE = (int)0xdeadbeef;
990
+ CheckedInt() : value(DEFAULT_VALUE) {}
991
+ explicit CheckedInt(int value_) : value(value_) {}
992
+ CheckedInt(const CheckedInt& rhs, int) : value(rhs.value) {}
993
+ CheckedInt(const CheckedInt& rhs) : value(rhs.value) {}
994
+ CheckedInt(CheckedInt&& rhs) noexcept : value(rhs.value) {
995
+ rhs.value = DEFAULT_VALUE;
996
+ }
997
+ CheckedInt& operator=(const CheckedInt& rhs) {
998
+ value = rhs.value;
999
+ return *this;
1000
+ }
1001
+ CheckedInt& operator=(CheckedInt&& rhs) noexcept {
1002
+ value = rhs.value;
1003
+ rhs.value = DEFAULT_VALUE;
1004
+ return *this;
1005
+ }
1006
+ ~CheckedInt() {}
1007
+ int value;
1008
+ };
1009
+
1010
+ TEST(smallVector, ForwardingEmplaceInsideVector) {
1011
+ folly::small_vector<CheckedInt> v;
1012
+ v.push_back(CheckedInt(1));
1013
+ for (int i = 1; i < 20; ++i) {
1014
+ v.emplace_back(v[0], 42);
1015
+ ASSERT_EQ(1, v.back().value);
1016
+ }
1017
+ }
1018
+
1019
+ TEST(smallVector, LVEmplaceInsideVector) {
1020
+ folly::small_vector<CheckedInt> v;
1021
+ v.push_back(CheckedInt(1));
1022
+ for (int i = 1; i < 20; ++i) {
1023
+ v.emplace_back(v[0]);
1024
+ ASSERT_EQ(1, v.back().value);
1025
+ }
1026
+ }
1027
+
1028
+ TEST(smallVector, CLVEmplaceInsideVector) {
1029
+ folly::small_vector<CheckedInt> v;
1030
+ const folly::small_vector<CheckedInt>& cv = v;
1031
+ v.push_back(CheckedInt(1));
1032
+ for (int i = 1; i < 20; ++i) {
1033
+ v.emplace_back(cv[0]);
1034
+ ASSERT_EQ(1, v.back().value);
1035
+ }
1036
+ }
1037
+
1038
+ TEST(smallVector, RVEmplaceInsideVector) {
1039
+ folly::small_vector<CheckedInt> v;
1040
+ v.push_back(CheckedInt(0));
1041
+ for (int i = 1; i < 20; ++i) {
1042
+ v[0] = CheckedInt(1);
1043
+ v.emplace_back(std::move(v[0]));
1044
+ ASSERT_EQ(1, v.back().value);
1045
+ }
1046
+ }
1047
+
1048
+ TEST(smallVector, LVPushValueInsideVector) {
1049
+ folly::small_vector<CheckedInt> v;
1050
+ v.push_back(CheckedInt(1));
1051
+ for (int i = 1; i < 20; ++i) {
1052
+ v.push_back(v[0]);
1053
+ ASSERT_EQ(1, v.back().value);
1054
+ }
1055
+ }
1056
+
1057
+ TEST(smallVector, RVPushValueInsideVector) {
1058
+ folly::small_vector<CheckedInt> v;
1059
+ v.push_back(CheckedInt(0));
1060
+ for (int i = 1; i < 20; ++i) {
1061
+ v[0] = CheckedInt(1);
1062
+ v.push_back(v[0]);
1063
+ ASSERT_EQ(1, v.back().value);
1064
+ }
1065
+ }
1066
+
1067
+ TEST(smallVector, EmplaceIterCtor) {
1068
+ std::vector<int*> v{new int(1), new int(2)};
1069
+ std::vector<std::unique_ptr<int>> uv(v.begin(), v.end());
1070
+
1071
+ std::vector<int*> w{new int(1), new int(2)};
1072
+ small_vector<std::unique_ptr<int>> uw(w.begin(), w.end());
1073
+ }
1074
+
1075
+ TEST(smallVector, InputIterator) {
1076
+ std::vector<int> expected{125, 320, 512, 750, 333};
1077
+ std::string values = "125 320 512 750 333";
1078
+ std::istringstream is1(values);
1079
+ std::istringstream is2(values);
1080
+
1081
+ std::vector<int> stdV{
1082
+ std::istream_iterator<int>(is1), std::istream_iterator<int>()};
1083
+ ASSERT_EQ(stdV.size(), expected.size());
1084
+ for (size_t i = 0; i < expected.size(); i++) {
1085
+ ASSERT_EQ(stdV[i], expected[i]);
1086
+ }
1087
+
1088
+ small_vector<int> smallV{
1089
+ std::istream_iterator<int>(is2), std::istream_iterator<int>()};
1090
+ ASSERT_EQ(smallV.size(), expected.size());
1091
+ for (size_t i = 0; i < expected.size(); i++) {
1092
+ ASSERT_EQ(smallV[i], expected[i]);
1093
+ }
1094
+ }
1095
+
1096
+ TEST(smallVector, NoCopyCtor) {
1097
+ struct Tester {
1098
+ Tester() = default;
1099
+ Tester(const Tester&) = delete;
1100
+ Tester(Tester&&) = default;
1101
+
1102
+ int field = 42;
1103
+ };
1104
+
1105
+ small_vector<Tester> test(10);
1106
+ ASSERT_EQ(test.size(), 10);
1107
+ for (const auto& element : test) {
1108
+ EXPECT_EQ(element.field, 42);
1109
+ }
1110
+ }
1111
+
1112
+ TEST(smallVector, ZeroInitializable) {
1113
+ small_vector<int> test(10);
1114
+ ASSERT_EQ(test.size(), 10);
1115
+ for (const auto& element : test) {
1116
+ EXPECT_EQ(element, 0);
1117
+ }
1118
+ }
1119
+
1120
+ TEST(smallVector, InsertMoreThanGrowth) {
1121
+ small_vector<int, 10> test;
1122
+ test.insert(test.end(), 30, 0);
1123
+ for (auto element : test) {
1124
+ EXPECT_EQ(element, 0);
1125
+ }
1126
+ }
1127
+
1128
+ TEST(smallVector, EmplaceBackExponentialGrowth) {
1129
+ small_vector<std::pair<int, int>> test;
1130
+ std::vector<size_t> capacities;
1131
+ capacities.push_back(test.capacity());
1132
+ for (int i = 0; i < 10000; ++i) {
1133
+ test.emplace_back(0, 0);
1134
+ if (test.capacity() != capacities.back()) {
1135
+ capacities.push_back(test.capacity());
1136
+ }
1137
+ }
1138
+ EXPECT_LE(capacities.size(), 25);
1139
+ }
1140
+
1141
+ TEST(smallVector, InsertExponentialGrowth) {
1142
+ small_vector<std::pair<int, int>> test;
1143
+ std::vector<size_t> capacities;
1144
+ capacities.push_back(test.capacity());
1145
+ for (int i = 0; i < 10000; ++i) {
1146
+ test.insert(test.begin(), std::make_pair(0, 0));
1147
+ if (test.capacity() != capacities.back()) {
1148
+ capacities.push_back(test.capacity());
1149
+ }
1150
+ }
1151
+ EXPECT_LE(capacities.size(), 25);
1152
+ }
1153
+
1154
+ TEST(smallVector, InsertNExponentialGrowth) {
1155
+ small_vector<int> test;
1156
+ std::vector<size_t> capacities;
1157
+ capacities.push_back(test.capacity());
1158
+ for (int i = 0; i < 10000; ++i) {
1159
+ test.insert(test.begin(), 100, 0);
1160
+ if (test.capacity() != capacities.back()) {
1161
+ capacities.push_back(test.capacity());
1162
+ }
1163
+ }
1164
+ EXPECT_LE(capacities.size(), 25);
1165
+ }
1166
+
1167
+ namespace {
1168
+ struct Counts {
1169
+ size_t copyCount{0};
1170
+ size_t moveCount{0};
1171
+ };
1172
+
1173
+ class Counter {
1174
+ Counts* counts;
1175
+
1176
+ public:
1177
+ explicit Counter(Counts& counts_) : counts(&counts_) {}
1178
+ Counter(Counter const& other) noexcept : counts(other.counts) {
1179
+ ++counts->copyCount;
1180
+ }
1181
+ Counter(Counter&& other) noexcept : counts(other.counts) {
1182
+ ++counts->moveCount;
1183
+ }
1184
+ Counter& operator=(Counter const& rhs) noexcept {
1185
+ EXPECT_EQ(counts, rhs.counts);
1186
+ ++counts->copyCount;
1187
+ return *this;
1188
+ }
1189
+ Counter& operator=(Counter&& rhs) noexcept {
1190
+ EXPECT_EQ(counts, rhs.counts);
1191
+ ++counts->moveCount;
1192
+ return *this;
1193
+ }
1194
+ };
1195
+ } // namespace
1196
+
1197
+ TEST(smallVector, EmplaceBackEfficiency) {
1198
+ small_vector<Counter, 2> test;
1199
+ Counts counts;
1200
+ for (size_t i = 1; i <= test.capacity(); ++i) {
1201
+ test.emplace_back(counts);
1202
+ EXPECT_EQ(0, counts.copyCount);
1203
+ EXPECT_EQ(0, counts.moveCount);
1204
+ }
1205
+ EXPECT_EQ(test.size(), test.capacity());
1206
+ test.emplace_back(counts);
1207
+ // Every element except the last has to be moved to the new position
1208
+ EXPECT_EQ(0, counts.copyCount);
1209
+ EXPECT_EQ(test.size() - 1, counts.moveCount);
1210
+ EXPECT_LT(test.size(), test.capacity());
1211
+ }
1212
+
1213
+ TEST(smallVector, RVPushBackEfficiency) {
1214
+ small_vector<Counter, 2> test;
1215
+ Counts counts;
1216
+ for (size_t i = 1; i <= test.capacity(); ++i) {
1217
+ test.push_back(Counter(counts));
1218
+ // 1 copy for each push_back()
1219
+ EXPECT_EQ(0, counts.copyCount);
1220
+ EXPECT_EQ(i, counts.moveCount);
1221
+ }
1222
+ EXPECT_EQ(test.size(), test.capacity());
1223
+ test.push_back(Counter(counts));
1224
+ // 1 move for each push_back()
1225
+ // Every element except the last has to be moved to the new position
1226
+ EXPECT_EQ(0, counts.copyCount);
1227
+ EXPECT_EQ(test.size() + test.size() - 1, counts.moveCount);
1228
+ EXPECT_LT(test.size(), test.capacity());
1229
+ }
1230
+
1231
+ TEST(smallVector, CLVPushBackEfficiency) {
1232
+ small_vector<Counter, 2> test;
1233
+ Counts counts;
1234
+ Counter const counter(counts);
1235
+ for (size_t i = 1; i <= test.capacity(); ++i) {
1236
+ test.push_back(counter);
1237
+ // 1 copy for each push_back()
1238
+ EXPECT_EQ(i, counts.copyCount);
1239
+ EXPECT_EQ(0, counts.moveCount);
1240
+ }
1241
+ EXPECT_EQ(test.size(), test.capacity());
1242
+ test.push_back(counter);
1243
+ // 1 copy for each push_back()
1244
+ EXPECT_EQ(test.size(), counts.copyCount);
1245
+ // Every element except the last has to be moved to the new position
1246
+ EXPECT_EQ(test.size() - 1, counts.moveCount);
1247
+ EXPECT_LT(test.size(), test.capacity());
1248
+ }
1249
+
1250
+ TEST(smallVector, StorageForSortedVectorMap) {
1251
+ small_sorted_vector_map<int32_t, int32_t, 2> test;
1252
+ test.insert(std::make_pair(10, 10));
1253
+ EXPECT_EQ(test.size(), 1);
1254
+ test.insert(std::make_pair(10, 10));
1255
+ EXPECT_EQ(test.size(), 1);
1256
+ test.insert(std::make_pair(20, 10));
1257
+ EXPECT_EQ(test.size(), 2);
1258
+ test.insert(std::make_pair(30, 10));
1259
+ EXPECT_EQ(test.size(), 3);
1260
+ }
1261
+
1262
+ TEST(smallVector, NoHeapStorageForSortedVectorMap) {
1263
+ noheap_sorted_vector_map<int32_t, int32_t, 2> test;
1264
+ test.insert(std::make_pair(10, 10));
1265
+ EXPECT_EQ(test.size(), 1);
1266
+ test.insert(std::make_pair(10, 10));
1267
+ EXPECT_EQ(test.size(), 1);
1268
+ test.insert(std::make_pair(20, 10));
1269
+ EXPECT_EQ(test.size(), 2);
1270
+ EXPECT_THROW(test.insert(std::make_pair(30, 10)), std::length_error);
1271
+ EXPECT_EQ(test.size(), 2);
1272
+ }
1273
+
1274
+ TEST(smallVector, StorageForSortedVectorSet) {
1275
+ small_sorted_vector_set<int32_t, 2> test;
1276
+ test.insert(10);
1277
+ EXPECT_EQ(test.size(), 1);
1278
+ test.insert(10);
1279
+ EXPECT_EQ(test.size(), 1);
1280
+ test.insert(20);
1281
+ EXPECT_EQ(test.size(), 2);
1282
+ test.insert(30);
1283
+ EXPECT_EQ(test.size(), 3);
1284
+ }
1285
+
1286
+ TEST(smallVector, NoHeapStorageForSortedVectorSet) {
1287
+ noheap_sorted_vector_set<int32_t, 2> test;
1288
+ test.insert(10);
1289
+ EXPECT_EQ(test.size(), 1);
1290
+ test.insert(10);
1291
+ EXPECT_EQ(test.size(), 1);
1292
+ test.insert(20);
1293
+ EXPECT_EQ(test.size(), 2);
1294
+ EXPECT_THROW(test.insert(30), std::length_error);
1295
+ EXPECT_EQ(test.size(), 2);
1296
+ }
1297
+
1298
+ TEST(smallVector, SelfMoveAssignmentForVectorOfPair) {
1299
+ folly::small_vector<std::pair<int, int>, 2> test;
1300
+ test.emplace_back(13, 2);
1301
+ EXPECT_EQ(test.size(), 1);
1302
+ EXPECT_EQ(test[0].first, 13);
1303
+ test = static_cast<decltype(test)&&>(test); // suppress self-move warning
1304
+ EXPECT_EQ(test.size(), 1);
1305
+ EXPECT_EQ(test[0].first, 13);
1306
+ }
1307
+
1308
+ TEST(smallVector, SelfCopyAssignmentForVectorOfPair) {
1309
+ folly::small_vector<std::pair<int, int>, 2> test;
1310
+ test.emplace_back(13, 2);
1311
+ EXPECT_EQ(test.size(), 1);
1312
+ EXPECT_EQ(test[0].first, 13);
1313
+ test = static_cast<decltype(test)&>(test); // suppress self-assign warning
1314
+ EXPECT_EQ(test.size(), 1);
1315
+ EXPECT_EQ(test[0].first, 13);
1316
+ }
1317
+
1318
+ namespace {
1319
+ struct NonAssignableType {
1320
+ int const i_{};
1321
+ };
1322
+ } // namespace
1323
+
1324
+ TEST(smallVector, PopBackNonAssignableType) {
1325
+ small_vector<NonAssignableType> v;
1326
+ v.emplace_back();
1327
+ EXPECT_EQ(1, v.size());
1328
+ v.pop_back();
1329
+ EXPECT_EQ(0, v.size());
1330
+ }
1331
+
1332
+ TEST(smallVector, erase) {
1333
+ small_vector<int> v(3);
1334
+ std::iota(v.begin(), v.end(), 1);
1335
+ v.push_back(2);
1336
+ erase(v, 2);
1337
+ ASSERT_EQ(2u, v.size());
1338
+ EXPECT_EQ(1u, v[0]);
1339
+ EXPECT_EQ(3u, v[1]);
1340
+ }
1341
+
1342
+ TEST(smallVector, eraseIf) {
1343
+ small_vector<int> v(6);
1344
+ std::iota(v.begin(), v.end(), 1);
1345
+ erase_if(v, [](const auto& x) { return x % 2 == 0; });
1346
+ ASSERT_EQ(3u, v.size());
1347
+ EXPECT_EQ(1u, v[0]);
1348
+ EXPECT_EQ(3u, v[1]);
1349
+ EXPECT_EQ(5u, v[2]);
1350
+ }
1351
+
1352
+ namespace {
1353
+
1354
+ class NonTrivialInt {
1355
+ public:
1356
+ NonTrivialInt() {}
1357
+ /* implicit */ NonTrivialInt(int value)
1358
+ : value_(std::make_shared<int>(value)) {}
1359
+
1360
+ operator int() const { return *value_; }
1361
+
1362
+ private:
1363
+ std::shared_ptr<const int> value_;
1364
+ };
1365
+
1366
+ // Move and copy constructor and assignment have several special cases depending
1367
+ // on relative sizes, so test all combinations.
1368
+ template <class T, size_t N>
1369
+ void testMoveAndCopy() {
1370
+ const auto fill = [](auto& v, size_t n) {
1371
+ v.resize(n);
1372
+ std::iota(v.begin(), v.end(), 0);
1373
+ };
1374
+ const auto verify = [](const auto& v, size_t n) {
1375
+ ASSERT_EQ(v.size(), n);
1376
+ for (size_t i = 0; i < n; ++i) {
1377
+ EXPECT_EQ(v[i], i);
1378
+ }
1379
+ };
1380
+
1381
+ using Vec = small_vector<T, N>;
1382
+ SCOPED_TRACE(fmt::format("N = {}", N));
1383
+
1384
+ const size_t kMinCapacity = Vec{}.capacity();
1385
+
1386
+ for (size_t from = 0; from < 16; ++from) {
1387
+ SCOPED_TRACE(fmt::format("from = {}", from));
1388
+
1389
+ {
1390
+ SCOPED_TRACE("Move-construction");
1391
+ Vec a;
1392
+ fill(a, from);
1393
+ const auto aCapacity = a.capacity();
1394
+ Vec b = std::move(a);
1395
+ verify(b, from);
1396
+ EXPECT_EQ(b.capacity(), aCapacity);
1397
+ verify(a, 0);
1398
+ EXPECT_EQ(a.capacity(), kMinCapacity);
1399
+ }
1400
+ {
1401
+ SCOPED_TRACE("Copy-construction");
1402
+ Vec a;
1403
+ fill(a, from);
1404
+ Vec b = a;
1405
+ verify(b, from);
1406
+ verify(a, from);
1407
+ }
1408
+
1409
+ for (size_t to = 0; to < 16; ++to) {
1410
+ SCOPED_TRACE(fmt::format("to = {}", to));
1411
+ {
1412
+ SCOPED_TRACE("Move-assignment");
1413
+ Vec a;
1414
+ fill(a, from);
1415
+ Vec b;
1416
+ fill(b, to);
1417
+
1418
+ const auto aCapacity = a.capacity();
1419
+ b = std::move(a);
1420
+ verify(b, from);
1421
+ EXPECT_EQ(b.capacity(), aCapacity);
1422
+ verify(a, 0);
1423
+ EXPECT_EQ(a.capacity(), kMinCapacity);
1424
+ }
1425
+ {
1426
+ SCOPED_TRACE("Copy-assignment");
1427
+ Vec a;
1428
+ fill(a, from);
1429
+ Vec b;
1430
+ fill(b, to);
1431
+
1432
+ b = a;
1433
+ verify(b, from);
1434
+ verify(a, from);
1435
+ }
1436
+ {
1437
+ SCOPED_TRACE("swap");
1438
+ Vec a;
1439
+ fill(a, from);
1440
+ Vec b;
1441
+ fill(b, to);
1442
+
1443
+ const auto aCapacity = a.capacity();
1444
+ const auto bCapacity = b.capacity();
1445
+ swap(a, b);
1446
+ verify(b, from);
1447
+ EXPECT_EQ(b.capacity(), aCapacity);
1448
+ verify(a, to);
1449
+ EXPECT_EQ(a.capacity(), bCapacity);
1450
+ }
1451
+ }
1452
+ }
1453
+ }
1454
+
1455
+ } // namespace
1456
+
1457
+ TEST(smallVector, MoveAndCopyTrivial) {
1458
+ testMoveAndCopy<int, 0>();
1459
+ // Capacity does not fit inline.
1460
+ testMoveAndCopy<int, 2>();
1461
+ // Capacity does fits inline.
1462
+ testMoveAndCopy<int, 4>();
1463
+ }
1464
+
1465
+ TEST(smallVector, MoveAndCopyNonTrivial) {
1466
+ testMoveAndCopy<NonTrivialInt, 0>();
1467
+ testMoveAndCopy<NonTrivialInt, 4>();
1468
+ }
1469
+
1470
+ TEST(smallVector, PolicyMaxSizeExceeded) {
1471
+ struct Obj {
1472
+ char a[350];
1473
+ };
1474
+
1475
+ small_vector<Obj, 10, policy_size_type<uint8_t>> v;
1476
+
1477
+ EXPECT_THROW(
1478
+ for (size_t i = 0; i < 0x100; ++i) { v.push_back(Obj()); },
1479
+ std::length_error);
1480
+ }
1481
+
1482
+ TEST(smallVector, Hashable) {
1483
+ small_vector<int> v0{{0, 1}};
1484
+ small_vector<int> v1{{1, 2}};
1485
+ std::unordered_set<small_vector<int>> s;
1486
+ s.insert(v0);
1487
+ EXPECT_NE(s.end(), s.find(v0));
1488
+ EXPECT_EQ(s.end(), s.find(v1));
1489
+ }
1490
+
1491
+ TEST(smallVector, overflowConstruct) {
1492
+ EXPECT_THROW(
1493
+ folly::small_vector<std::string>(SIZE_MAX / sizeof(std::string) + 1),
1494
+ std::length_error);
1495
+ }
1496
+
1497
+ TEST(smallVector, overflowResize) {
1498
+ folly::small_vector<std::string> vec;
1499
+ EXPECT_THROW(
1500
+ vec.resize(SIZE_MAX / sizeof(std::string) + 1), std::length_error);
1501
+ }
1502
+
1503
+ TEST(smallVector, overflowAssign) {
1504
+ folly::small_vector<std::string> vec;
1505
+ EXPECT_THROW(
1506
+ vec.assign(SIZE_MAX / sizeof(std::string) + 1, "hello"),
1507
+ std::length_error);
1508
+ }
1509
+
1510
+ TEST(smallVector, assignZeroElementsNoInline) {
1511
+ folly::small_vector<int, 0> v;
1512
+ v.assign(0, 42);
1513
+ EXPECT_TRUE(v.empty());
1514
+ }
1515
+
1516
+ namespace {
1517
+ struct MaybeThrowOnCopy {
1518
+ std::unique_ptr<bool> throwOnCopy;
1519
+
1520
+ explicit MaybeThrowOnCopy(bool t) : throwOnCopy(std::make_unique<bool>(t)) {}
1521
+ MaybeThrowOnCopy(const MaybeThrowOnCopy& other)
1522
+ : throwOnCopy(std::make_unique<bool>(other.throwOnCopy)) {
1523
+ if (*other.throwOnCopy) {
1524
+ throw std::runtime_error{"test"};
1525
+ }
1526
+ }
1527
+ };
1528
+ } // namespace
1529
+
1530
+ TEST(smallVector, rangeConstructorForwardIteratorThrows) {
1531
+ std::array<MaybeThrowOnCopy, 3> arr = {
1532
+ MaybeThrowOnCopy{false}, MaybeThrowOnCopy{true}, MaybeThrowOnCopy{false}};
1533
+
1534
+ using ForwardIterator =
1535
+ folly::index_iterator<std::array<MaybeThrowOnCopy, 3>>;
1536
+
1537
+ auto first = ForwardIterator{arr, 0};
1538
+ auto last = ForwardIterator{arr, arr.size()};
1539
+
1540
+ using SV1 = small_vector<MaybeThrowOnCopy, 1>;
1541
+ using SV3 = small_vector<MaybeThrowOnCopy, 3>;
1542
+
1543
+ EXPECT_THROW(SV1(first, last), std::runtime_error);
1544
+ EXPECT_THROW(SV3(first, last), std::runtime_error);
1545
+ }
1546
+
1547
+ TEST(smallVector, rangeConstructorInputIteratorThrows) {
1548
+ std::array<MaybeThrowOnCopy, 3> arr = {
1549
+ MaybeThrowOnCopy{false}, MaybeThrowOnCopy{true}, MaybeThrowOnCopy{false}};
1550
+
1551
+ class InputIterator
1552
+ : public folly::index_iterator<std::array<MaybeThrowOnCopy, 3>> {
1553
+ public:
1554
+ using difference_type = std::ptrdiff_t;
1555
+ using value_type = MaybeThrowOnCopy const;
1556
+ using reference = MaybeThrowOnCopy const&;
1557
+ using pointer = MaybeThrowOnCopy const*;
1558
+ using iterator_category = std::input_iterator_tag;
1559
+
1560
+ using index_iterator<std::array<MaybeThrowOnCopy, 3>>::index_iterator;
1561
+ };
1562
+
1563
+ auto first = InputIterator{arr, 0};
1564
+ auto last = InputIterator{arr, arr.size()};
1565
+
1566
+ using SV1 = small_vector<MaybeThrowOnCopy, 1>;
1567
+ using SV3 = small_vector<MaybeThrowOnCopy, 3>;
1568
+
1569
+ EXPECT_THROW(SV1(first, last), std::runtime_error);
1570
+ EXPECT_THROW(SV3(first, last), std::runtime_error);
1571
+ }