test_ptr.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. /*M///////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
  4. //
  5. // By downloading, copying, installing or using the software you agree to this license.
  6. // If you do not agree to this license, do not download, install,
  7. // copy or use the software.
  8. //
  9. //
  10. // License Agreement
  11. // For Open Source Computer Vision Library
  12. //
  13. // Copyright (C) 2013, NVIDIA Corporation, all rights reserved.
  14. // Third party copyrights are property of their respective owners.
  15. //
  16. // Redistribution and use in source and binary forms, with or without modification,
  17. // are permitted provided that the following conditions are met:
  18. //
  19. // * Redistribution's of source code must retain the above copyright notice,
  20. // this list of conditions and the following disclaimer.
  21. //
  22. // * Redistribution's in binary form must reproduce the above copyright notice,
  23. // this list of conditions and the following disclaimer in the documentation
  24. // and/or other materials provided with the distribution.
  25. //
  26. // * The name of the copyright holders may not be used to endorse or promote products
  27. // derived from this software without specific prior written permission.
  28. //
  29. // This software is provided by the copyright holders and contributors "as is" and
  30. // any express or implied warranties, including, but not limited to, the implied
  31. // warranties of merchantability and fitness for a particular purpose are disclaimed.
  32. // In no event shall the copyright holders or contributors be liable for any direct,
  33. // indirect, incidental, special, exemplary, or consequential damages
  34. // (including, but not limited to, procurement of substitute goods or services;
  35. // loss of use, data, or profits; or business interruption) however caused
  36. // and on any theory of liability, whether in contract, strict liability,
  37. // or tort (including negligence or otherwise) arising in any way out of
  38. // the use of this software, even if advised of the possibility of such damage.
  39. //
  40. //M*/
  41. #include "test_precomp.hpp"
  42. namespace opencv_test { namespace {
  43. #ifdef GTEST_CAN_COMPARE_NULL
  44. # define EXPECT_NULL(ptr) EXPECT_EQ(NULL, ptr)
  45. #else
  46. # define EXPECT_NULL(ptr) EXPECT_TRUE(ptr == NULL)
  47. #endif
  48. using namespace cv;
  49. namespace {
  50. struct Reporter {
  51. Reporter(bool* deleted) : deleted_(deleted)
  52. { *deleted_ = false; }
  53. // the destructor is virtual, so that we can test dynamic_cast later
  54. virtual ~Reporter()
  55. { *deleted_ = true; }
  56. private:
  57. bool* deleted_;
  58. Reporter(const Reporter&);
  59. Reporter& operator = (const Reporter&);
  60. };
  61. struct ReportingDeleter {
  62. ReportingDeleter(bool* deleted) : deleted_(deleted)
  63. { *deleted_ = false; }
  64. void operator()(void*)
  65. { *deleted_ = true; }
  66. private:
  67. bool* deleted_;
  68. };
  69. int dummyObject;
  70. }
  71. TEST(Core_Ptr, default_ctor)
  72. {
  73. Ptr<int> p;
  74. EXPECT_NULL(p.get());
  75. }
  76. TEST(Core_Ptr, owning_ctor)
  77. {
  78. bool deleted = false;
  79. {
  80. Reporter* r = new Reporter(&deleted);
  81. Ptr<void> p(r);
  82. EXPECT_EQ(r, p.get());
  83. }
  84. EXPECT_TRUE(deleted);
  85. {
  86. Ptr<int> p(&dummyObject, ReportingDeleter(&deleted));
  87. EXPECT_EQ(&dummyObject, p.get());
  88. }
  89. EXPECT_TRUE(deleted);
  90. {
  91. Ptr<void> p((void*)0, ReportingDeleter(&deleted));
  92. EXPECT_NULL(p.get());
  93. }
  94. EXPECT_TRUE(deleted); // Differ from OpenCV 3.4 (but conformant to std::shared_ptr, see below)
  95. {
  96. std::shared_ptr<void> p((void*)0, ReportingDeleter(&deleted));
  97. EXPECT_NULL(p.get());
  98. }
  99. EXPECT_TRUE(deleted);
  100. }
  101. TEST(Core_Ptr, sharing_ctor)
  102. {
  103. bool deleted = false;
  104. {
  105. Ptr<Reporter> p1(new Reporter(&deleted));
  106. Ptr<Reporter> p2(p1);
  107. EXPECT_EQ(p1.get(), p2.get());
  108. p1.release();
  109. EXPECT_FALSE(deleted);
  110. }
  111. EXPECT_TRUE(deleted);
  112. {
  113. Ptr<Reporter> p1(new Reporter(&deleted));
  114. Ptr<void> p2(p1);
  115. EXPECT_EQ(p1.get(), p2.get());
  116. p1.release();
  117. EXPECT_FALSE(deleted);
  118. }
  119. EXPECT_TRUE(deleted);
  120. {
  121. Ptr<Reporter> p1(new Reporter(&deleted));
  122. Ptr<int> p2(p1, &dummyObject);
  123. EXPECT_EQ(&dummyObject, p2.get());
  124. p1.release();
  125. EXPECT_FALSE(deleted);
  126. }
  127. EXPECT_TRUE(deleted);
  128. }
  129. TEST(Core_Ptr, assignment)
  130. {
  131. bool deleted1 = false, deleted2 = false;
  132. {
  133. Ptr<Reporter> p1(new Reporter(&deleted1));
  134. p1 = *&p1;
  135. EXPECT_FALSE(deleted1);
  136. }
  137. EXPECT_TRUE(deleted1);
  138. {
  139. Ptr<Reporter> p1(new Reporter(&deleted1));
  140. Ptr<Reporter> p2(new Reporter(&deleted2));
  141. p2 = p1;
  142. EXPECT_TRUE(deleted2);
  143. EXPECT_EQ(p1.get(), p2.get());
  144. p1.release();
  145. EXPECT_FALSE(deleted1);
  146. }
  147. EXPECT_TRUE(deleted1);
  148. {
  149. Ptr<Reporter> p1(new Reporter(&deleted1));
  150. Ptr<void> p2(new Reporter(&deleted2));
  151. p2 = p1;
  152. EXPECT_TRUE(deleted2);
  153. EXPECT_EQ(p1.get(), p2.get());
  154. p1.release();
  155. EXPECT_FALSE(deleted1);
  156. }
  157. EXPECT_TRUE(deleted1);
  158. }
  159. TEST(Core_Ptr, release)
  160. {
  161. bool deleted = false;
  162. Ptr<Reporter> p1(new Reporter(&deleted));
  163. p1.release();
  164. EXPECT_TRUE(deleted);
  165. EXPECT_NULL(p1.get());
  166. }
  167. TEST(Core_Ptr, reset)
  168. {
  169. bool deleted_old = false, deleted_new = false;
  170. {
  171. Ptr<void> p(new Reporter(&deleted_old));
  172. Reporter* r = new Reporter(&deleted_new);
  173. p.reset(r);
  174. EXPECT_TRUE(deleted_old);
  175. EXPECT_EQ(r, p.get());
  176. }
  177. EXPECT_TRUE(deleted_new);
  178. {
  179. Ptr<void> p(new Reporter(&deleted_old));
  180. p.reset(&dummyObject, ReportingDeleter(&deleted_new));
  181. EXPECT_TRUE(deleted_old);
  182. EXPECT_EQ(&dummyObject, p.get());
  183. }
  184. EXPECT_TRUE(deleted_new);
  185. }
  186. TEST(Core_Ptr, swap)
  187. {
  188. bool deleted1 = false, deleted2 = false;
  189. {
  190. Reporter* r1 = new Reporter(&deleted1);
  191. Reporter* r2 = new Reporter(&deleted2);
  192. Ptr<Reporter> p1(r1), p2(r2);
  193. p1.swap(p2);
  194. EXPECT_EQ(r1, p2.get());
  195. EXPECT_EQ(r2, p1.get());
  196. EXPECT_FALSE(deleted1);
  197. EXPECT_FALSE(deleted2);
  198. p1.release();
  199. EXPECT_TRUE(deleted2);
  200. }
  201. EXPECT_TRUE(deleted1);
  202. {
  203. Reporter* r1 = new Reporter(&deleted1);
  204. Reporter* r2 = new Reporter(&deleted2);
  205. Ptr<Reporter> p1(r1), p2(r2);
  206. swap(p1, p2);
  207. EXPECT_EQ(r1, p2.get());
  208. EXPECT_EQ(r2, p1.get());
  209. EXPECT_FALSE(deleted1);
  210. EXPECT_FALSE(deleted2);
  211. p1.release();
  212. EXPECT_TRUE(deleted2);
  213. }
  214. EXPECT_TRUE(deleted1);
  215. }
  216. TEST(Core_Ptr, accessors)
  217. {
  218. {
  219. Ptr<int> p;
  220. EXPECT_NULL(static_cast<int*>(p));
  221. EXPECT_TRUE(p.empty());
  222. }
  223. {
  224. Size* s = new Size();
  225. Ptr<Size> p(s);
  226. EXPECT_EQ(s, static_cast<Size*>(p));
  227. EXPECT_EQ(s, &*p);
  228. EXPECT_EQ(&s->width, &p->width);
  229. EXPECT_FALSE(p.empty());
  230. }
  231. }
  232. namespace {
  233. struct SubReporterBase {
  234. virtual ~SubReporterBase() {}
  235. int padding;
  236. };
  237. /* multiple inheritance, so that casts do something interesting */
  238. struct SubReporter : SubReporterBase, Reporter
  239. {
  240. SubReporter(bool* deleted) : Reporter(deleted)
  241. {}
  242. };
  243. }
  244. TEST(Core_Ptr, casts)
  245. {
  246. bool deleted = false;
  247. {
  248. Ptr<const Reporter> p1(new Reporter(&deleted));
  249. Ptr<Reporter> p2 = p1.constCast<Reporter>();
  250. EXPECT_EQ(p1.get(), p2.get());
  251. p1.release();
  252. EXPECT_FALSE(deleted);
  253. }
  254. EXPECT_TRUE(deleted);
  255. {
  256. SubReporter* sr = new SubReporter(&deleted);
  257. Ptr<Reporter> p1(sr);
  258. // This next check isn't really for Ptr itself; it checks that Reporter
  259. // is at a non-zero offset within SubReporter, so that the next
  260. // check will give us more confidence that the cast actually did something.
  261. EXPECT_NE(static_cast<void*>(sr), static_cast<void*>(p1.get()));
  262. Ptr<SubReporter> p2 = p1.staticCast<SubReporter>();
  263. EXPECT_EQ(sr, p2.get());
  264. p1.release();
  265. EXPECT_FALSE(deleted);
  266. }
  267. EXPECT_TRUE(deleted);
  268. {
  269. SubReporter* sr = new SubReporter(&deleted);
  270. Ptr<Reporter> p1(sr);
  271. EXPECT_NE(static_cast<void*>(sr), static_cast<void*>(p1.get()));
  272. Ptr<void> p2 = p1.dynamicCast<void>();
  273. EXPECT_EQ(sr, p2.get());
  274. p1.release();
  275. EXPECT_FALSE(deleted);
  276. }
  277. EXPECT_TRUE(deleted);
  278. {
  279. Ptr<Reporter> p1(new Reporter(&deleted));
  280. Ptr<SubReporter> p2 = p1.dynamicCast<SubReporter>();
  281. EXPECT_NULL(p2.get());
  282. p1.release();
  283. EXPECT_TRUE(deleted);
  284. }
  285. EXPECT_TRUE(deleted);
  286. }
  287. TEST(Core_Ptr, comparisons)
  288. {
  289. Ptr<int> p1, p2(new int), p3(new int);
  290. Ptr<int> p4(p2, p3.get());
  291. // Not using EXPECT_EQ here, since none of them are really "expected" or "actual".
  292. EXPECT_TRUE(p1 == p1);
  293. EXPECT_TRUE(p2 == p2);
  294. EXPECT_TRUE(p2 != p3);
  295. EXPECT_TRUE(p2 != p4);
  296. EXPECT_TRUE(p3 == p4);
  297. }
  298. TEST(Core_Ptr, make)
  299. {
  300. bool deleted = true;
  301. {
  302. Ptr<void> p = makePtr<Reporter>(&deleted);
  303. EXPECT_FALSE(deleted);
  304. }
  305. EXPECT_TRUE(deleted);
  306. }
  307. }} // namespace
  308. namespace {
  309. struct SpeciallyDeletable
  310. {
  311. SpeciallyDeletable() : deleted(false)
  312. {}
  313. bool deleted;
  314. };
  315. } // namespace
  316. namespace cv {
  317. template<> struct DefaultDeleter<SpeciallyDeletable>
  318. {
  319. void operator()(SpeciallyDeletable * obj) const { obj->deleted = true; }
  320. };
  321. } // namespace
  322. namespace opencv_test { namespace {
  323. TEST(Core_Ptr, specialized_deleter)
  324. {
  325. SpeciallyDeletable sd;
  326. { Ptr<void> p(&sd); }
  327. ASSERT_TRUE(sd.deleted);
  328. }
  329. TEST(Core_Ptr, specialized_deleter_via_reset)
  330. {
  331. SpeciallyDeletable sd;
  332. {
  333. Ptr<SpeciallyDeletable> p;
  334. p.reset(&sd);
  335. }
  336. ASSERT_TRUE(sd.deleted);
  337. }
  338. }} // namespace