Skip to content

Commit 6386cf1

Browse files
committed
Refactoring: use smart pointers for Definition class internals
1 parent 6aaa53e commit 6386cf1

File tree

2 files changed

+45
-52
lines changed

2 files changed

+45
-52
lines changed

src/definition.cpp

Lines changed: 43 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,35 @@
5454

5555
//-----------------------------------------------------------------------------------------
5656

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+
5782
/** Private data associated with a Symbol DefinitionImpl object. */
5883
class DefinitionImpl::IMPL
5984
{
6085
public:
61-
~IMPL();
6286
void init(const QCString &df, const QCString &n);
6387
void setDefFileName(const QCString &df);
6488

@@ -71,10 +95,10 @@ class DefinitionImpl::IMPL
7195
RefItemVector xrefListItems;
7296
GroupList partOfGroups;
7397

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
78102
QCString briefSignatures;
79103
QCString docSignatures;
80104

@@ -108,14 +132,6 @@ class DefinitionImpl::IMPL
108132
};
109133

110134

111-
DefinitionImpl::IMPL::~IMPL()
112-
{
113-
delete brief;
114-
delete details;
115-
delete body;
116-
delete inbodyDocs;
117-
}
118-
119135
void DefinitionImpl::IMPL::setDefFileName(const QCString &df)
120136
{
121137
defFileName = df;
@@ -141,10 +157,10 @@ void DefinitionImpl::IMPL::init(const QCString &df, const QCString &n)
141157
}
142158
//printf("localName=%s\n",qPrint(localName));
143159

144-
brief = 0;
145-
details = 0;
146-
body = 0;
147-
inbodyDocs = 0;
160+
brief.reset();
161+
details.reset();
162+
body.reset();
163+
inbodyDocs.reset();
148164
sourceRefByDict.clear();
149165
sourceRefsDict.clear();
150166
outerScope = Doxygen::globalScope;
@@ -241,8 +257,8 @@ DefinitionImpl::DefinitionImpl(Definition *def,
241257
const QCString &df,int dl,int dc,
242258
const QCString &name,const char *b,
243259
const char *d,bool isSymbol)
260+
: m_impl(std::make_unique<DefinitionImpl::IMPL>())
244261
{
245-
m_impl = new DefinitionImpl::IMPL;
246262
setName(name);
247263
m_impl->def = def;
248264
m_impl->defLine = dl;
@@ -259,30 +275,8 @@ DefinitionImpl::DefinitionImpl(Definition *def,
259275
}
260276

261277
DefinitionImpl::DefinitionImpl(const DefinitionImpl &d)
278+
: m_impl(std::make_unique<DefinitionImpl::IMPL>(*d.m_impl))
262279
{
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-
286280
if (m_impl->isSymbol) addToMap(m_impl->name,m_impl->def);
287281
}
288282

@@ -292,8 +286,6 @@ DefinitionImpl::~DefinitionImpl()
292286
{
293287
removeFromMap(m_impl->symbolName,m_impl->def);
294288
}
295-
delete m_impl;
296-
m_impl=0;
297289
}
298290

299291
void DefinitionImpl::setName(const QCString &name)
@@ -471,9 +463,9 @@ void DefinitionImpl::_setDocumentation(const QCString &d,const QCString &docFile
471463
if (!_docsAlreadyAdded(doc,m_impl->docSignatures))
472464
{
473465
//printf("setting docs for %s: '%s'\n",qPrint(name()),qPrint(m_doc));
474-
if (m_impl->details==0)
466+
if (!m_impl->details)
475467
{
476-
m_impl->details = new DocInfo;
468+
m_impl->details = make_DeepCopyUnique<DocInfo>();
477469
}
478470
if (m_impl->details->doc.isEmpty()) // fresh detailed description
479471
{
@@ -539,9 +531,9 @@ void DefinitionImpl::_setBriefDescription(const QCString &b,const QCString &brie
539531
else
540532
{
541533
//fprintf(stderr,"DefinitionImpl::setBriefDescription(%s,%s,%d)\n",b,briefFile,briefLine);
542-
if (m_impl->brief==0)
534+
if (!m_impl->brief)
543535
{
544-
m_impl->brief = new BriefInfo;
536+
m_impl->brief = make_DeepCopyUnique<BriefInfo>();
545537
}
546538
m_impl->brief->doc=brief;
547539
if (briefLine!=-1)
@@ -570,9 +562,9 @@ void DefinitionImpl::setBriefDescription(const QCString &b,const QCString &brief
570562

571563
void DefinitionImpl::_setInbodyDocumentation(const QCString &doc,const QCString &inbodyFile,int inbodyLine)
572564
{
573-
if (m_impl->inbodyDocs==0)
565+
if (!m_impl->inbodyDocs)
574566
{
575-
m_impl->inbodyDocs = new DocInfo;
567+
m_impl->inbodyDocs = make_DeepCopyUnique<DocInfo>();
576568
}
577569
if (m_impl->inbodyDocs->doc.isEmpty()) // fresh inbody docs
578570
{
@@ -1035,15 +1027,15 @@ void DefinitionImpl::writeSourceDef(OutputList &ol,const QCString &) const
10351027
void DefinitionImpl::setBodySegment(int defLine, int bls,int ble)
10361028
{
10371029
//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>();
10391031
m_impl->body->defLine = defLine;
10401032
m_impl->body->startLine = bls;
10411033
m_impl->body->endLine = ble;
10421034
}
10431035

10441036
void DefinitionImpl::setBodyDef(const FileDef *fd)
10451037
{
1046-
if (m_impl->body==0) m_impl->body = new BodyInfo;
1038+
if (!m_impl->body) m_impl->body = make_DeepCopyUnique<BodyInfo>();
10471039
m_impl->body->fileDef=fd;
10481040
}
10491041

src/definitionimpl.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#ifndef DEFINITIONIMPL_H
1919
#define DEFINITIONIMPL_H
2020

21+
#include <memory>
2122
#include <unordered_map>
2223
#include <string>
2324

@@ -135,7 +136,7 @@ class DefinitionImpl
135136

136137
// PIMPL idiom
137138
class IMPL;
138-
IMPL *m_impl; // internal structure holding all private data
139+
std::unique_ptr<IMPL> m_impl; // internal structure holding all private data
139140
};
140141

141142
template<class Base>

0 commit comments

Comments
 (0)