SmartPtr.cpp 62 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072
  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 "UserTypes.h"
  9. #include <AzCore/std/smart_ptr/shared_ptr.h>
  10. #include <AzCore/std/smart_ptr/weak_ptr.h>
  11. #include <AzCore/std/smart_ptr/make_shared.h>
  12. #include <AzCore/std/smart_ptr/shared_array.h>
  13. #include <AzCore/std/smart_ptr/scoped_ptr.h>
  14. #include <AzCore/std/smart_ptr/scoped_array.h>
  15. #include <AzCore/std/smart_ptr/intrusive_ptr.h>
  16. #include <AzCore/std/smart_ptr/unique_ptr.h>
  17. #include <AzCore/std/smart_ptr/intrusive_base.h>
  18. #include <AzCore/std/parallel/thread.h>
  19. #include <AzCore/std/functional.h>
  20. #include <AzCore/std/containers/map.h>
  21. #include <AzCore/std/containers/unordered_map.h>
  22. #include <AzCore/std/containers/vector.h>
  23. #include <AzCore/Memory/SystemAllocator.h>
  24. namespace UnitTest
  25. {
  26. using namespace AZStd;
  27. using namespace UnitTestInternal;
  28. class SmartPtr
  29. : public LeakDetectionFixture
  30. {
  31. public:
  32. void SetUp() override;
  33. void TearDown() override;
  34. //////////////////////////////////////////////////////////////////////////
  35. //////////////////////////////////////////////////////////////////////////
  36. // Shared pointer
  37. //////////////////////////////////////////////////////////////////////////
  38. //////////////////////////////////////////////////////////////////////////
  39. class SharedPtr
  40. {
  41. public:
  42. class n_element_type
  43. {
  44. public:
  45. static void f(int&)
  46. {
  47. }
  48. static void test()
  49. {
  50. typedef AZStd::shared_ptr<int>::element_type T;
  51. T t;
  52. f(t);
  53. }
  54. }; // namespace n_element_type
  55. class incomplete;
  56. class test
  57. {
  58. public:
  59. struct A
  60. {
  61. int dummy;
  62. };
  63. struct B
  64. {
  65. int dummy2;
  66. };
  67. struct C
  68. : public A
  69. , public virtual B
  70. {
  71. };
  72. struct X
  73. {
  74. X(test& instanceOwner)
  75. : instanceRef(instanceOwner)
  76. {
  77. ++instanceRef.m_xInstances;
  78. }
  79. virtual ~X()
  80. {
  81. --instanceRef.m_xInstances;
  82. }
  83. bool operator==(const X&) const
  84. {
  85. return true;
  86. }
  87. private:
  88. test& instanceRef;
  89. X(X const&) = delete;
  90. X& operator= (X const&) = delete;
  91. };
  92. // virtual inheritance stresses the implementation
  93. struct Y
  94. : public A
  95. , public virtual X
  96. {
  97. Y(test& instanceOwner)
  98. : X(instanceOwner)
  99. , instanceRef(instanceOwner)
  100. {
  101. ++instanceRef.m_yInstances;
  102. }
  103. ~Y() override
  104. {
  105. --instanceRef.m_yInstances;
  106. }
  107. private:
  108. test& instanceRef;
  109. Y(Y const&) = delete;
  110. Y& operator= (Y const&) = delete;
  111. };
  112. static void deleter(int* p)
  113. {
  114. EXPECT_TRUE(p == nullptr);
  115. }
  116. struct deleter2
  117. {
  118. deleter2(const deleter2&) = default;
  119. deleter2& operator=(const deleter2&) = default;
  120. deleter2(int* basePtr) : memberPtr(basePtr) {}
  121. void operator()(int* p)
  122. {
  123. EXPECT_TRUE(p == memberPtr);
  124. ++*p;
  125. }
  126. int* memberPtr = nullptr;
  127. };
  128. struct deleter3
  129. {
  130. void operator()(incomplete* p)
  131. {
  132. EXPECT_TRUE(p == nullptr);
  133. }
  134. };
  135. struct deleter_void
  136. {
  137. deleter_void(const deleter_void&) = default;
  138. deleter_void& operator=(const deleter_void& other) = default;
  139. deleter_void(void*& deletedPtr) : d(&deletedPtr) {}
  140. void operator()(void* p)
  141. {
  142. *d = p;
  143. }
  144. void** d;
  145. };
  146. int m = 0;
  147. void* deleted = nullptr;
  148. AZ::s32 m_xInstances = 0;
  149. AZ::s32 m_yInstances = 0;
  150. };
  151. template <class P, class T>
  152. void TestPtr(AZStd::shared_ptr<P>& pt, T* p)
  153. {
  154. if (p)
  155. {
  156. EXPECT_TRUE(pt);
  157. EXPECT_FALSE(!pt);
  158. }
  159. else
  160. {
  161. EXPECT_FALSE(pt);
  162. EXPECT_TRUE(!pt);
  163. }
  164. EXPECT_EQ(p, pt.get());
  165. EXPECT_EQ(1, pt.use_count());
  166. EXPECT_TRUE(pt.unique());
  167. }
  168. template <class P, class T>
  169. void TestAddr(T* p)
  170. {
  171. AZStd::shared_ptr<P> pt(p);
  172. TestPtr(pt, p);
  173. }
  174. template <class P, class T>
  175. void TestNull(T* p)
  176. {
  177. EXPECT_EQ(nullptr, p);
  178. TestAddr<P, T>(p);
  179. }
  180. template <class T>
  181. void TestType(T* p)
  182. {
  183. TestNull<T>(p);
  184. }
  185. template <class P, class T>
  186. void TestValue(T* p, const T& val)
  187. {
  188. AZStd::shared_ptr<P> pi(p);
  189. EXPECT_TRUE(pi);
  190. EXPECT_FALSE(!pi);
  191. EXPECT_EQ(p, pi.get());
  192. EXPECT_EQ(1, pi.use_count());
  193. EXPECT_TRUE(pi.unique());
  194. EXPECT_EQ(val, *reinterpret_cast<const T*>(pi.get()));
  195. }
  196. template <class P, class T>
  197. void TestPolymorphic(T* p)
  198. {
  199. AZStd::shared_ptr<P> pi(p);
  200. EXPECT_TRUE(pi);
  201. EXPECT_FALSE(!pi);
  202. EXPECT_EQ(p, pi.get());
  203. EXPECT_EQ(1, pi.use_count());
  204. EXPECT_TRUE(pi.unique());
  205. EXPECT_EQ(1, m_test.m_xInstances);
  206. EXPECT_EQ(1, m_test.m_yInstances);
  207. }
  208. test m_test;
  209. };
  210. SharedPtr* m_sharedPtr = nullptr;
  211. /// Special deleter for RefCountedClass to use, that will track whether the object has been deleted.
  212. struct TestDeleter
  213. : public AZStd::intrusive_default_delete
  214. {
  215. bool* m_deleted = nullptr;
  216. explicit TestDeleter(bool* deleted = nullptr)
  217. {
  218. m_deleted = deleted;
  219. }
  220. template <typename U>
  221. void operator () (U* p) const
  222. {
  223. if (m_deleted)
  224. {
  225. *m_deleted = true;
  226. }
  227. AZStd::intrusive_default_delete::operator () (p);
  228. }
  229. };
  230. struct RefCountedClass : public AZStd::intrusive_refcount<uint32_t, TestDeleter>
  231. {
  232. AZ_RTTI(RefCountedClass, "{622324BD-1407-4843-B798-90F7AA48D615}")
  233. RefCountedClass(bool* deleted = nullptr) : AZStd::intrusive_refcount<uint32_t, TestDeleter>(TestDeleter{deleted})
  234. {}
  235. AZStd::string m_string;
  236. };
  237. struct RefCountedSubclass : public RefCountedClass
  238. {
  239. AZ_RTTI(RefCountedSubclass, "{8C687739-01DC-4272-8008-5FE38A0839FB}", RefCountedClass)
  240. RefCountedSubclass(bool* deleted = nullptr) : RefCountedClass(deleted)
  241. {}
  242. AZStd::string m_anotherString;
  243. };
  244. struct RefCountedSubclassB : public RefCountedClass
  245. {
  246. AZ_RTTI(RefCountedSubclassB, "{809046A7-18F5-4DC3-8841-34EFACC5C5E8}", RefCountedClass)
  247. RefCountedSubclassB(bool* deleted = nullptr) : RefCountedClass(deleted)
  248. {}
  249. int m_number;
  250. };
  251. };
  252. void SmartPtr::SetUp()
  253. {
  254. LeakDetectionFixture::SetUp();
  255. m_sharedPtr = new SharedPtr;
  256. }
  257. void SmartPtr::TearDown()
  258. {
  259. delete m_sharedPtr;
  260. LeakDetectionFixture::TearDown();
  261. }
  262. TEST_F(SmartPtr, SharedPtrCtorInt)
  263. {
  264. AZStd::shared_ptr<int> pi;
  265. EXPECT_FALSE(pi);
  266. EXPECT_TRUE(!pi);
  267. EXPECT_EQ(nullptr, pi.get());
  268. EXPECT_EQ(0, pi.use_count());
  269. }
  270. TEST_F(SmartPtr, SharedPtrCtorVoid)
  271. {
  272. AZStd::shared_ptr<void> pv;
  273. EXPECT_FALSE(pv);
  274. EXPECT_TRUE(!pv);
  275. EXPECT_EQ(nullptr, pv.get());
  276. EXPECT_EQ(0, pv.use_count());
  277. }
  278. TEST_F(SmartPtr, SharedPtrCtorIncomplete)
  279. {
  280. AZStd::shared_ptr<SharedPtr::incomplete> px;
  281. EXPECT_FALSE(px);
  282. EXPECT_TRUE(!px);
  283. EXPECT_EQ(nullptr, px.get());
  284. EXPECT_EQ(0, px.use_count());
  285. }
  286. TEST_F(SmartPtr, SharedPtrCtorNullptr)
  287. {
  288. AZStd::shared_ptr<int> pi(nullptr);
  289. EXPECT_FALSE(pi);
  290. EXPECT_TRUE(!pi);
  291. EXPECT_EQ(nullptr, pi.get());
  292. EXPECT_EQ(0, pi.use_count());
  293. }
  294. TEST_F(SmartPtr, SharedPtrCtorIntPtr)
  295. {
  296. m_sharedPtr->TestType(static_cast<int*>(nullptr));
  297. m_sharedPtr->TestType(static_cast<int const*>(nullptr));
  298. m_sharedPtr->TestType(static_cast<int volatile*>(nullptr));
  299. m_sharedPtr->TestType(static_cast<int const volatile*>(nullptr));
  300. }
  301. TEST_F(SmartPtr, SharedPtrCtorConstIntPtr)
  302. {
  303. m_sharedPtr->TestNull<int const>(static_cast<int*>(nullptr));
  304. m_sharedPtr->TestNull<int volatile>(static_cast<int*>(nullptr));
  305. m_sharedPtr->TestNull<void>(static_cast<int*>(nullptr));
  306. m_sharedPtr->TestNull<void const>(static_cast<int*>(nullptr));
  307. }
  308. TEST_F(SmartPtr, SharedPtrCtorX)
  309. {
  310. m_sharedPtr->TestType(static_cast<SharedPtr::test::X*>(nullptr));
  311. m_sharedPtr->TestType(static_cast<SharedPtr::test::X const*>(nullptr));
  312. m_sharedPtr->TestType(static_cast<SharedPtr::test::X volatile*>(nullptr));
  313. m_sharedPtr->TestType(static_cast<SharedPtr::test::X const volatile*>(nullptr));
  314. }
  315. TEST_F(SmartPtr, SharedPtrCtorXConvert)
  316. {
  317. m_sharedPtr->TestNull<SharedPtr::test::X const>(static_cast<SharedPtr::test::X*>(nullptr));
  318. m_sharedPtr->TestNull<SharedPtr::test::X>(static_cast<SharedPtr::test::Y*>(nullptr));
  319. m_sharedPtr->TestNull<SharedPtr::test::X const>(static_cast<SharedPtr::test::Y*>(nullptr));
  320. m_sharedPtr->TestNull<void>(static_cast<SharedPtr::test::X*>(nullptr));
  321. m_sharedPtr->TestNull<void const>(static_cast<SharedPtr::test::X*>(nullptr));
  322. }
  323. TEST_F(SmartPtr, SharedPtrCtorIntValue)
  324. {
  325. m_sharedPtr->TestValue<int>(new int(7), 7);
  326. m_sharedPtr->TestValue<int const>(new int(7), 7);
  327. m_sharedPtr->TestValue<void>(new int(7), 7);
  328. m_sharedPtr->TestValue<void const>(new int(7), 7);
  329. }
  330. TEST_F(SmartPtr, SharedPtrTestXValue)
  331. {
  332. using X = SharedPtr::test::X;
  333. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  334. m_sharedPtr->TestValue<X>(new X(m_sharedPtr->m_test), X(m_sharedPtr->m_test));
  335. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  336. m_sharedPtr->TestValue<X const>(new X(m_sharedPtr->m_test), X(m_sharedPtr->m_test));
  337. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  338. m_sharedPtr->TestValue<void>(new X(m_sharedPtr->m_test), X(m_sharedPtr->m_test));
  339. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  340. m_sharedPtr->TestValue<void const>(new X(m_sharedPtr->m_test), X(m_sharedPtr->m_test));
  341. }
  342. TEST_F(SmartPtr, SharedPtrTestXValuePoly)
  343. {
  344. using X = SharedPtr::test::X;
  345. using Y = SharedPtr::test::Y;
  346. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  347. EXPECT_EQ(0, m_sharedPtr->m_test.m_yInstances);
  348. m_sharedPtr->TestPolymorphic< X, Y>(new Y(m_sharedPtr->m_test));
  349. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  350. EXPECT_EQ(0, m_sharedPtr->m_test.m_yInstances);
  351. m_sharedPtr->TestPolymorphic< X const, Y>(new Y(m_sharedPtr->m_test));
  352. }
  353. TEST_F(SmartPtr, SharedPtrFromUniquePtr)
  354. {
  355. using X = SharedPtr::test::X;
  356. using Y = SharedPtr::test::Y;
  357. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  358. EXPECT_EQ(0, m_sharedPtr->m_test.m_yInstances);
  359. {
  360. X* p = new X(m_sharedPtr->m_test);
  361. AZStd::unique_ptr<X> pu(p);
  362. AZStd::shared_ptr<X> px(AZStd::move(pu));
  363. EXPECT_TRUE(px);
  364. EXPECT_FALSE(!px);
  365. EXPECT_EQ(p, px.get());
  366. EXPECT_EQ(1, px.use_count());
  367. EXPECT_TRUE(px.unique());
  368. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  369. }
  370. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  371. {
  372. X* p = new X(m_sharedPtr->m_test);
  373. AZStd::unique_ptr<X> pu(p);
  374. AZStd::shared_ptr<X> px(nullptr);
  375. px = AZStd::move(pu);
  376. EXPECT_TRUE(px);
  377. EXPECT_FALSE(!px);
  378. EXPECT_EQ(p, px.get());
  379. EXPECT_EQ(1, px.use_count());
  380. EXPECT_TRUE(px.unique());
  381. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  382. }
  383. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  384. {
  385. Y* p = new Y(m_sharedPtr->m_test);
  386. AZStd::unique_ptr<Y> pu(p);
  387. AZStd::shared_ptr<X> px(AZStd::move(pu));
  388. EXPECT_TRUE(px);
  389. EXPECT_FALSE(!px);
  390. EXPECT_EQ(p, px.get());
  391. EXPECT_EQ(1, px.use_count());
  392. EXPECT_TRUE(px.unique());
  393. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  394. EXPECT_EQ(1, m_sharedPtr->m_test.m_yInstances);
  395. }
  396. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  397. EXPECT_EQ(0, m_sharedPtr->m_test.m_yInstances);
  398. {
  399. Y* p = new Y(m_sharedPtr->m_test);
  400. AZStd::unique_ptr<Y> pu(p);
  401. AZStd::shared_ptr<X> px(nullptr);
  402. px = AZStd::move(pu);
  403. EXPECT_TRUE(px);
  404. EXPECT_FALSE(!px);
  405. EXPECT_EQ(p, px.get());
  406. EXPECT_EQ(1, px.use_count());
  407. EXPECT_TRUE(px.unique());
  408. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  409. EXPECT_EQ(1, m_sharedPtr->m_test.m_yInstances);
  410. }
  411. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  412. EXPECT_EQ(0, m_sharedPtr->m_test.m_yInstances);
  413. }
  414. TEST_F(SmartPtr, UniquePtrToUniquePtrPoly)
  415. {
  416. using X = SharedPtr::test::X;
  417. using Y = SharedPtr::test::Y;
  418. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  419. EXPECT_EQ(0, m_sharedPtr->m_test.m_yInstances);
  420. {
  421. // Test moving unique_ptr of child type to unique_ptr of base type
  422. Y * p = new Y(m_sharedPtr->m_test);
  423. AZStd::unique_ptr<Y> pu(p);
  424. AZStd::unique_ptr<X> px(AZStd::move(pu));
  425. EXPECT_TRUE(!!px);
  426. EXPECT_FALSE(!px);
  427. EXPECT_EQ(p, px.get());
  428. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  429. EXPECT_EQ(1, m_sharedPtr->m_test.m_yInstances);
  430. }
  431. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  432. EXPECT_EQ(0, m_sharedPtr->m_test.m_yInstances);
  433. }
  434. TEST_F(SmartPtr, SharedPtrCtorNullDeleter)
  435. {
  436. {
  437. AZStd::shared_ptr<int> pi(static_cast<int*>(nullptr), &SharedPtr::test::deleter);
  438. m_sharedPtr->TestPtr<int, int>(pi, nullptr);
  439. }
  440. {
  441. AZStd::shared_ptr<void> pv(static_cast<int*>(nullptr), &SharedPtr::test::deleter);
  442. m_sharedPtr->TestPtr<void, int>(pv, nullptr);
  443. }
  444. {
  445. AZStd::shared_ptr<void const> pv(static_cast<int*>(nullptr), &SharedPtr::test::deleter);
  446. m_sharedPtr->TestPtr<void const, int>(pv, nullptr);
  447. }
  448. }
  449. TEST_F(SmartPtr, SharedPtrCtorIncompleteDeleter)
  450. {
  451. SharedPtr::incomplete* p0 = nullptr;
  452. {
  453. AZStd::shared_ptr<SharedPtr::incomplete> px(p0, SharedPtr::test::deleter3());
  454. m_sharedPtr->TestPtr(px, p0);
  455. }
  456. {
  457. AZStd::shared_ptr<void> pv(p0, SharedPtr::test::deleter3());
  458. m_sharedPtr->TestPtr(pv, p0);
  459. }
  460. {
  461. AZStd::shared_ptr<void const> pv(p0, SharedPtr::test::deleter3());
  462. m_sharedPtr->TestPtr(pv, p0);
  463. }
  464. }
  465. TEST_F(SmartPtr, SharedPtrCtorIntDeleter)
  466. {
  467. EXPECT_EQ(0, m_sharedPtr->m_test.m);
  468. {
  469. AZStd::shared_ptr<int> pi(&m_sharedPtr->m_test.m, SharedPtr::test::deleter2(&m_sharedPtr->m_test.m));
  470. m_sharedPtr->TestPtr(pi, &m_sharedPtr->m_test.m);
  471. }
  472. EXPECT_EQ(1, m_sharedPtr->m_test.m);
  473. {
  474. AZStd::shared_ptr<int const> pi(&m_sharedPtr->m_test.m, SharedPtr::test::deleter2(&m_sharedPtr->m_test.m));
  475. m_sharedPtr->TestPtr(pi, &m_sharedPtr->m_test.m);
  476. }
  477. EXPECT_EQ(2, m_sharedPtr->m_test.m);
  478. {
  479. AZStd::shared_ptr<void> pv(&m_sharedPtr->m_test.m, SharedPtr::test::deleter2(&m_sharedPtr->m_test.m));
  480. m_sharedPtr->TestPtr(pv, &m_sharedPtr->m_test.m);
  481. }
  482. EXPECT_EQ(3, m_sharedPtr->m_test.m);
  483. {
  484. AZStd::shared_ptr<void const> pv(&m_sharedPtr->m_test.m, SharedPtr::test::deleter2(&m_sharedPtr->m_test.m));
  485. m_sharedPtr->TestPtr(pv, &m_sharedPtr->m_test.m);
  486. }
  487. EXPECT_EQ(4, m_sharedPtr->m_test.m);
  488. }
  489. TEST_F(SmartPtr, SharedPtrCopyCtorEmptyRhs)
  490. {
  491. AZStd::shared_ptr<int> pi;
  492. AZStd::shared_ptr<int> pi2(pi);
  493. EXPECT_EQ(pi2, pi);
  494. EXPECT_FALSE(pi2);
  495. EXPECT_TRUE(!pi2);
  496. EXPECT_EQ(nullptr, pi2.get());
  497. EXPECT_EQ(pi2.use_count(), pi.use_count());
  498. AZStd::shared_ptr<void> pi3(pi);
  499. EXPECT_EQ(pi3, pi);
  500. EXPECT_FALSE(pi3);
  501. EXPECT_TRUE(!pi3);
  502. EXPECT_EQ(nullptr, pi3.get());
  503. EXPECT_EQ(pi3.use_count(), pi.use_count());
  504. AZStd::shared_ptr<void> pi4(pi3);
  505. EXPECT_EQ(pi4, pi3);
  506. EXPECT_FALSE(pi4);
  507. EXPECT_TRUE(!pi4);
  508. EXPECT_EQ(nullptr, pi4.get());
  509. EXPECT_EQ(pi4.use_count(), pi3.use_count());
  510. }
  511. TEST_F(SmartPtr, SharedPtrCopyCtorEmptyVoid)
  512. {
  513. AZStd::shared_ptr<void> pv;
  514. AZStd::shared_ptr<void> pv2(pv);
  515. EXPECT_EQ(pv2, pv);
  516. EXPECT_FALSE(pv2);
  517. EXPECT_TRUE(!pv2);
  518. EXPECT_EQ(nullptr, pv2.get());
  519. EXPECT_EQ(pv2.use_count(), pv.use_count());
  520. }
  521. TEST_F(SmartPtr, SharedPtrCopyCtorVoidFromIncomplete)
  522. {
  523. using incomplete = SharedPtr::incomplete;
  524. AZStd::shared_ptr<incomplete> px;
  525. AZStd::shared_ptr<incomplete> px2(px);
  526. EXPECT_EQ(px, px2);
  527. EXPECT_FALSE(px2);
  528. EXPECT_TRUE(!px2);
  529. EXPECT_EQ(nullptr, px2.get());
  530. EXPECT_EQ(px.use_count(), px2.use_count());
  531. AZStd::shared_ptr<void> px3(px);
  532. EXPECT_EQ(px, px3);
  533. EXPECT_FALSE(px3);
  534. EXPECT_TRUE(!px3);
  535. EXPECT_EQ(nullptr, px3.get());
  536. EXPECT_EQ(px.use_count(), px3.use_count());
  537. }
  538. TEST_F(SmartPtr, SharedPtrCopyCtorIntVoidSharedOwnershipTest)
  539. {
  540. AZStd::shared_ptr<int> pi(static_cast<int*>(nullptr));
  541. AZStd::shared_ptr<int> pi2(pi);
  542. EXPECT_EQ(pi, pi2);
  543. EXPECT_FALSE(pi2);
  544. EXPECT_TRUE(!pi2);
  545. EXPECT_EQ(nullptr, pi2.get());
  546. EXPECT_EQ(2, pi2.use_count());
  547. EXPECT_FALSE(pi2.unique());
  548. EXPECT_EQ(pi.use_count(), pi2.use_count());
  549. EXPECT_TRUE(!(pi < pi2 || pi2 < pi)); // shared ownership test
  550. AZStd::shared_ptr<void> pi3(pi);
  551. EXPECT_EQ(pi, pi3);
  552. EXPECT_FALSE(pi3);
  553. EXPECT_TRUE(!pi3);
  554. EXPECT_EQ(nullptr, pi3.get());
  555. EXPECT_EQ(3, pi3.use_count());
  556. EXPECT_FALSE(pi3.unique());
  557. EXPECT_EQ(pi.use_count(), pi3.use_count());
  558. EXPECT_TRUE(!(pi < pi3 || pi3 < pi)); // shared ownership test
  559. AZStd::shared_ptr<void> pi4(pi2);
  560. EXPECT_EQ(pi2, pi4);
  561. EXPECT_FALSE(pi4);
  562. EXPECT_TRUE(!pi4);
  563. EXPECT_EQ(nullptr, pi4.get());
  564. EXPECT_EQ(4, pi4.use_count());
  565. EXPECT_FALSE(pi4.unique());
  566. EXPECT_EQ(pi2.use_count(), pi4.use_count());
  567. EXPECT_TRUE(!(pi2 < pi4 || pi4 < pi2)); // shared ownership test
  568. EXPECT_EQ(pi4.use_count(), pi3.use_count());
  569. EXPECT_TRUE(!(pi3 < pi4 || pi4 < pi3)); // shared ownership test
  570. }
  571. TEST_F(SmartPtr, SharedPtrCopyCtorClassSharedOwnershipTest)
  572. {
  573. using X = SharedPtr::test::X;
  574. AZStd::shared_ptr<X> px(static_cast<X*>(nullptr));
  575. AZStd::shared_ptr<X> px2(px);
  576. EXPECT_EQ(px, px2);
  577. EXPECT_FALSE(px2);
  578. EXPECT_TRUE(!px2);
  579. EXPECT_EQ(nullptr, px2.get());
  580. EXPECT_EQ(2, px2.use_count());
  581. EXPECT_FALSE(px2.unique());
  582. EXPECT_EQ(px.use_count(), px2.use_count());
  583. EXPECT_TRUE(!(px < px2 || px2 < px)); // shared ownership test
  584. AZStd::shared_ptr<void> px3(px);
  585. EXPECT_EQ(px, px3);
  586. EXPECT_FALSE(px3);
  587. EXPECT_TRUE(!px3);
  588. EXPECT_EQ(nullptr, px3.get());
  589. EXPECT_EQ(3, px3.use_count());
  590. EXPECT_FALSE(px3.unique());
  591. EXPECT_EQ(px.use_count(), px3.use_count());
  592. EXPECT_TRUE(!(px < px3 || px3 < px)); // shared ownership test
  593. AZStd::shared_ptr<void> px4(px2);
  594. EXPECT_EQ(px2, px4);
  595. EXPECT_FALSE(px4);
  596. EXPECT_TRUE(!px4);
  597. EXPECT_EQ(nullptr, px4.get());
  598. EXPECT_EQ(4, px4.use_count());
  599. EXPECT_FALSE(px4.unique());
  600. EXPECT_EQ(px2.use_count(), px4.use_count());
  601. EXPECT_TRUE(!(px2 < px4 || px4 < px2)); // shared ownership test
  602. EXPECT_EQ(px4.use_count(), px3.use_count());
  603. EXPECT_TRUE(!(px3 < px4 || px4 < px3)); // shared ownership test
  604. }
  605. TEST_F(SmartPtr, SharedPtrCopyCtorSharedIntValue)
  606. {
  607. int* p = new int(7);
  608. AZStd::shared_ptr<int> pi(p);
  609. AZStd::shared_ptr<int> pi2(pi);
  610. EXPECT_EQ(pi, pi2);
  611. EXPECT_TRUE(pi2 ? true : false);
  612. EXPECT_TRUE(!!pi2);
  613. EXPECT_EQ(p, pi2.get());
  614. EXPECT_EQ(2, pi2.use_count());
  615. EXPECT_TRUE(!pi2.unique());
  616. EXPECT_EQ(7, *pi2);
  617. EXPECT_EQ(pi.use_count(), pi2.use_count());
  618. EXPECT_TRUE(!(pi < pi2 || pi2 < pi)); // shared ownership test
  619. }
  620. TEST_F(SmartPtr, SharedPtrCopyCtorSharedIntVoidValue)
  621. {
  622. int* p = new int(7);
  623. AZStd::shared_ptr<void> pv(p);
  624. EXPECT_EQ(p, pv.get());
  625. AZStd::shared_ptr<void> pv2(pv);
  626. EXPECT_EQ(pv, pv2);
  627. EXPECT_TRUE(pv2 ? true : false);
  628. EXPECT_TRUE(!!pv2);
  629. EXPECT_EQ(p, pv2.get());
  630. EXPECT_EQ(2, pv2.use_count());
  631. EXPECT_TRUE(!pv2.unique());
  632. EXPECT_EQ(pv.use_count(), pv2.use_count());
  633. EXPECT_TRUE(!(pv < pv2 || pv2 < pv)); // shared ownership test
  634. }
  635. TEST_F(SmartPtr, SharedPtrCopyCtorSharedInstanceCount)
  636. {
  637. using X = SharedPtr::test::X;
  638. EXPECT_EQ(0 ,m_sharedPtr->m_test.m_xInstances);
  639. {
  640. X* p = new X(m_sharedPtr->m_test);
  641. AZStd::shared_ptr<X> px(p);
  642. EXPECT_EQ(p, px.get());
  643. AZStd::shared_ptr<X> px2(px);
  644. EXPECT_EQ(px, px2);
  645. EXPECT_TRUE(px2 ? true : false);
  646. EXPECT_TRUE(!!px2);
  647. EXPECT_EQ(p, px2.get());
  648. EXPECT_EQ(2, px2.use_count());
  649. EXPECT_TRUE(!px2.unique());
  650. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  651. EXPECT_EQ(px.use_count(), px2.use_count());
  652. EXPECT_TRUE(!(px < px2 || px2 < px)); // shared ownership test
  653. AZStd::shared_ptr<void> px3(px);
  654. EXPECT_EQ(px, px3);
  655. EXPECT_TRUE(px3 ? true : false);
  656. EXPECT_TRUE(!!px3);
  657. EXPECT_EQ(p, px3.get());
  658. EXPECT_EQ(3, px3.use_count());
  659. EXPECT_TRUE(!px3.unique());
  660. EXPECT_EQ(px.use_count(), px3.use_count());
  661. EXPECT_TRUE(!(px < px3 || px3 < px)); // shared ownership test
  662. AZStd::shared_ptr<void> px4(px2);
  663. EXPECT_EQ(px2, px4);
  664. EXPECT_TRUE(px4 ? true : false);
  665. EXPECT_TRUE(!!px4);
  666. EXPECT_EQ(p, px4.get());
  667. EXPECT_EQ(4, px4.use_count());
  668. EXPECT_TRUE(!px4.unique());
  669. EXPECT_EQ(px2.use_count(), px4.use_count());
  670. EXPECT_TRUE(!(px2 < px4 || px4 < px2)); // shared ownership test
  671. EXPECT_EQ(px4.use_count(), px3.use_count());
  672. EXPECT_TRUE(!(px3 < px4 || px4 < px3)); // shared ownership test
  673. }
  674. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  675. }
  676. TEST_F(SmartPtr, SharedPtrCopyCtorSharedPolyInstanceCount)
  677. {
  678. using X = SharedPtr::test::X;
  679. using Y = SharedPtr::test::Y;
  680. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  681. EXPECT_EQ(0, m_sharedPtr->m_test.m_yInstances);
  682. {
  683. Y* p = new Y(m_sharedPtr->m_test);
  684. AZStd::shared_ptr<Y> py(p);
  685. EXPECT_EQ(p, py.get());
  686. AZStd::shared_ptr<X> px(py);
  687. EXPECT_EQ(py, px);
  688. EXPECT_TRUE(px);
  689. EXPECT_FALSE(!px);
  690. EXPECT_EQ(p, px.get());
  691. EXPECT_EQ(2, px.use_count());
  692. EXPECT_TRUE(!px.unique());
  693. EXPECT_EQ(py.use_count(), px.use_count());
  694. EXPECT_TRUE(!(px < py || py < px)); // shared ownership test
  695. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  696. EXPECT_EQ(1, m_sharedPtr->m_test.m_yInstances);
  697. AZStd::shared_ptr<void const> pv(px);
  698. EXPECT_EQ(px, pv);
  699. EXPECT_TRUE(pv);
  700. EXPECT_FALSE(!pv);
  701. EXPECT_EQ(px.get(), pv.get());
  702. EXPECT_EQ(3, pv.use_count());
  703. EXPECT_TRUE(!pv.unique());
  704. EXPECT_EQ(px.use_count(), pv.use_count());
  705. EXPECT_TRUE(!(px < pv || pv < px)); // shared ownership test
  706. AZStd::shared_ptr<void const> pv2(py);
  707. EXPECT_EQ(py, pv2);
  708. EXPECT_TRUE(pv2);
  709. EXPECT_FALSE(!pv2);
  710. EXPECT_EQ(py.get(), pv2.get());
  711. EXPECT_EQ(4, pv2.use_count());
  712. EXPECT_TRUE(!pv2.unique());
  713. EXPECT_EQ(py.use_count(), pv2.use_count());
  714. EXPECT_TRUE(!(py < pv2 || pv2 < py)); // shared ownership test
  715. EXPECT_EQ(pv2.use_count(), pv.use_count());
  716. EXPECT_TRUE(!(pv < pv2 || pv2 < pv)); // shared ownership test
  717. }
  718. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  719. EXPECT_EQ(0, m_sharedPtr->m_test.m_yInstances);
  720. }
  721. TEST_F(SmartPtr, SharedPtrWeakPtrCtor)
  722. {
  723. using Y = SharedPtr::test::Y;
  724. AZStd::weak_ptr<Y> wp;
  725. EXPECT_EQ(0, wp.use_count());
  726. }
  727. TEST_F(SmartPtr, SharedPtrWeakPtrCtorSharedOwnership)
  728. {
  729. using X = SharedPtr::test::X;
  730. using Y = SharedPtr::test::Y;
  731. AZStd::shared_ptr<Y> p;
  732. AZStd::weak_ptr<Y> wp(p);
  733. if (wp.use_count() != 0) // 0 allowed but not required
  734. {
  735. AZStd::shared_ptr<Y> p2(wp);
  736. EXPECT_EQ(wp.use_count(), p2.use_count());
  737. EXPECT_EQ(nullptr, p2.get());
  738. AZStd::shared_ptr<X> p3(wp);
  739. EXPECT_EQ(wp.use_count(), p3.use_count());
  740. EXPECT_EQ(nullptr, p3.get());
  741. }
  742. }
  743. TEST_F(SmartPtr, SharedPtrWeakPtrSharedOwnershipReset)
  744. {
  745. using X = SharedPtr::test::X;
  746. using Y = SharedPtr::test::Y;
  747. AZStd::shared_ptr<Y> p(new Y(m_sharedPtr->m_test));
  748. AZStd::weak_ptr<Y> wp(p);
  749. {
  750. AZStd::shared_ptr<Y> p2(wp);
  751. EXPECT_TRUE(p2 ? true : false);
  752. EXPECT_TRUE(!!p2);
  753. EXPECT_EQ(p.get(), p2.get());
  754. EXPECT_EQ(2, p2.use_count());
  755. EXPECT_TRUE(!p2.unique());
  756. EXPECT_EQ(wp.use_count(), p2.use_count());
  757. EXPECT_EQ(p2.use_count(), p.use_count());
  758. EXPECT_TRUE(!(p < p2 || p2 < p)); // shared ownership test
  759. AZStd::shared_ptr<X> p3(wp);
  760. EXPECT_TRUE(p3 ? true : false);
  761. EXPECT_TRUE(!!p3);
  762. EXPECT_EQ(p.get(), p3.get());
  763. EXPECT_EQ(3, p3.use_count());
  764. EXPECT_TRUE(!p3.unique());
  765. EXPECT_EQ(wp.use_count(), p3.use_count());
  766. EXPECT_EQ(p3.use_count(), p.use_count());
  767. }
  768. p.reset();
  769. EXPECT_EQ(0, wp.use_count());
  770. }
  771. TEST_F(SmartPtr, SharedPtrCopyAssignIncomplete)
  772. {
  773. using incomplete = SharedPtr::incomplete;
  774. AZStd::shared_ptr<incomplete> p1;
  775. AZ_PUSH_DISABLE_WARNING(, "-Wself-assign-overloaded")
  776. p1 = p1;
  777. AZ_POP_DISABLE_WARNING
  778. EXPECT_EQ(p1, p1);
  779. EXPECT_FALSE(p1);
  780. EXPECT_TRUE(!p1);
  781. EXPECT_EQ(nullptr, p1.get());
  782. AZStd::shared_ptr<incomplete> p2;
  783. p1 = p2;
  784. EXPECT_EQ(p2, p1);
  785. EXPECT_FALSE(p1);
  786. EXPECT_TRUE(!p1);
  787. EXPECT_EQ(nullptr, p1.get());
  788. AZStd::shared_ptr<incomplete> p3(p1);
  789. p1 = p3;
  790. EXPECT_EQ(p3, p1);
  791. EXPECT_FALSE(p1);
  792. EXPECT_TRUE(!p1);
  793. EXPECT_EQ(nullptr, p1.get());
  794. }
  795. TEST_F(SmartPtr, SharedPtrCopyAssignVoid)
  796. {
  797. AZStd::shared_ptr<void> p1;
  798. AZ_PUSH_DISABLE_WARNING(, "-Wself-assign-overloaded")
  799. p1 = p1;
  800. AZ_POP_DISABLE_WARNING
  801. EXPECT_EQ(p1, p1);
  802. EXPECT_FALSE(p1);
  803. EXPECT_TRUE(!p1);
  804. EXPECT_EQ(nullptr, p1.get());
  805. AZStd::shared_ptr<void> p2;
  806. p1 = p2;
  807. EXPECT_EQ(p2, p1);
  808. EXPECT_FALSE(p1);
  809. EXPECT_TRUE(!p1);
  810. EXPECT_EQ(nullptr, p1.get());
  811. AZStd::shared_ptr<void> p3(p1);
  812. p1 = p3;
  813. EXPECT_EQ(p3, p1);
  814. EXPECT_FALSE(p1);
  815. EXPECT_TRUE(!p1);
  816. EXPECT_EQ(nullptr, p1.get());
  817. AZStd::shared_ptr<void> p4(new int);
  818. EXPECT_EQ(1, p4.use_count());
  819. p1 = p4;
  820. EXPECT_EQ(p4, p1);
  821. EXPECT_TRUE(!(p1 < p4 || p4 < p1));
  822. EXPECT_EQ(2, p1.use_count());
  823. EXPECT_EQ(2, p4.use_count());
  824. p1 = p3;
  825. EXPECT_EQ(p3, p1);
  826. EXPECT_EQ(1, p4.use_count());
  827. }
  828. TEST_F(SmartPtr, SharedPtrCopyAssignClass)
  829. {
  830. using X = SharedPtr::test::X;
  831. AZStd::shared_ptr<X> p1;
  832. AZ_PUSH_DISABLE_WARNING(, "-Wself-assign-overloaded")
  833. p1 = p1;
  834. AZ_POP_DISABLE_WARNING
  835. EXPECT_EQ(p1, p1);
  836. EXPECT_FALSE(p1);
  837. EXPECT_TRUE(!p1);
  838. EXPECT_EQ(nullptr, p1.get());
  839. AZStd::shared_ptr<X> p2;
  840. p1 = p2;
  841. EXPECT_EQ(p2, p1);
  842. EXPECT_FALSE(p1);
  843. EXPECT_TRUE(!p1);
  844. EXPECT_EQ(nullptr, p1.get());
  845. AZStd::shared_ptr<X> p3(p1);
  846. p1 = p3;
  847. EXPECT_EQ(p3, p1);
  848. EXPECT_FALSE(p1);
  849. EXPECT_TRUE(!p1);
  850. EXPECT_EQ(nullptr, p1.get());
  851. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  852. AZStd::shared_ptr<X> p4(new X(m_sharedPtr->m_test));
  853. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  854. p1 = p4;
  855. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  856. EXPECT_EQ(p4, p1);
  857. EXPECT_TRUE(!(p1 < p4 || p4 < p1));
  858. EXPECT_EQ(2, p1.use_count());
  859. p1 = p2;
  860. EXPECT_EQ(p2, p1);
  861. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  862. p4 = p3;
  863. EXPECT_EQ(p3, p4);
  864. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  865. }
  866. TEST_F(SmartPtr, SharedPtrConvertAssignIntVoidIncomplete)
  867. {
  868. using incomplete = SharedPtr::incomplete;
  869. AZStd::shared_ptr<void> p1;
  870. AZStd::shared_ptr<incomplete> p2;
  871. p1 = p2;
  872. EXPECT_EQ(p2, p1);
  873. EXPECT_FALSE(p1);
  874. EXPECT_TRUE(!p1);
  875. EXPECT_EQ(nullptr, p1.get());
  876. AZStd::shared_ptr<int> p4(new int);
  877. EXPECT_EQ(1, p4.use_count());
  878. AZStd::shared_ptr<void> p5(p4);
  879. EXPECT_EQ(2, p4.use_count());
  880. p1 = p4;
  881. EXPECT_EQ(p4, p1);
  882. EXPECT_TRUE(!(p1 < p5 || p5 < p1));
  883. EXPECT_EQ(3, p1.use_count());
  884. EXPECT_EQ(3, p4.use_count());
  885. p1 = p2;
  886. EXPECT_EQ(p2, p1);
  887. EXPECT_EQ(2, p4.use_count());
  888. }
  889. TEST_F(SmartPtr, SharedPtrConvertAssignPolymorphic)
  890. {
  891. using X = SharedPtr::test::X;
  892. using Y = SharedPtr::test::Y;
  893. AZStd::shared_ptr<X> p1;
  894. AZStd::shared_ptr<Y> p2;
  895. p1 = p2;
  896. EXPECT_EQ(p2, p1);
  897. EXPECT_FALSE(p1);
  898. EXPECT_TRUE(!p1);
  899. EXPECT_EQ(nullptr, p1.get());
  900. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  901. EXPECT_EQ(0, m_sharedPtr->m_test.m_yInstances);
  902. AZStd::shared_ptr<Y> p4(new Y(m_sharedPtr->m_test));
  903. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  904. EXPECT_EQ(m_sharedPtr->m_test.m_yInstances, 1);
  905. EXPECT_TRUE(p4.use_count() == 1);
  906. AZStd::shared_ptr<X> p5(p4);
  907. EXPECT_TRUE(p4.use_count() == 2);
  908. p1 = p4;
  909. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  910. EXPECT_EQ(1, m_sharedPtr->m_test.m_yInstances);
  911. EXPECT_TRUE(p1 == p4);
  912. EXPECT_TRUE(!(p1 < p5 || p5 < p1));
  913. EXPECT_TRUE(p1.use_count() == 3);
  914. EXPECT_TRUE(p4.use_count() == 3);
  915. p1 = p2;
  916. EXPECT_TRUE(p1 == p2);
  917. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  918. EXPECT_EQ(1, m_sharedPtr->m_test.m_yInstances);
  919. EXPECT_TRUE(p4.use_count() == 2);
  920. p4 = p2;
  921. p5 = p2;
  922. EXPECT_TRUE(p4 == p2);
  923. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  924. EXPECT_EQ(0, m_sharedPtr->m_test.m_yInstances);
  925. }
  926. TEST_F(SmartPtr, SharedPtrResetEmptyInt)
  927. {
  928. AZStd::shared_ptr<int> pi;
  929. pi.reset();
  930. EXPECT_FALSE(pi);
  931. EXPECT_TRUE(!pi);
  932. EXPECT_TRUE(pi.get() == nullptr);
  933. EXPECT_TRUE(pi.use_count() == 0);
  934. }
  935. TEST_F(SmartPtr, SharedPtrResetNullInt)
  936. {
  937. AZStd::shared_ptr<int> pi(static_cast<int*>(nullptr));
  938. pi.reset();
  939. EXPECT_FALSE(pi);
  940. EXPECT_TRUE(!pi);
  941. EXPECT_TRUE(pi.get() == nullptr);
  942. EXPECT_TRUE(pi.use_count() == 0);
  943. }
  944. TEST_F(SmartPtr, SharedPtrResetNewInt)
  945. {
  946. AZStd::shared_ptr<int> pi(new int);
  947. pi.reset();
  948. EXPECT_FALSE(pi);
  949. EXPECT_TRUE(!pi);
  950. EXPECT_TRUE(pi.get() == nullptr);
  951. EXPECT_TRUE(pi.use_count() == 0);
  952. }
  953. TEST_F(SmartPtr, SharedPtrResetIncomplete)
  954. {
  955. using incomplete = SharedPtr::incomplete;
  956. AZStd::shared_ptr<incomplete> px;
  957. px.reset();
  958. EXPECT_FALSE(px);
  959. EXPECT_TRUE(!px);
  960. EXPECT_TRUE(px.get() == nullptr);
  961. EXPECT_TRUE(px.use_count() == 0);
  962. }
  963. TEST_F(SmartPtr, SharedPtrResetIncompleteWithDeleter)
  964. {
  965. using incomplete = SharedPtr::incomplete;
  966. incomplete* p0 = nullptr;
  967. AZStd::shared_ptr<incomplete> px(p0, SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted));
  968. px.reset();
  969. EXPECT_FALSE(px);
  970. EXPECT_TRUE(!px);
  971. EXPECT_TRUE(px.get() == nullptr);
  972. EXPECT_TRUE(px.use_count() == 0);
  973. }
  974. TEST_F(SmartPtr, SharedPtrResetEmptyClass)
  975. {
  976. using X = SharedPtr::test::X;
  977. AZStd::shared_ptr<X> px;
  978. px.reset();
  979. EXPECT_FALSE(px);
  980. EXPECT_TRUE(!px);
  981. EXPECT_TRUE(px.get() == nullptr);
  982. EXPECT_TRUE(px.use_count() == 0);
  983. }
  984. TEST_F(SmartPtr, SharedPtrResetNewClass)
  985. {
  986. using X = SharedPtr::test::X;
  987. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  988. AZStd::shared_ptr<X> px(new X(m_sharedPtr->m_test));
  989. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  990. px.reset();
  991. EXPECT_FALSE(px);
  992. EXPECT_TRUE(!px);
  993. EXPECT_TRUE(px.get() == nullptr);
  994. EXPECT_TRUE(px.use_count() == 0);
  995. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  996. }
  997. TEST_F(SmartPtr, SharedPtrResetEmptyVoid)
  998. {
  999. AZStd::shared_ptr<void> pv;
  1000. pv.reset();
  1001. EXPECT_FALSE(pv);
  1002. EXPECT_TRUE(!pv);
  1003. EXPECT_TRUE(pv.get() == nullptr);
  1004. EXPECT_TRUE(pv.use_count() == 0);
  1005. }
  1006. TEST_F(SmartPtr, SharedPtrResetNewVoid)
  1007. {
  1008. using X = SharedPtr::test::X;
  1009. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  1010. AZStd::shared_ptr<void> pv(new X(m_sharedPtr->m_test));
  1011. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  1012. pv.reset();
  1013. EXPECT_FALSE(pv);
  1014. EXPECT_TRUE(!pv);
  1015. EXPECT_TRUE(pv.get() == nullptr);
  1016. EXPECT_TRUE(pv.use_count() == 0);
  1017. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  1018. }
  1019. TEST_F(SmartPtr, SharedPtrResetEmptyToNewInt)
  1020. {
  1021. AZStd::shared_ptr<int> pi;
  1022. pi.reset(static_cast<int*>(nullptr));
  1023. EXPECT_FALSE(pi);
  1024. EXPECT_TRUE(!pi);
  1025. EXPECT_TRUE(pi.get() == nullptr);
  1026. EXPECT_TRUE(pi.use_count() == 1);
  1027. EXPECT_TRUE(pi.unique());
  1028. int* p = new int;
  1029. pi.reset(p);
  1030. EXPECT_TRUE(pi ? true : false);
  1031. EXPECT_TRUE(!!pi);
  1032. EXPECT_TRUE(pi.get() == p);
  1033. EXPECT_TRUE(pi.use_count() == 1);
  1034. EXPECT_TRUE(pi.unique());
  1035. pi.reset(static_cast<int*>(nullptr));
  1036. EXPECT_FALSE(pi);
  1037. EXPECT_TRUE(!pi);
  1038. EXPECT_TRUE(pi.get() == nullptr);
  1039. EXPECT_TRUE(pi.use_count() == 1);
  1040. EXPECT_TRUE(pi.unique());
  1041. }
  1042. TEST_F(SmartPtr, SharedPtrResetEmptyClassToNewClass)
  1043. {
  1044. using X = SharedPtr::test::X;
  1045. using Y = SharedPtr::test::Y;
  1046. AZStd::shared_ptr<X> px;
  1047. px.reset(static_cast<X*>(nullptr));
  1048. EXPECT_FALSE(px);
  1049. EXPECT_TRUE(!px);
  1050. EXPECT_TRUE(px.get() == nullptr);
  1051. EXPECT_TRUE(px.use_count() == 1);
  1052. EXPECT_TRUE(px.unique());
  1053. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  1054. X* p = new X(m_sharedPtr->m_test);
  1055. px.reset(p);
  1056. EXPECT_TRUE(px ? true : false);
  1057. EXPECT_TRUE(!!px);
  1058. EXPECT_TRUE(px.get() == p);
  1059. EXPECT_TRUE(px.use_count() == 1);
  1060. EXPECT_TRUE(px.unique());
  1061. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  1062. px.reset(static_cast<X*>(nullptr));
  1063. EXPECT_FALSE(px);
  1064. EXPECT_TRUE(!px);
  1065. EXPECT_TRUE(px.get() == nullptr);
  1066. EXPECT_TRUE(px.use_count() == 1);
  1067. EXPECT_TRUE(px.unique());
  1068. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  1069. EXPECT_EQ(0, m_sharedPtr->m_test.m_yInstances);
  1070. Y* q = new Y(m_sharedPtr->m_test);
  1071. px.reset(q);
  1072. EXPECT_TRUE(px ? true : false);
  1073. EXPECT_TRUE(!!px);
  1074. EXPECT_TRUE(px.get() == q);
  1075. EXPECT_TRUE(px.use_count() == 1);
  1076. EXPECT_TRUE(px.unique());
  1077. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  1078. EXPECT_EQ(1, m_sharedPtr->m_test.m_yInstances);
  1079. px.reset(static_cast<Y*>(nullptr));
  1080. EXPECT_FALSE(px);
  1081. EXPECT_TRUE(!px);
  1082. EXPECT_TRUE(px.get() == nullptr);
  1083. EXPECT_TRUE(px.use_count() == 1);
  1084. EXPECT_TRUE(px.unique());
  1085. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  1086. EXPECT_EQ(0, m_sharedPtr->m_test.m_yInstances);
  1087. }
  1088. TEST_F(SmartPtr, SharedPtrResetEmptyVoidToNewClass)
  1089. {
  1090. using X = SharedPtr::test::X;
  1091. using Y = SharedPtr::test::Y;
  1092. AZStd::shared_ptr<void> pv;
  1093. pv.reset(static_cast<X*>(nullptr));
  1094. EXPECT_FALSE(pv);
  1095. EXPECT_TRUE(!pv);
  1096. EXPECT_TRUE(pv.get() == nullptr);
  1097. EXPECT_TRUE(pv.use_count() == 1);
  1098. EXPECT_TRUE(pv.unique());
  1099. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  1100. X* p = new X(m_sharedPtr->m_test);
  1101. pv.reset(p);
  1102. EXPECT_TRUE(pv ? true : false);
  1103. EXPECT_TRUE(!!pv);
  1104. EXPECT_TRUE(pv.get() == p);
  1105. EXPECT_TRUE(pv.use_count() == 1);
  1106. EXPECT_TRUE(pv.unique());
  1107. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  1108. pv.reset(static_cast<X*>(nullptr));
  1109. EXPECT_FALSE(pv);
  1110. EXPECT_TRUE(!pv);
  1111. EXPECT_TRUE(pv.get() == nullptr);
  1112. EXPECT_TRUE(pv.use_count() == 1);
  1113. EXPECT_TRUE(pv.unique());
  1114. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  1115. EXPECT_EQ(0, m_sharedPtr->m_test.m_yInstances);
  1116. Y* q = new Y(m_sharedPtr->m_test);
  1117. pv.reset(q);
  1118. EXPECT_TRUE(pv ? true : false);
  1119. EXPECT_TRUE(!!pv);
  1120. EXPECT_TRUE(pv.get() == q);
  1121. EXPECT_TRUE(pv.use_count() == 1);
  1122. EXPECT_TRUE(pv.unique());
  1123. EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances);
  1124. EXPECT_EQ(1, m_sharedPtr->m_test.m_yInstances);
  1125. pv.reset(static_cast<Y*>(nullptr));
  1126. EXPECT_FALSE(pv);
  1127. EXPECT_TRUE(!pv);
  1128. EXPECT_TRUE(pv.get() == nullptr);
  1129. EXPECT_TRUE(pv.use_count() == 1);
  1130. EXPECT_TRUE(pv.unique());
  1131. EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances);
  1132. EXPECT_EQ(0, m_sharedPtr->m_test.m_yInstances);
  1133. }
  1134. TEST_F(SmartPtr, SharedPtrResetIntWithDeleter)
  1135. {
  1136. AZStd::shared_ptr<int> pi;
  1137. pi.reset(static_cast<int*>(nullptr), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted));
  1138. EXPECT_FALSE(pi);
  1139. EXPECT_TRUE(!pi);
  1140. EXPECT_TRUE(pi.get() == nullptr);
  1141. EXPECT_TRUE(pi.use_count() == 1);
  1142. EXPECT_TRUE(pi.unique());
  1143. m_sharedPtr->m_test.deleted = &pi;
  1144. int m = 0;
  1145. pi.reset(&m, SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted));
  1146. EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr);
  1147. EXPECT_TRUE(pi ? true : false);
  1148. EXPECT_TRUE(!!pi);
  1149. EXPECT_TRUE(pi.get() == &m);
  1150. EXPECT_TRUE(pi.use_count() == 1);
  1151. EXPECT_TRUE(pi.unique());
  1152. pi.reset(static_cast<int*>(nullptr), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted));
  1153. EXPECT_TRUE(m_sharedPtr->m_test.deleted == &m);
  1154. EXPECT_FALSE(pi);
  1155. EXPECT_TRUE(!pi);
  1156. EXPECT_TRUE(pi.get() == nullptr);
  1157. EXPECT_TRUE(pi.use_count() == 1);
  1158. EXPECT_TRUE(pi.unique());
  1159. pi.reset();
  1160. EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr);
  1161. }
  1162. TEST_F(SmartPtr, SharedPtrResetClassWithDeleter)
  1163. {
  1164. using X = SharedPtr::test::X;
  1165. using Y = SharedPtr::test::Y;
  1166. AZStd::shared_ptr<X> px;
  1167. px.reset(static_cast<X*>(nullptr), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted));
  1168. EXPECT_FALSE(px);
  1169. EXPECT_TRUE(!px);
  1170. EXPECT_TRUE(px.get() == nullptr);
  1171. EXPECT_TRUE(px.use_count() == 1);
  1172. EXPECT_TRUE(px.unique());
  1173. m_sharedPtr->m_test.deleted = &px;
  1174. X x(m_sharedPtr->m_test);
  1175. px.reset(&x, SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted));
  1176. EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr);
  1177. EXPECT_TRUE(px ? true : false);
  1178. EXPECT_TRUE(!!px);
  1179. EXPECT_TRUE(px.get() == &x);
  1180. EXPECT_TRUE(px.use_count() == 1);
  1181. EXPECT_TRUE(px.unique());
  1182. px.reset(static_cast<X*>(nullptr), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted));
  1183. EXPECT_TRUE(m_sharedPtr->m_test.deleted == &x);
  1184. EXPECT_FALSE(px);
  1185. EXPECT_TRUE(!px);
  1186. EXPECT_TRUE(px.get() == nullptr);
  1187. EXPECT_TRUE(px.use_count() == 1);
  1188. EXPECT_TRUE(px.unique());
  1189. Y y(m_sharedPtr->m_test);
  1190. px.reset(&y, SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted));
  1191. EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr);
  1192. EXPECT_TRUE(px ? true : false);
  1193. EXPECT_TRUE(!!px);
  1194. EXPECT_TRUE(px.get() == &y);
  1195. EXPECT_TRUE(px.use_count() == 1);
  1196. EXPECT_TRUE(px.unique());
  1197. px.reset(static_cast<Y*>(nullptr), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted));
  1198. EXPECT_TRUE(m_sharedPtr->m_test.deleted == &y);
  1199. EXPECT_FALSE(px);
  1200. EXPECT_TRUE(!px);
  1201. EXPECT_TRUE(px.get() == nullptr);
  1202. EXPECT_TRUE(px.use_count() == 1);
  1203. EXPECT_TRUE(px.unique());
  1204. px.reset();
  1205. EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr);
  1206. }
  1207. TEST_F(SmartPtr, SharedPtrResetVoidClassWithDeleter)
  1208. {
  1209. using X = SharedPtr::test::X;
  1210. using Y = SharedPtr::test::Y;
  1211. AZStd::shared_ptr<void> pv;
  1212. pv.reset(static_cast<X*>(nullptr), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted));
  1213. EXPECT_FALSE(pv);
  1214. EXPECT_TRUE(!pv);
  1215. EXPECT_TRUE(pv.get() == nullptr);
  1216. EXPECT_TRUE(pv.use_count() == 1);
  1217. EXPECT_TRUE(pv.unique());
  1218. m_sharedPtr->m_test.deleted = &pv;
  1219. X x(m_sharedPtr->m_test);
  1220. pv.reset(&x, SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted));
  1221. EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr);
  1222. EXPECT_TRUE(pv ? true : false);
  1223. EXPECT_TRUE(!!pv);
  1224. EXPECT_TRUE(pv.get() == &x);
  1225. EXPECT_TRUE(pv.use_count() == 1);
  1226. EXPECT_TRUE(pv.unique());
  1227. pv.reset(static_cast<X*>(nullptr), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted));
  1228. EXPECT_TRUE(m_sharedPtr->m_test.deleted == &x);
  1229. EXPECT_FALSE(pv);
  1230. EXPECT_TRUE(!pv);
  1231. EXPECT_TRUE(pv.get() == nullptr);
  1232. EXPECT_TRUE(pv.use_count() == 1);
  1233. EXPECT_TRUE(pv.unique());
  1234. Y y(m_sharedPtr->m_test);
  1235. pv.reset(&y, SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted));
  1236. EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr);
  1237. EXPECT_TRUE(pv ? true : false);
  1238. EXPECT_TRUE(!!pv);
  1239. EXPECT_TRUE(pv.get() == &y);
  1240. EXPECT_TRUE(pv.use_count() == 1);
  1241. EXPECT_TRUE(pv.unique());
  1242. pv.reset(static_cast<Y*>(nullptr), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted));
  1243. EXPECT_TRUE(m_sharedPtr->m_test.deleted == &y);
  1244. EXPECT_FALSE(pv);
  1245. EXPECT_TRUE(!pv);
  1246. EXPECT_TRUE(pv.get() == nullptr);
  1247. EXPECT_TRUE(pv.use_count() == 1);
  1248. EXPECT_TRUE(pv.unique());
  1249. pv.reset();
  1250. EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr);
  1251. }
  1252. TEST_F(SmartPtr, SharedPtrResetIncompleteNullWithDeleter)
  1253. {
  1254. using incomplete = SharedPtr::incomplete;
  1255. AZStd::shared_ptr<incomplete> px;
  1256. incomplete* p0 = nullptr;
  1257. px.reset(p0, SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted));
  1258. EXPECT_FALSE(px);
  1259. EXPECT_TRUE(!px);
  1260. EXPECT_TRUE(px.get() == nullptr);
  1261. EXPECT_TRUE(px.use_count() == 1);
  1262. EXPECT_TRUE(px.unique());
  1263. m_sharedPtr->m_test.deleted = &px;
  1264. px.reset(p0, SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted));
  1265. EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr);
  1266. }
  1267. TEST_F(SmartPtr, SharedPtrGetPointerEmpty)
  1268. {
  1269. struct X {};
  1270. AZStd::shared_ptr<X> px;
  1271. EXPECT_TRUE(px.get() == nullptr);
  1272. EXPECT_FALSE(px);
  1273. EXPECT_TRUE(!px);
  1274. EXPECT_TRUE(get_pointer(px) == px.get());
  1275. }
  1276. TEST_F(SmartPtr, SharedPtrGetPointerNull)
  1277. {
  1278. struct X {};
  1279. AZStd::shared_ptr<X> px(static_cast<X*>(nullptr));
  1280. EXPECT_TRUE(px.get() == nullptr);
  1281. EXPECT_FALSE(px);
  1282. EXPECT_TRUE(!px);
  1283. EXPECT_TRUE(get_pointer(px) == px.get());
  1284. }
  1285. TEST_F(SmartPtr, SharedPtrGetPointerCheckedDeleterNull)
  1286. {
  1287. struct X {};
  1288. AZStd::shared_ptr<X> px(static_cast<X*>(nullptr), AZStd::checked_deleter<X>());
  1289. EXPECT_TRUE(px.get() == nullptr);
  1290. EXPECT_FALSE(px);
  1291. EXPECT_TRUE(!px);
  1292. EXPECT_TRUE(get_pointer(px) == px.get());
  1293. }
  1294. TEST_F(SmartPtr, SharedPtrGetPointerNewClass)
  1295. {
  1296. struct X {};
  1297. X* p = new X;
  1298. AZStd::shared_ptr<X> px(p);
  1299. EXPECT_TRUE(px.get() == p);
  1300. EXPECT_TRUE(px ? true : false);
  1301. EXPECT_TRUE(!!px);
  1302. EXPECT_TRUE(&*px == px.get());
  1303. EXPECT_TRUE(px.operator ->() == px.get());
  1304. EXPECT_TRUE(get_pointer(px) == px.get());
  1305. }
  1306. TEST_F(SmartPtr, SharedPtrGetPointerCheckedDeleterNewClass)
  1307. {
  1308. struct X {};
  1309. X* p = new X;
  1310. AZStd::shared_ptr<X> px(p, AZStd::checked_deleter<X>());
  1311. EXPECT_TRUE(px.get() == p);
  1312. EXPECT_TRUE(px ? true : false);
  1313. EXPECT_TRUE(!!px);
  1314. EXPECT_TRUE(&*px == px.get());
  1315. EXPECT_TRUE(px.operator ->() == px.get());
  1316. EXPECT_TRUE(get_pointer(px) == px.get());
  1317. }
  1318. TEST_F(SmartPtr, SharedPtrUseCountNullClass)
  1319. {
  1320. struct X {};
  1321. AZStd::shared_ptr<X> px(static_cast<X*>(nullptr));
  1322. EXPECT_TRUE(px.use_count() == 1);
  1323. EXPECT_TRUE(px.unique());
  1324. AZStd::shared_ptr<X> px2(px);
  1325. EXPECT_TRUE(px2.use_count() == 2);
  1326. EXPECT_TRUE(!px2.unique());
  1327. EXPECT_TRUE(px.use_count() == 2);
  1328. EXPECT_TRUE(!px.unique());
  1329. }
  1330. TEST_F(SmartPtr, SharedPtrUseCountNewClass)
  1331. {
  1332. struct X {};
  1333. AZStd::shared_ptr<X> px(new X);
  1334. EXPECT_TRUE(px.use_count() == 1);
  1335. EXPECT_TRUE(px.unique());
  1336. AZStd::shared_ptr<X> px2(px);
  1337. EXPECT_TRUE(px2.use_count() == 2);
  1338. EXPECT_TRUE(!px2.unique());
  1339. EXPECT_TRUE(px.use_count() == 2);
  1340. EXPECT_TRUE(!px.unique());
  1341. }
  1342. TEST_F(SmartPtr, SharedPtrUseCountCheckedDeleterNewClass)
  1343. {
  1344. struct X {};
  1345. AZStd::shared_ptr<X> px(new X, AZStd::checked_deleter<X>());
  1346. EXPECT_TRUE(px.use_count() == 1);
  1347. EXPECT_TRUE(px.unique());
  1348. AZStd::shared_ptr<X> px2(px);
  1349. EXPECT_TRUE(px2.use_count() == 2);
  1350. EXPECT_TRUE(!px2.unique());
  1351. EXPECT_TRUE(px.use_count() == 2);
  1352. EXPECT_TRUE(!px.unique());
  1353. }
  1354. TEST_F(SmartPtr, SharedPtrSwapEmptyClass)
  1355. {
  1356. struct X {};
  1357. AZStd::shared_ptr<X> px;
  1358. AZStd::shared_ptr<X> px2;
  1359. px.swap(px2);
  1360. EXPECT_TRUE(px.get() == nullptr);
  1361. EXPECT_TRUE(px2.get() == nullptr);
  1362. using std::swap;
  1363. swap(px, px2);
  1364. EXPECT_TRUE(px.get() == nullptr);
  1365. EXPECT_TRUE(px2.get() == nullptr);
  1366. }
  1367. TEST_F(SmartPtr, SharedPtrSwapNewClass)
  1368. {
  1369. struct X {};
  1370. X* p = new X;
  1371. AZStd::shared_ptr<X> px;
  1372. AZStd::shared_ptr<X> px2(p);
  1373. AZStd::shared_ptr<X> px3(px2);
  1374. px.swap(px2);
  1375. EXPECT_TRUE(px.get() == p);
  1376. EXPECT_TRUE(px.use_count() == 2);
  1377. EXPECT_TRUE(px2.get() == nullptr);
  1378. EXPECT_TRUE(px3.get() == p);
  1379. EXPECT_TRUE(px3.use_count() == 2);
  1380. using std::swap;
  1381. swap(px, px2);
  1382. EXPECT_TRUE(px.get() == nullptr);
  1383. EXPECT_TRUE(px2.get() == p);
  1384. EXPECT_TRUE(px2.use_count() == 2);
  1385. EXPECT_TRUE(px3.get() == p);
  1386. EXPECT_TRUE(px3.use_count() == 2);
  1387. }
  1388. TEST_F(SmartPtr, SharedPtrSwap2NewClasses)
  1389. {
  1390. struct X {};
  1391. X* p1 = new X;
  1392. X* p2 = new X;
  1393. AZStd::shared_ptr<X> px(p1);
  1394. AZStd::shared_ptr<X> px2(p2);
  1395. AZStd::shared_ptr<X> px3(px2);
  1396. px.swap(px2);
  1397. EXPECT_TRUE(px.get() == p2);
  1398. EXPECT_TRUE(px.use_count() == 2);
  1399. EXPECT_TRUE(px2.get() == p1);
  1400. EXPECT_TRUE(px2.use_count() == 1);
  1401. EXPECT_TRUE(px3.get() == p2);
  1402. EXPECT_TRUE(px3.use_count() == 2);
  1403. using std::swap;
  1404. swap(px, px2);
  1405. EXPECT_TRUE(px.get() == p1);
  1406. EXPECT_TRUE(px.use_count() == 1);
  1407. EXPECT_TRUE(px2.get() == p2);
  1408. EXPECT_TRUE(px2.use_count() == 2);
  1409. EXPECT_TRUE(px3.get() == p2);
  1410. EXPECT_TRUE(px3.use_count() == 2);
  1411. }
  1412. TEST_F(SmartPtr, SharedPtrCompareEmptyClass)
  1413. {
  1414. using A = SharedPtr::test::A;
  1415. AZStd::shared_ptr<A> px;
  1416. EXPECT_TRUE(px == px);
  1417. EXPECT_TRUE(!(px != px));
  1418. EXPECT_TRUE(!(px < px));
  1419. AZStd::shared_ptr<A> px2;
  1420. EXPECT_TRUE(px.get() == px2.get());
  1421. EXPECT_TRUE(px == px2);
  1422. EXPECT_TRUE(!(px != px2));
  1423. EXPECT_TRUE(!(px < px2 && px2 < px));
  1424. }
  1425. TEST_F(SmartPtr, SharedPtrCompareCopyOfEmptyClass)
  1426. {
  1427. using A = SharedPtr::test::A;
  1428. AZStd::shared_ptr<A> px;
  1429. AZStd::shared_ptr<A> px2(px);
  1430. EXPECT_TRUE(px2 == px2);
  1431. EXPECT_TRUE(!(px2 != px2));
  1432. EXPECT_TRUE(!(px2 < px2));
  1433. EXPECT_TRUE(px.get() == px2.get());
  1434. EXPECT_TRUE(px == px2);
  1435. EXPECT_TRUE(!(px != px2));
  1436. EXPECT_TRUE(!(px < px2 && px2 < px));
  1437. }
  1438. TEST_F(SmartPtr, SharedPtrCompareNewClass)
  1439. {
  1440. using A = SharedPtr::test::A;
  1441. AZStd::shared_ptr<A> px;
  1442. AZStd::shared_ptr<A> px2(new A);
  1443. EXPECT_TRUE(px2 == px2);
  1444. EXPECT_TRUE(!(px2 != px2));
  1445. EXPECT_TRUE(!(px2 < px2));
  1446. EXPECT_TRUE(px.get() != px2.get());
  1447. EXPECT_TRUE(px != px2);
  1448. EXPECT_TRUE(!(px == px2));
  1449. EXPECT_TRUE(px < px2 || px2 < px);
  1450. EXPECT_TRUE(!(px < px2 && px2 < px));
  1451. }
  1452. TEST_F(SmartPtr, SharedPtrCompareNewClasses)
  1453. {
  1454. using A = SharedPtr::test::A;
  1455. AZStd::shared_ptr<A> px(new A);
  1456. AZStd::shared_ptr<A> px2(new A);
  1457. EXPECT_TRUE(px.get() != px2.get());
  1458. EXPECT_TRUE(px != px2);
  1459. EXPECT_TRUE(!(px == px2));
  1460. EXPECT_TRUE(px < px2 || px2 < px);
  1461. EXPECT_TRUE(!(px < px2 && px2 < px));
  1462. }
  1463. TEST_F(SmartPtr, SharedPtrCompareCopiedNewClass)
  1464. {
  1465. using A = SharedPtr::test::A;
  1466. AZStd::shared_ptr<A> px(new A);
  1467. AZStd::shared_ptr<A> px2(px);
  1468. EXPECT_TRUE(px2 == px2);
  1469. EXPECT_TRUE(!(px2 != px2));
  1470. EXPECT_TRUE(!(px2 < px2));
  1471. EXPECT_TRUE(px.get() == px2.get());
  1472. EXPECT_TRUE(px == px2);
  1473. EXPECT_TRUE(!(px != px2));
  1474. EXPECT_TRUE(!(px < px2 || px2 < px));
  1475. }
  1476. TEST_F(SmartPtr, SharedPtrComparePolymorphicClasses)
  1477. {
  1478. using A = SharedPtr::test::A;
  1479. using B = SharedPtr::test::B;
  1480. using C = SharedPtr::test::C;
  1481. AZStd::shared_ptr<A> px(new A);
  1482. AZStd::shared_ptr<B> py(new B);
  1483. AZStd::shared_ptr<C> pz(new C);
  1484. EXPECT_NE(px.get(), pz.get());
  1485. EXPECT_TRUE(px != pz);
  1486. EXPECT_TRUE(!(px == pz));
  1487. EXPECT_TRUE(py.get() != pz.get());
  1488. EXPECT_TRUE(py != pz);
  1489. EXPECT_TRUE(!(py == pz));
  1490. EXPECT_TRUE(px < py || py < px);
  1491. EXPECT_TRUE(px < pz || pz < px);
  1492. EXPECT_TRUE(py < pz || pz < py);
  1493. EXPECT_TRUE(!(px < py && py < px));
  1494. EXPECT_TRUE(!(px < pz && pz < px));
  1495. EXPECT_TRUE(!(py < pz && pz < py));
  1496. AZStd::shared_ptr<void> pvx(px);
  1497. EXPECT_TRUE(pvx == pvx);
  1498. EXPECT_TRUE(!(pvx != pvx));
  1499. EXPECT_TRUE(!(pvx < pvx));
  1500. AZStd::shared_ptr<void> pvy(py);
  1501. AZStd::shared_ptr<void> pvz(pz);
  1502. EXPECT_TRUE(pvx < pvy || pvy < pvx);
  1503. EXPECT_TRUE(pvx < pvz || pvz < pvx);
  1504. EXPECT_TRUE(pvy < pvz || pvz < pvy);
  1505. EXPECT_TRUE(!(pvx < pvy && pvy < pvx));
  1506. EXPECT_TRUE(!(pvx < pvz && pvz < pvx));
  1507. EXPECT_TRUE(!(pvy < pvz && pvz < pvy));
  1508. }
  1509. TEST_F(SmartPtr, SharedPtrComparePolymorphicWithEmpty)
  1510. {
  1511. using A = SharedPtr::test::A;
  1512. using B = SharedPtr::test::B;
  1513. using C = SharedPtr::test::C;
  1514. AZStd::shared_ptr<C> pz(new C);
  1515. AZStd::shared_ptr<A> px(pz);
  1516. EXPECT_TRUE(px == px);
  1517. EXPECT_TRUE(!(px != px));
  1518. EXPECT_TRUE(!(px < px));
  1519. AZStd::shared_ptr<B> py(pz);
  1520. EXPECT_EQ(px.get(), pz.get());
  1521. EXPECT_TRUE(px == pz);
  1522. EXPECT_TRUE(!(px != pz));
  1523. EXPECT_TRUE(py.get() == pz.get());
  1524. EXPECT_TRUE(py == pz);
  1525. EXPECT_TRUE(!(py != pz));
  1526. EXPECT_TRUE(!(px < py || py < px));
  1527. EXPECT_TRUE(!(px < pz || pz < px));
  1528. EXPECT_TRUE(!(py < pz || pz < py));
  1529. AZStd::shared_ptr<void> pvx(px);
  1530. AZStd::shared_ptr<void> pvy(py);
  1531. AZStd::shared_ptr<void> pvz(pz);
  1532. // pvx and pvy aren't equal...
  1533. EXPECT_TRUE(pvx.get() != pvy.get());
  1534. EXPECT_TRUE(pvx != pvy);
  1535. EXPECT_TRUE(!(pvx == pvy));
  1536. // ... but they share ownership ...
  1537. EXPECT_TRUE(!(pvx < pvy || pvy < pvx));
  1538. // ... with pvz
  1539. EXPECT_TRUE(!(pvx < pvz || pvz < pvx));
  1540. EXPECT_TRUE(!(pvy < pvz || pvz < pvy));
  1541. }
  1542. TEST_F(SmartPtr, SharedPtrStaticPointerCastNull)
  1543. {
  1544. struct X {};
  1545. AZStd::shared_ptr<void> pv;
  1546. AZStd::shared_ptr<int> pi = AZStd::static_pointer_cast<int>(pv);
  1547. EXPECT_TRUE(pi.get() == nullptr);
  1548. AZStd::shared_ptr<X> px = AZStd::static_pointer_cast<X>(pv);
  1549. EXPECT_TRUE(px.get() == nullptr);
  1550. }
  1551. TEST_F(SmartPtr, SharedPtrStaticPointerCastNewIntToVoid)
  1552. {
  1553. AZStd::shared_ptr<int> pi(new int);
  1554. AZStd::shared_ptr<void> pv(pi);
  1555. AZStd::shared_ptr<int> pi2 = AZStd::static_pointer_cast<int>(pv);
  1556. EXPECT_TRUE(pi.get() == pi2.get());
  1557. EXPECT_TRUE(!(pi < pi2 || pi2 < pi));
  1558. EXPECT_TRUE(pi.use_count() == 3);
  1559. EXPECT_TRUE(pv.use_count() == 3);
  1560. EXPECT_TRUE(pi2.use_count() == 3);
  1561. }
  1562. TEST_F(SmartPtr, SharedPtrStaticPointerCastPolymorphic)
  1563. {
  1564. struct X {};
  1565. struct Y : public X {};
  1566. AZStd::shared_ptr<X> px(new Y);
  1567. AZStd::shared_ptr<Y> py = AZStd::static_pointer_cast<Y>(px);
  1568. EXPECT_TRUE(px.get() == py.get());
  1569. EXPECT_TRUE(px.use_count() == 2);
  1570. EXPECT_TRUE(py.use_count() == 2);
  1571. AZStd::shared_ptr<X> px2(py);
  1572. EXPECT_TRUE(!(px < px2 || px2 < px));
  1573. }
  1574. // Test smart pointer interactions with EBus
  1575. struct SmartPtrTestBusInterface : public AZ::EBusTraits
  1576. {
  1577. virtual void TakesSharedPtrByCopy(AZStd::shared_ptr<int> sharedPtrByCopy) = 0;
  1578. };
  1579. using SmartPtrTestBus = AZ::EBus<SmartPtrTestBusInterface>;
  1580. class TakesSharedPtrHandler : public SmartPtrTestBus::Handler
  1581. {
  1582. public:
  1583. TakesSharedPtrHandler()
  1584. {
  1585. SmartPtrTestBus::Handler::BusConnect();
  1586. }
  1587. void TakesSharedPtrByCopy(AZStd::shared_ptr<int> sharedPtrByCopy) override
  1588. {
  1589. EXPECT_NE(nullptr, sharedPtrByCopy.get());
  1590. }
  1591. };
  1592. // Ensure that if a shared_ptr RValue is passed into an EBus function
  1593. // the first handler doesn't steal the contents.
  1594. TEST_F(SmartPtr, SharedPtrPassToBusByRValue_AllHandlersReceiveValue)
  1595. {
  1596. TakesSharedPtrHandler handler1;
  1597. TakesSharedPtrHandler handler2;
  1598. SmartPtrTestBus::Broadcast(&SmartPtrTestBus::Events::TakesSharedPtrByCopy, AZStd::make_shared<int>(9));
  1599. }
  1600. TEST_F(SmartPtr, SharedPtrVoidConstPointerCastVoid)
  1601. {
  1602. AZStd::shared_ptr<void const volatile> px;
  1603. AZStd::shared_ptr<void> px2 = AZStd::const_pointer_cast<void>(px);
  1604. EXPECT_TRUE(px2.get() == nullptr);
  1605. }
  1606. TEST_F(SmartPtr, SharedPtrIntConstPointerCastInt)
  1607. {
  1608. AZStd::shared_ptr<int const volatile> px;
  1609. AZStd::shared_ptr<int> px2 = AZStd::const_pointer_cast<int>(px);
  1610. EXPECT_TRUE(px2.get() == nullptr);
  1611. }
  1612. TEST_F(SmartPtr, SharedPtrClassConstPointerCastClass)
  1613. {
  1614. using X = SharedPtr::test::X;
  1615. AZStd::shared_ptr<X const volatile> px;
  1616. AZStd::shared_ptr<X> px2 = AZStd::const_pointer_cast<X>(px);
  1617. EXPECT_TRUE(px2.get() == nullptr);
  1618. }
  1619. TEST_F(SmartPtr, SharedPtrVoidVolatileConstPointerCastVoid)
  1620. {
  1621. AZStd::shared_ptr<void const volatile> px(new int);
  1622. AZStd::shared_ptr<void> px2 = AZStd::const_pointer_cast<void>(px);
  1623. EXPECT_TRUE(px.get() == px2.get());
  1624. EXPECT_TRUE(!(px < px2 || px2 < px));
  1625. EXPECT_TRUE(px.use_count() == 2);
  1626. EXPECT_TRUE(px2.use_count() == 2);
  1627. }
  1628. TEST_F(SmartPtr, SharedPtrIntVolatileConstPointerCastInt)
  1629. {
  1630. AZStd::shared_ptr<int const volatile> px(new int);
  1631. AZStd::shared_ptr<int> px2 = AZStd::const_pointer_cast<int>(px);
  1632. EXPECT_TRUE(px.get() == px2.get());
  1633. EXPECT_TRUE(!(px < px2 || px2 < px));
  1634. EXPECT_TRUE(px.use_count() == 2);
  1635. EXPECT_TRUE(px2.use_count() == 2);
  1636. }
  1637. #if !defined(AZ_NO_RTTI)
  1638. TEST_F(SmartPtr, DynamicPointerUpCastNull)
  1639. {
  1640. using SharedPtr::test::X;
  1641. using SharedPtr::test::Y;
  1642. AZStd::shared_ptr<X> pv;
  1643. AZStd::shared_ptr<Y> pw = AZStd::dynamic_pointer_cast<Y>(pv);
  1644. EXPECT_TRUE(pw.get() == 0);
  1645. }
  1646. TEST_F(SmartPtr, DynamicPointerCastUpCastThenDowncastNull)
  1647. {
  1648. using SharedPtr::test::X;
  1649. using SharedPtr::test::Y;
  1650. AZStd::shared_ptr<X> pv(static_cast<X*>(0));
  1651. AZStd::shared_ptr<Y> pw = AZStd::dynamic_pointer_cast<Y>(pv);
  1652. EXPECT_TRUE(pw.get() == 0);
  1653. AZStd::shared_ptr<X> pv2(pw);
  1654. EXPECT_TRUE(pv < pv2 || pv2 < pv);
  1655. }
  1656. TEST_F(SmartPtr, DynamicPointerCastNullDerivedUpcastToDerived)
  1657. {
  1658. using SharedPtr::test::X;
  1659. using SharedPtr::test::Y;
  1660. AZStd::shared_ptr<X> pv(static_cast<Y*>(0));
  1661. AZStd::shared_ptr<Y> pw = AZStd::dynamic_pointer_cast<Y>(pv);
  1662. EXPECT_TRUE(pw.get() == 0);
  1663. AZStd::shared_ptr<X> pv2(pw);
  1664. EXPECT_TRUE(pv < pv2 || pv2 < pv);
  1665. }
  1666. #endif
  1667. TEST_F(SmartPtr, IntrusivePtr_ConstructMoveDerived)
  1668. {
  1669. bool derivedIsDeleted = false;
  1670. AZStd::intrusive_ptr<RefCountedSubclass> derived = new RefCountedSubclass{&derivedIsDeleted};
  1671. RefCountedSubclass* originalDerived = derived.get();
  1672. AZStd::intrusive_ptr<RefCountedClass> base{ AZStd::move(derived) };
  1673. EXPECT_TRUE(base.get() == originalDerived);
  1674. EXPECT_TRUE(derived.get() == nullptr);
  1675. EXPECT_FALSE(derivedIsDeleted);
  1676. }
  1677. TEST_F(SmartPtr, IntrusivePtr_AssignMoveDerived)
  1678. {
  1679. bool derivedIsDeleted = false;
  1680. AZStd::intrusive_ptr<RefCountedSubclass> derived = new RefCountedSubclass{&derivedIsDeleted};
  1681. RefCountedSubclass* originalDerived = derived.get();
  1682. bool originalBaseIsDeleted = false;
  1683. AZStd::intrusive_ptr<RefCountedClass> base = new RefCountedClass{&originalBaseIsDeleted};
  1684. base = AZStd::move(derived);
  1685. EXPECT_TRUE(base.get() == originalDerived);
  1686. EXPECT_TRUE(originalBaseIsDeleted);
  1687. EXPECT_TRUE(derived.get() == nullptr);
  1688. EXPECT_FALSE(derivedIsDeleted);
  1689. }
  1690. TEST_F(SmartPtr, IntrusivePtr_DynamicCast)
  1691. {
  1692. AZStd::intrusive_ptr<RefCountedClass> basePointer = new RefCountedSubclass;
  1693. AZStd::intrusive_ptr<RefCountedSubclass> correctCast = azdynamic_cast<RefCountedSubclass *>(basePointer);
  1694. AZStd::intrusive_ptr<RefCountedSubclassB> wrongCast = azdynamic_cast<RefCountedSubclassB *>(basePointer);
  1695. EXPECT_TRUE(correctCast.get() == basePointer.get());
  1696. EXPECT_TRUE(wrongCast.get() == nullptr);
  1697. EXPECT_EQ(2, basePointer->use_count());
  1698. }
  1699. } // namespace UnitTest