54
54
55
55
// -----------------------------------------------------------------------------------------
56
56
57
+ // ! Helper class add copy/assignment support to std::unique_ptr by making a deep copy
58
+ // ! Note that T may not be a polymorphic type
59
+ template <class T >
60
+ class DeepCopyUniquePtr : public std ::unique_ptr<T>
61
+ {
62
+ public:
63
+ using std::unique_ptr<T>::unique_ptr;
64
+ DeepCopyUniquePtr (const DeepCopyUniquePtr &other)
65
+ {
66
+ this ->reset (other ? new T (*other) : nullptr );
67
+ }
68
+ DeepCopyUniquePtr &operator =(const DeepCopyUniquePtr &other)
69
+ {
70
+ if (*this !=other) this ->reset (other ? new T (*other) : nullptr );
71
+ return *this ;
72
+ }
73
+ };
74
+
75
+ // ! Helper to create an object wrapped in a DeepCopyUniquePtr.
76
+ template <typename T, typename ... Args>
77
+ DeepCopyUniquePtr<T> make_DeepCopyUnique (Args&&... args)
78
+ {
79
+ return DeepCopyUniquePtr<T>(new T (std::forward<Args>(args)...));
80
+ }
81
+
57
82
/* * Private data associated with a Symbol DefinitionImpl object. */
58
83
class DefinitionImpl ::IMPL
59
84
{
60
85
public:
61
- ~IMPL ();
62
86
void init (const QCString &df, const QCString &n);
63
87
void setDefFileName (const QCString &df);
64
88
@@ -71,10 +95,10 @@ class DefinitionImpl::IMPL
71
95
RefItemVector xrefListItems;
72
96
GroupList partOfGroups;
73
97
74
- DocInfo * details = 0 ; // not exported
75
- DocInfo * inbodyDocs = 0 ; // not exported
76
- BriefInfo * brief = 0 ; // not exported
77
- BodyInfo * body = 0 ; // not exported
98
+ DeepCopyUniquePtr< DocInfo> details; // not exported
99
+ DeepCopyUniquePtr< DocInfo> inbodyDocs; // not exported
100
+ DeepCopyUniquePtr< BriefInfo> brief; // not exported
101
+ DeepCopyUniquePtr< BodyInfo> body; // not exported
78
102
QCString briefSignatures;
79
103
QCString docSignatures;
80
104
@@ -108,14 +132,6 @@ class DefinitionImpl::IMPL
108
132
};
109
133
110
134
111
- DefinitionImpl::IMPL::~IMPL ()
112
- {
113
- delete brief;
114
- delete details;
115
- delete body;
116
- delete inbodyDocs;
117
- }
118
-
119
135
void DefinitionImpl::IMPL::setDefFileName (const QCString &df)
120
136
{
121
137
defFileName = df;
@@ -141,10 +157,10 @@ void DefinitionImpl::IMPL::init(const QCString &df, const QCString &n)
141
157
}
142
158
// printf("localName=%s\n",qPrint(localName));
143
159
144
- brief = 0 ;
145
- details = 0 ;
146
- body = 0 ;
147
- inbodyDocs = 0 ;
160
+ brief. reset () ;
161
+ details. reset () ;
162
+ body. reset () ;
163
+ inbodyDocs. reset () ;
148
164
sourceRefByDict.clear ();
149
165
sourceRefsDict.clear ();
150
166
outerScope = Doxygen::globalScope;
@@ -241,8 +257,8 @@ DefinitionImpl::DefinitionImpl(Definition *def,
241
257
const QCString &df,int dl,int dc,
242
258
const QCString &name,const char *b,
243
259
const char *d,bool isSymbol)
260
+ : m_impl(std::make_unique<DefinitionImpl::IMPL>())
244
261
{
245
- m_impl = new DefinitionImpl::IMPL;
246
262
setName (name);
247
263
m_impl->def = def;
248
264
m_impl->defLine = dl;
@@ -259,30 +275,8 @@ DefinitionImpl::DefinitionImpl(Definition *def,
259
275
}
260
276
261
277
DefinitionImpl::DefinitionImpl (const DefinitionImpl &d)
278
+ : m_impl(std::make_unique<DefinitionImpl::IMPL>(*d.m_impl))
262
279
{
263
- m_impl = new DefinitionImpl::IMPL;
264
- *m_impl = *d.m_impl ;
265
- m_impl->brief = 0 ;
266
- m_impl->details = 0 ;
267
- m_impl->body = 0 ;
268
- m_impl->inbodyDocs = 0 ;
269
- if (d.m_impl ->brief )
270
- {
271
- m_impl->brief = new BriefInfo (*d.m_impl ->brief );
272
- }
273
- if (d.m_impl ->details )
274
- {
275
- m_impl->details = new DocInfo (*d.m_impl ->details );
276
- }
277
- if (d.m_impl ->body )
278
- {
279
- m_impl->body = new BodyInfo (*d.m_impl ->body );
280
- }
281
- if (d.m_impl ->inbodyDocs )
282
- {
283
- m_impl->inbodyDocs = new DocInfo (*d.m_impl ->inbodyDocs );
284
- }
285
-
286
280
if (m_impl->isSymbol ) addToMap (m_impl->name ,m_impl->def );
287
281
}
288
282
@@ -292,8 +286,6 @@ DefinitionImpl::~DefinitionImpl()
292
286
{
293
287
removeFromMap (m_impl->symbolName ,m_impl->def );
294
288
}
295
- delete m_impl;
296
- m_impl=0 ;
297
289
}
298
290
299
291
void DefinitionImpl::setName (const QCString &name)
@@ -471,9 +463,9 @@ void DefinitionImpl::_setDocumentation(const QCString &d,const QCString &docFile
471
463
if (!_docsAlreadyAdded (doc,m_impl->docSignatures ))
472
464
{
473
465
// printf("setting docs for %s: '%s'\n",qPrint(name()),qPrint(m_doc));
474
- if (m_impl->details == 0 )
466
+ if (! m_impl->details )
475
467
{
476
- m_impl->details = new DocInfo;
468
+ m_impl->details = make_DeepCopyUnique< DocInfo>() ;
477
469
}
478
470
if (m_impl->details ->doc .isEmpty ()) // fresh detailed description
479
471
{
@@ -539,9 +531,9 @@ void DefinitionImpl::_setBriefDescription(const QCString &b,const QCString &brie
539
531
else
540
532
{
541
533
// fprintf(stderr,"DefinitionImpl::setBriefDescription(%s,%s,%d)\n",b,briefFile,briefLine);
542
- if (m_impl->brief == 0 )
534
+ if (! m_impl->brief )
543
535
{
544
- m_impl->brief = new BriefInfo;
536
+ m_impl->brief = make_DeepCopyUnique< BriefInfo>() ;
545
537
}
546
538
m_impl->brief ->doc =brief;
547
539
if (briefLine!=-1 )
@@ -570,9 +562,9 @@ void DefinitionImpl::setBriefDescription(const QCString &b,const QCString &brief
570
562
571
563
void DefinitionImpl::_setInbodyDocumentation (const QCString &doc,const QCString &inbodyFile,int inbodyLine)
572
564
{
573
- if (m_impl->inbodyDocs == 0 )
565
+ if (! m_impl->inbodyDocs )
574
566
{
575
- m_impl->inbodyDocs = new DocInfo;
567
+ m_impl->inbodyDocs = make_DeepCopyUnique< DocInfo>() ;
576
568
}
577
569
if (m_impl->inbodyDocs ->doc .isEmpty ()) // fresh inbody docs
578
570
{
@@ -1035,15 +1027,15 @@ void DefinitionImpl::writeSourceDef(OutputList &ol,const QCString &) const
1035
1027
void DefinitionImpl::setBodySegment (int defLine, int bls,int ble)
1036
1028
{
1037
1029
// printf("setBodySegment(%d,%d) for %s\n",bls,ble,qPrint(name()));
1038
- if (m_impl->body == 0 ) m_impl->body = new BodyInfo;
1030
+ if (! m_impl->body ) m_impl->body = make_DeepCopyUnique< BodyInfo>() ;
1039
1031
m_impl->body ->defLine = defLine;
1040
1032
m_impl->body ->startLine = bls;
1041
1033
m_impl->body ->endLine = ble;
1042
1034
}
1043
1035
1044
1036
void DefinitionImpl::setBodyDef (const FileDef *fd)
1045
1037
{
1046
- if (m_impl->body == 0 ) m_impl->body = new BodyInfo;
1038
+ if (! m_impl->body ) m_impl->body = make_DeepCopyUnique< BodyInfo>() ;
1047
1039
m_impl->body ->fileDef =fd;
1048
1040
}
1049
1041
0 commit comments