UUIDTests.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AzCore/UnitTest/TestTypes.h>
  9. #include <AzCore/Math/Uuid.h>
  10. #include <AzCore/std/containers/unordered_set.h>
  11. #include <random>
  12. namespace UnitTest
  13. {
  14. class UuidTests
  15. : public UnitTest::LeakDetectionFixture
  16. {
  17. static const int numUuid = 2000;
  18. AZ::Uuid* m_array;
  19. public:
  20. void SetUp() override
  21. {
  22. LeakDetectionFixture::SetUp();
  23. m_array = (AZ::Uuid*)azmalloc(sizeof(AZ::Uuid) * numUuid, alignof(AZ::Uuid));
  24. }
  25. void TearDown() override
  26. {
  27. azfree(m_array);
  28. LeakDetectionFixture::TearDown();
  29. }
  30. void run()
  31. {
  32. AZ::Uuid defId("{B5700F2E-661B-4AC0-9335-817CB4C09CCB}");
  33. // null
  34. AZ::Uuid id;
  35. EXPECT_TRUE(id.IsNull());
  36. const char idStr1[] = "{B5700F2E-661B-4AC0-9335-817CB4C09CCB}";
  37. const char idStr2[] = "{B5700F2E661B4AC09335817CB4C09CCB}";
  38. const char idStr3[] = "B5700F2E-661B-4AC0-9335-817CB4C09CCB";
  39. const char idStr4[] = "B5700F2E661B4AC09335817CB4C09CCB";
  40. // create from string
  41. id = AZ::Uuid::CreateString(idStr1);
  42. EXPECT_EQ(defId, id);
  43. id = AZ::Uuid::CreateString(idStr2);
  44. EXPECT_EQ(defId, id);
  45. id = AZ::Uuid::CreateString(idStr3);
  46. EXPECT_EQ(defId, id);
  47. id = AZ::Uuid::CreateString(idStr4);
  48. EXPECT_EQ(defId, id);
  49. // variant
  50. EXPECT_EQ(AZ::Uuid::VAR_RFC_4122, id.GetVariant());
  51. // version
  52. EXPECT_EQ(AZ::Uuid::VER_RANDOM, id.GetVersion());
  53. // tostring
  54. char buffer[39];
  55. id = AZ::Uuid::CreateString(idStr1);
  56. EXPECT_EQ(39, id.ToString(buffer, 39, true, true));
  57. EXPECT_EQ(0, strcmp(buffer, idStr1));
  58. EXPECT_EQ(35, id.ToString(buffer, 35, true, false));
  59. EXPECT_EQ(0, strcmp(buffer, idStr2));
  60. EXPECT_EQ(37, id.ToString(buffer, 37, false, true));
  61. EXPECT_EQ(0, strcmp(buffer, idStr3));
  62. EXPECT_EQ(33, id.ToString(buffer, 33, false, false));
  63. EXPECT_EQ(0, strcmp(buffer, idStr4));
  64. EXPECT_EQ(AZStd::string(idStr1), id.ToString<AZStd::string>());
  65. EXPECT_EQ(AZStd::string(idStr2), id.ToString<AZStd::string>(true, false));
  66. EXPECT_EQ(AZStd::string(idStr3), id.ToString<AZStd::string>(false, true));
  67. EXPECT_EQ(AZStd::string(idStr4), id.ToString<AZStd::string>(false, false));
  68. AZStd::string str1;
  69. id.ToString(str1);
  70. EXPECT_EQ(AZStd::string(idStr1), str1);
  71. id.ToString(str1, true, false);
  72. EXPECT_EQ(AZStd::string(idStr2), str1);
  73. id.ToString(str1, false, true);
  74. EXPECT_EQ(AZStd::string(idStr3), str1);
  75. id.ToString(str1, false, false);
  76. EXPECT_EQ(AZStd::string(idStr4), str1);
  77. // operators
  78. AZ::Uuid idBigger("C5700F2E661B4ac09335817CB4C09CCB");
  79. EXPECT_LT(id, idBigger);
  80. EXPECT_NE(idBigger, id);
  81. EXPECT_GT(idBigger,id);
  82. // hash
  83. AZStd::hash<AZ::Uuid> hash;
  84. size_t hashVal = hash(id);
  85. EXPECT_NE(0, hashVal);
  86. // test the hashing and equal function in a unordered container
  87. using UuidSetType = AZStd::unordered_set<AZ::Uuid>;
  88. UuidSetType uuidSet;
  89. uuidSet.insert(id);
  90. EXPECT_NE(uuidSet.end(), uuidSet.find(id));
  91. // check uniqueness (very quick and basic)
  92. for (int i = 0; i < numUuid; ++i)
  93. {
  94. m_array[i] = AZ::Uuid::Create();
  95. }
  96. for (int i = 0; i < numUuid; ++i)
  97. {
  98. auto uniqueToTest = AZ::Uuid::Create();
  99. for (int j = 0; j < numUuid; ++j)
  100. {
  101. EXPECT_NE(uniqueToTest, m_array[j]);
  102. }
  103. }
  104. // test the name function
  105. auto uuidName = AZ::Uuid::CreateName("BlaBla");
  106. // check variant
  107. EXPECT_EQ(AZ::Uuid::VAR_RFC_4122, uuidName.GetVariant());
  108. // check version
  109. EXPECT_EQ(AZ::Uuid::VER_NAME_SHA1, uuidName.GetVersion());
  110. // check id
  111. EXPECT_EQ(AZ::Uuid::CreateName("BlaBla"), uuidName);
  112. }
  113. };
  114. TEST_F(UuidTests, Test)
  115. {
  116. run();
  117. }
  118. TEST_F(UuidTests, GreaterThanOrEqualTo_LeftGreaterThanRight_ReturnsTrue)
  119. {
  120. const char leftStr[] = "{F418022E-DAFE-4450-BCB9-4B7727070178}";
  121. const char rightStr[] = "{B5700F2E-661B-4AC0-9335-817CB4C09CCB}";
  122. AZ::Uuid left = AZ::Uuid::CreateString(leftStr);
  123. AZ::Uuid right = AZ::Uuid::CreateString(rightStr);
  124. EXPECT_GE(left, right);
  125. }
  126. TEST_F(UuidTests, LessThan_LeftLessThanRight_ReturnsTrue)
  127. {
  128. const char leftStr[] = "{A418022E-DAFE-4450-BCB9-4B7727070178}";
  129. const char rightStr[] = "{B5700F2E-661B-4AC0-9335-817CB4C09CCB}";
  130. AZ::Uuid left = AZ::Uuid::CreateString(leftStr);
  131. AZ::Uuid right = AZ::Uuid::CreateString(rightStr);
  132. EXPECT_LT(left, right);
  133. }
  134. TEST_F(UuidTests, GreaterThanOrEqualTo_LeftEqualsRight_ReturnsTrue)
  135. {
  136. const char uuidStr[] = "{F418022E-DAFE-4450-BCB9-4B7727070178}";
  137. AZ::Uuid left = AZ::Uuid::CreateString(uuidStr);
  138. AZ::Uuid right = AZ::Uuid::CreateString(uuidStr);
  139. EXPECT_GE(left, right);
  140. }
  141. TEST_F(UuidTests, GreaterThan_LeftGreaterThanRight_ReturnsTrue)
  142. {
  143. const char leftStr[] = "{F418022E-DAFE-4450-BCB9-4B7727070178}";
  144. const char rightStr[] = "{B5700F2E-661B-4AC0-9335-817CB4C09CCB}";
  145. AZ::Uuid left = AZ::Uuid::CreateString(leftStr);
  146. AZ::Uuid right = AZ::Uuid::CreateString(rightStr);
  147. EXPECT_GT(left, right);
  148. }
  149. TEST_F(UuidTests, LessThanOrEqualTo_LeftLessThanRight_ReturnsTrue)
  150. {
  151. const char leftStr[] = "{A418022E-DAFE-4450-BCB9-4B7727070178}";
  152. const char rightStr[] = "{B5700F2E-661B-4AC0-9335-817CB4C09CCB}";
  153. AZ::Uuid left = AZ::Uuid::CreateString(leftStr);
  154. AZ::Uuid right = AZ::Uuid::CreateString(rightStr);
  155. EXPECT_LE(left, right);
  156. }
  157. TEST_F(UuidTests, LessThanOrEqualTo_LeftEqualsRight_ReturnsTrue)
  158. {
  159. const char uuidStr[] = "{F418022E-DAFE-4450-BCB9-4B7727070178}";
  160. AZ::Uuid left = AZ::Uuid::CreateString(uuidStr);
  161. AZ::Uuid right = AZ::Uuid::CreateString(uuidStr);
  162. EXPECT_LE(left, right);
  163. }
  164. TEST_F(UuidTests, CreateStringPermissive_HexAndSpacesGiven_Success)
  165. {
  166. const char uuidStr[] = "{34D44249-E599-4B30-811F-4215C2DEA269}";
  167. AZ::Uuid left = AZ::Uuid::CreateString(uuidStr);
  168. const char permissiveStr[] = "{ 0x34D44249 - 0xE5994B30 - 0x811F4215 - 0xC2DEA269 }";
  169. AZ::Uuid right = AZ::Uuid::CreateStringPermissive(permissiveStr);
  170. EXPECT_EQ(left, right);
  171. const char permissiveStr2[] = "{ 0x34D44249-0xE5994B30 0x811F4215 - C2DEA269 }";
  172. right = AZ::Uuid::CreateStringPermissive(permissiveStr2);
  173. EXPECT_EQ(left, right);
  174. const char permissiveStr3[] = "34D44249-0xE5994B30 0x811F4215 - C2DEA269 }";
  175. right = AZ::Uuid::CreateStringPermissive(permissiveStr3);
  176. EXPECT_EQ(left, right);
  177. const char permissiveStr4[] = "{ x34D44249 - xE5994B30 - x811F4215 xC2DEA269 }";
  178. right = AZ::Uuid::CreateStringPermissive(permissiveStr4);
  179. EXPECT_EQ(left, right);
  180. const char permissiveStr5[] = "{ 0X34D44249 - 0XE5994B30 - 0X811F4215 0XC2DEA269 }";
  181. right = AZ::Uuid::CreateStringPermissive(permissiveStr5);
  182. EXPECT_EQ(left, right);
  183. }
  184. TEST_F(UuidTests, CreateStringPermissive_InvalidHexAndSpacesGiven_Fails)
  185. {
  186. const char uuidStr[] = "{8FDDE7B1 - C332 - 4EBA - BD85 - 2898E7440E4C}";
  187. AZ::Uuid left = AZ::Uuid::CreateStringPermissive(uuidStr);
  188. const char permissiveStr1[] = "{ 8FDDE7B1 - 0 xC332 - 4EBA - BD85 - 2898E7440E4C}";
  189. AZ::Uuid right = AZ::Uuid::CreateStringPermissive(permissiveStr1);
  190. EXPECT_NE(left, right);
  191. }
  192. TEST_F(UuidTests, CreateStringPermissive_InvalidCharacterGiven_Fails)
  193. {
  194. AZ::Uuid left = AZ::Uuid::CreateNull();
  195. // The below check should just give an empty uuid due to the 'g'
  196. const char permissiveStr1[] = "{CCF8AB1E- gA04A-43D1-AD8A-70725BC3392E}";
  197. AZ::Uuid right = AZ::Uuid::CreateStringPermissive(permissiveStr1);
  198. EXPECT_EQ(left, right);
  199. }
  200. TEST_F(UuidTests, CreateStringPermissive_StringWithExtraData_Succeeds)
  201. {
  202. const char uuidStr[] = "{34D44249-E599-4B30-811F-4215C2DEA269}";
  203. AZ::Uuid left = AZ::Uuid::CreateString(uuidStr);
  204. const char permissiveStr[] = "0x34D44249-0xE5994B30-0x811F4215-0xC2DEA269 Hello World";
  205. AZ::Uuid right = AZ::Uuid::CreateStringPermissive(permissiveStr);
  206. EXPECT_EQ(left, right);
  207. }
  208. TEST_F(UuidTests, CreateStringPermissive_StringWithLotsOfExtraData_Succeeds)
  209. {
  210. const char uuidStr[] = "{34D44249-E599-4B30-811F-4215C2DEA269}";
  211. AZ::Uuid left = AZ::Uuid::CreateString(uuidStr);
  212. const char permissiveStr[] = "0x34D44249-0xE5994B30-0x811F4215-0xC2DEA269 Hello World this is a really long string "
  213. "with lots of extra data to make sure we can parse a long string without failing as long as the uuid is in "
  214. "the beginning of the string then we should succeed";
  215. AZ::Uuid right = AZ::Uuid::CreateStringPermissive(permissiveStr);
  216. EXPECT_EQ(left, right);
  217. }
  218. TEST_F(UuidTests, ToFixedString_ResultIsAccurate_Succeeds)
  219. {
  220. {
  221. const char uuidStr[] = "{34D44249-E599-4B30-811F-4215C2DEA269}";
  222. const AZ::Uuid source = AZ::Uuid::CreateString(uuidStr);
  223. const AZStd::string dynamic = source.ToString<AZStd::string>();
  224. const AZ::Uuid::FixedString fixed = source.ToFixedString();
  225. EXPECT_STREQ(dynamic.c_str(), fixed.c_str());
  226. }
  227. {
  228. const char uuidStr[] = "{678EFGBA-E599-4B30-811F-77775555AAFF}";
  229. const AZ::Uuid source = AZ::Uuid::CreateString(uuidStr);
  230. const AZStd::string dynamic = source.ToString<AZStd::string>();
  231. const AZ::Uuid::FixedString fixed = source.ToFixedString();
  232. EXPECT_STREQ(dynamic.c_str(), fixed.c_str());
  233. }
  234. }
  235. TEST_F(UuidTests, ToFixedString_FormatSpecifier_Succeeds)
  236. {
  237. {
  238. const char uuidStr[] = "{34D44249-E599-4B30-811F-4215C2DEA269}";
  239. const AZ::Uuid source = AZ::Uuid::CreateString(uuidStr);
  240. const AZStd::string dynamic = AZStd::string::format("%s", source.ToString<AZStd::string>().c_str());
  241. const AZStd::string fixed = AZStd::string::format("%s", source.ToFixedString().c_str());
  242. EXPECT_EQ(dynamic, fixed);
  243. }
  244. {
  245. const char uuidStr[] = "{678EFGBA-E599-4B30-811F-77775555AAFF}";
  246. const AZ::Uuid source = AZ::Uuid::CreateString(uuidStr);
  247. const AZStd::string dynamic = AZStd::string::format("%s", source.ToString<AZStd::string>().c_str());
  248. const AZStd::string fixed = AZStd::string::format("%s", source.ToFixedString().c_str());
  249. EXPECT_EQ(dynamic, fixed);
  250. }
  251. }
  252. TEST_F(UuidTests, UuidIsConstexpr_Compiles)
  253. {
  254. constexpr AZ::Uuid defaultUuid;
  255. static_assert(defaultUuid.IsNull());
  256. static_assert(defaultUuid == AZ::Uuid{});
  257. static_assert(defaultUuid <= AZ::Uuid{});
  258. static_assert(defaultUuid >= AZ::Uuid{});
  259. static_assert(!(defaultUuid != AZ::Uuid{}));
  260. static_assert(!(defaultUuid < AZ::Uuid{}));
  261. static_assert(!(defaultUuid > AZ::Uuid{}));
  262. constexpr AZ::Uuid::FixedString uuidString = defaultUuid.ToFixedString();
  263. static_assert(uuidString == "{00000000-0000-0000-0000-000000000000}");
  264. EXPECT_EQ("{00000000-0000-0000-0000-000000000000}", uuidString);
  265. constexpr auto nullUuid = AZ::Uuid::CreateNull();
  266. static_assert(nullUuid.IsNull());
  267. // Uuid from uuid formatted string
  268. constexpr AZ::Uuid stringUuid{ "{610014D7-DC11-4305-83D8-D59F3AB224B4}" };
  269. static_assert(!stringUuid.IsNull());
  270. static_assert(stringUuid != defaultUuid);
  271. constexpr AZStd::string_view viewString{ "{610014D7-DC11-4305-83D8-D59F3AB224B4}" };
  272. constexpr auto string2Uuid = AZ::Uuid::CreateString(viewString.data(), viewString.size());
  273. static_assert(stringUuid == string2Uuid);
  274. // Uuid from text string using SHA-1 algorithm
  275. constexpr auto nameUuid = AZ::Uuid::CreateName("BlaBla");
  276. // check variant
  277. static_assert(nameUuid.GetVariant() == AZ::Uuid::VAR_RFC_4122);
  278. // check version
  279. static_assert(nameUuid.GetVersion() == AZ::Uuid::VER_NAME_SHA1);
  280. // check id
  281. static_assert(!nameUuid.IsNull());
  282. // Uuid from data blob
  283. constexpr AZStd::array dataArray{ 0x14, 0x56, 0x32, 0xFF, 0x42, 0x98, 0x76, 0x4d, 0x22, 0xFA };
  284. constexpr auto dataUuid = AZ::Uuid::CreateData(dataArray);
  285. static_assert(!dataUuid.IsNull());
  286. // constexpr hash function
  287. constexpr AZ::Uuid hashStringUuid{ "{1F02F63B-4527-4234-9D2A-AD11F4323019}" };
  288. // The Uuid::GetHash function returns the first 8 bytes of the Uuid as a size_t
  289. constexpr size_t expectedHashValue = 0x3442'2745'3BF6'021F;
  290. static_assert(hashStringUuid.GetHash() == expectedHashValue);
  291. }
  292. namespace UuidTestInternal
  293. {
  294. template<auto TypeId>
  295. constexpr const char* TypeConverter()
  296. {
  297. return "Primary Converter";
  298. }
  299. template<>
  300. constexpr const char* TypeConverter<O3DE_UUID_TO_NONTYPE_PARAM("{2232CEF3-A4EF-481D-97AC-90044DAD7FBE}")>()
  301. {
  302. return "My Custom Converter";
  303. }
  304. }
  305. TEST_F(UuidTests, UuidNonTypeSpecialization_IsCalled)
  306. {
  307. constexpr AZ::Uuid uuidNonSpecialized{ "{EE90E096-00FD-498F-9132-AD963C2AA65D}" };
  308. constexpr AZ::Uuid uuidSpecialized{ "{2232CEF3-A4EF-481D-97AC-90044DAD7FBE}" };
  309. EXPECT_STREQ("Primary Converter", UuidTestInternal::TypeConverter<O3DE_UUID_TO_NONTYPE_PARAM(uuidNonSpecialized)>());
  310. EXPECT_STREQ("My Custom Converter", UuidTestInternal::TypeConverter<O3DE_UUID_TO_NONTYPE_PARAM(uuidSpecialized)>());
  311. }
  312. // These static asserts test the UuidInternal::GetValue function
  313. // Expected inputs from a Uuid
  314. static_assert(AZ::UuidInternal::GetValue('0') == AZStd::byte(0));
  315. static_assert(AZ::UuidInternal::GetValue('1') == AZStd::byte(1));
  316. static_assert(AZ::UuidInternal::GetValue('2') == AZStd::byte(2));
  317. static_assert(AZ::UuidInternal::GetValue('3') == AZStd::byte(3));
  318. static_assert(AZ::UuidInternal::GetValue('4') == AZStd::byte(4));
  319. static_assert(AZ::UuidInternal::GetValue('5') == AZStd::byte(5));
  320. static_assert(AZ::UuidInternal::GetValue('6') == AZStd::byte(6));
  321. static_assert(AZ::UuidInternal::GetValue('7') == AZStd::byte(7));
  322. static_assert(AZ::UuidInternal::GetValue('8') == AZStd::byte(8));
  323. static_assert(AZ::UuidInternal::GetValue('9') == AZStd::byte(9));
  324. static_assert(AZ::UuidInternal::GetValue('a') == AZStd::byte(10));
  325. static_assert(AZ::UuidInternal::GetValue('b') == AZStd::byte(11));
  326. static_assert(AZ::UuidInternal::GetValue('c') == AZStd::byte(12));
  327. static_assert(AZ::UuidInternal::GetValue('d') == AZStd::byte(13));
  328. static_assert(AZ::UuidInternal::GetValue('e') == AZStd::byte(14));
  329. static_assert(AZ::UuidInternal::GetValue('f') == AZStd::byte(15));
  330. static_assert(AZ::UuidInternal::GetValue('A') == AZStd::byte(10));
  331. static_assert(AZ::UuidInternal::GetValue('B') == AZStd::byte(11));
  332. static_assert(AZ::UuidInternal::GetValue('C') == AZStd::byte(12));
  333. static_assert(AZ::UuidInternal::GetValue('D') == AZStd::byte(13));
  334. static_assert(AZ::UuidInternal::GetValue('E') == AZStd::byte(14));
  335. static_assert(AZ::UuidInternal::GetValue('F') == AZStd::byte(15));
  336. // Common characters in a Uuid
  337. static_assert(AZ::UuidInternal::GetValue('{') == AZ::UuidInternal::InvalidValue);
  338. static_assert(AZ::UuidInternal::GetValue('-') == AZ::UuidInternal::InvalidValue);
  339. static_assert(AZ::UuidInternal::GetValue('}') == AZ::UuidInternal::InvalidValue);
  340. static_assert(AZ::UuidInternal::GetValue(' ') == AZ::UuidInternal::InvalidValue);
  341. // Boundary conditions with invalid Uuid characters
  342. static_assert(AZ::UuidInternal::GetValue(0) == AZ::UuidInternal::InvalidValue);
  343. static_assert(AZ::UuidInternal::GetValue(AZStd::numeric_limits<char>::max()) == AZ::UuidInternal::InvalidValue);
  344. static_assert(AZ::UuidInternal::GetValue('0' - 1) == AZ::UuidInternal::InvalidValue);
  345. static_assert(AZ::UuidInternal::GetValue('9' + 1) == AZ::UuidInternal::InvalidValue);
  346. static_assert(AZ::UuidInternal::GetValue('a' - 1) == AZ::UuidInternal::InvalidValue);
  347. static_assert(AZ::UuidInternal::GetValue('f' + 1) == AZ::UuidInternal::InvalidValue);
  348. static_assert(AZ::UuidInternal::GetValue('A' - 1) == AZ::UuidInternal::InvalidValue);
  349. static_assert(AZ::UuidInternal::GetValue('F' + 1) == AZ::UuidInternal::InvalidValue);
  350. class UuidBenchmark : public AllocatorsBenchmarkFixture
  351. {
  352. public:
  353. void SetUp(::benchmark::State& st) override
  354. {
  355. AllocatorsBenchmarkFixture::SetUp(st);
  356. SetUpInternal();
  357. }
  358. void SetUp(const ::benchmark::State& st) override
  359. {
  360. AllocatorsBenchmarkFixture::SetUp(st);
  361. SetUpInternal();
  362. }
  363. void TearDown(::benchmark::State& st) override
  364. {
  365. TearDownInternal();
  366. AllocatorsBenchmarkFixture::TearDown(st);
  367. }
  368. void TearDown(const ::benchmark::State& st) override
  369. {
  370. TearDownInternal();
  371. AllocatorsBenchmarkFixture::TearDown(st);
  372. }
  373. void SetUpInternal()
  374. {
  375. std::mt19937 randomEngine(0);
  376. m_uuidStrings.resize(100);
  377. // Generate some random guid strings, using a random mix of guid formats
  378. for (AZStd::string& uuidString : m_uuidStrings)
  379. {
  380. bool useBrackets = std::uniform_int_distribution<>{ 0, 1 }(randomEngine);
  381. bool useDashes = std::uniform_int_distribution<>{ 0, 1 }(randomEngine);
  382. uuidString = AZ::Uuid::CreateRandom().ToString<AZStd::string>(useBrackets, useDashes);
  383. }
  384. }
  385. void TearDownInternal()
  386. {
  387. m_uuidStrings.clear();
  388. m_uuidStrings.shrink_to_fit();
  389. }
  390. AZStd::vector<AZStd::string> m_uuidStrings;
  391. };
  392. BENCHMARK_DEFINE_F(UuidBenchmark, CreateString_Benchmark)(::benchmark::State& st)
  393. {
  394. while (st.KeepRunning())
  395. {
  396. for (const AZStd::string& uuidString : m_uuidStrings)
  397. {
  398. AZ::Uuid::CreateString(uuidString);
  399. }
  400. }
  401. }
  402. BENCHMARK_REGISTER_F(UuidBenchmark, CreateString_Benchmark)->Unit(benchmark::kNanosecond);
  403. }