data: Don't store NameElement in NameHierarchy in shared_ptr to reduce heap allocations
This commit is contained in:
@@ -96,7 +96,7 @@ bool NameElement::hasSignature() const
|
||||
return m_signature.isValid();
|
||||
}
|
||||
|
||||
const NameElement::Signature& NameElement::getSignature()
|
||||
const NameElement::Signature& NameElement::getSignature() const
|
||||
{
|
||||
return m_signature;
|
||||
}
|
||||
|
||||
@@ -37,11 +37,11 @@ public:
|
||||
std::wstring getNameWithSignatureParameters() const;
|
||||
|
||||
bool hasSignature() const;
|
||||
const Signature& getSignature();
|
||||
const Signature& getSignature() const;
|
||||
void setSignature(std::wstring prefix, std::wstring postfix);
|
||||
|
||||
private:
|
||||
const std::wstring m_name;
|
||||
std::wstring m_name;
|
||||
Signature m_signature;
|
||||
};
|
||||
|
||||
|
||||
@@ -30,10 +30,10 @@ std::wstring NameHierarchy::serializeRange(const NameHierarchy& nameHierarchy, s
|
||||
ss << NAME_DELIMITER;
|
||||
}
|
||||
|
||||
ss << nameHierarchy[i]->getName() << PART_DELIMITER;
|
||||
ss << nameHierarchy[i]->getSignature().getPrefix();
|
||||
ss << nameHierarchy[i].getName() << PART_DELIMITER;
|
||||
ss << nameHierarchy[i].getSignature().getPrefix();
|
||||
ss << SIGNATURE_DELIMITER;
|
||||
ss << nameHierarchy[i]->getSignature().getPostfix();
|
||||
ss << nameHierarchy[i].getSignature().getPostfix();
|
||||
}
|
||||
return ss.str();
|
||||
}
|
||||
@@ -86,7 +86,7 @@ NameHierarchy NameHierarchy::deserialize(const std::wstring& serializedName)
|
||||
npos += NAME_DELIMITER.size();
|
||||
}
|
||||
|
||||
nameHierarchy.push(std::make_shared<NameElement>(std::move(name), std::move(prefix), std::move(postfix)));
|
||||
nameHierarchy.push(NameElement(std::move(name), std::move(prefix), std::move(postfix)));
|
||||
}
|
||||
|
||||
return nameHierarchy;
|
||||
@@ -107,21 +107,21 @@ NameHierarchy::NameHierarchy(const NameDelimiterType delimiter)
|
||||
{
|
||||
}
|
||||
|
||||
NameHierarchy::NameHierarchy(std::wstring name, const NameDelimiterType delimiter)
|
||||
: m_delimiter(delimiter)
|
||||
{
|
||||
push(std::make_shared<NameElement>(std::move(name)));
|
||||
}
|
||||
|
||||
NameHierarchy::NameHierarchy(const std::vector<std::wstring>& names, const NameDelimiterType delimiter)
|
||||
: m_delimiter(delimiter)
|
||||
{
|
||||
for (const std::wstring& name : names)
|
||||
{
|
||||
push(std::make_shared<NameElement>(name));
|
||||
push(name);
|
||||
}
|
||||
}
|
||||
|
||||
NameHierarchy::NameHierarchy(std::wstring name, const NameDelimiterType delimiter)
|
||||
: m_delimiter(delimiter)
|
||||
{
|
||||
push(std::move(name));
|
||||
}
|
||||
|
||||
NameHierarchy::NameHierarchy(const NameHierarchy& other)
|
||||
: m_elements(other.m_elements)
|
||||
, m_delimiter(other.m_delimiter)
|
||||
@@ -138,14 +138,14 @@ NameHierarchy::~NameHierarchy()
|
||||
{
|
||||
}
|
||||
|
||||
void NameHierarchy::push(std::shared_ptr<NameElement> element)
|
||||
void NameHierarchy::push(NameElement element)
|
||||
{
|
||||
m_elements.push_back(element);
|
||||
m_elements.emplace_back(std::move(element));
|
||||
}
|
||||
|
||||
void NameHierarchy::push(std::wstring name)
|
||||
{
|
||||
m_elements.push_back(std::make_shared<NameElement>(std::move(name)));
|
||||
m_elements.emplace_back(std::move(name));
|
||||
}
|
||||
|
||||
void NameHierarchy::pop()
|
||||
@@ -153,16 +153,22 @@ void NameHierarchy::pop()
|
||||
m_elements.pop_back();
|
||||
}
|
||||
|
||||
std::shared_ptr<NameElement> NameHierarchy::back() const
|
||||
NameElement& NameHierarchy::back()
|
||||
{
|
||||
if (m_elements.size() > 0)
|
||||
{
|
||||
return m_elements.back();
|
||||
}
|
||||
return std::shared_ptr<NameElement>();
|
||||
return m_elements.back();
|
||||
}
|
||||
|
||||
std::shared_ptr<NameElement> NameHierarchy::operator[](size_t pos) const
|
||||
const NameElement& NameHierarchy::back() const
|
||||
{
|
||||
return m_elements.back();
|
||||
}
|
||||
|
||||
NameElement& NameHierarchy::operator[](size_t pos)
|
||||
{
|
||||
return m_elements[pos];
|
||||
}
|
||||
|
||||
const NameElement& NameHierarchy::operator[](size_t pos) const
|
||||
{
|
||||
return m_elements[pos];
|
||||
}
|
||||
@@ -207,7 +213,7 @@ std::wstring NameHierarchy::getQualifiedName() const
|
||||
{
|
||||
ss << nameDelimiterTypeToString(m_delimiter);
|
||||
}
|
||||
ss << m_elements[i]->getName();
|
||||
ss << m_elements[i].getName();
|
||||
}
|
||||
return ss.str();
|
||||
}
|
||||
@@ -217,7 +223,7 @@ std::wstring NameHierarchy::getQualifiedNameWithSignature() const
|
||||
std::wstring name = getQualifiedName();
|
||||
if (m_elements.size())
|
||||
{
|
||||
name = m_elements.back()->getSignature().qualifyName(name); // todo: use separator for signature!
|
||||
name = m_elements.back().getSignature().qualifyName(name); // todo: use separator for signature!
|
||||
}
|
||||
return name;
|
||||
}
|
||||
@@ -226,7 +232,7 @@ std::wstring NameHierarchy::getRawName() const
|
||||
{
|
||||
if (m_elements.size())
|
||||
{
|
||||
return m_elements.back()->getName();
|
||||
return m_elements.back().getName();
|
||||
}
|
||||
return L"";
|
||||
}
|
||||
@@ -235,7 +241,7 @@ std::wstring NameHierarchy::getRawNameWithSignature() const
|
||||
{
|
||||
if (m_elements.size())
|
||||
{
|
||||
return m_elements.back()->getNameWithSignature();
|
||||
return m_elements.back().getNameWithSignature();
|
||||
}
|
||||
return L"";
|
||||
}
|
||||
@@ -244,7 +250,7 @@ std::wstring NameHierarchy::getRawNameWithSignatureParameters() const
|
||||
{
|
||||
if (m_elements.size())
|
||||
{
|
||||
return m_elements.back()->getNameWithSignatureParameters();
|
||||
return m_elements.back().getNameWithSignatureParameters();
|
||||
}
|
||||
return L"";
|
||||
}
|
||||
@@ -253,7 +259,7 @@ bool NameHierarchy::hasSignature() const
|
||||
{
|
||||
if (m_elements.size())
|
||||
{
|
||||
return m_elements.back()->hasSignature();
|
||||
return m_elements.back().hasSignature();
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -263,7 +269,7 @@ NameElement::Signature NameHierarchy::getSignature() const
|
||||
{
|
||||
if (m_elements.size())
|
||||
{
|
||||
return m_elements.back()->getSignature(); // todo: use separator for signature!
|
||||
return m_elements.back().getSignature(); // todo: use separator for signature!
|
||||
}
|
||||
|
||||
return NameElement::Signature();
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#ifndef NAME_HIERARCHY_H
|
||||
#define NAME_HIERARCHY_H
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
@@ -26,12 +25,15 @@ public:
|
||||
NameDelimiterType getDelimiter() const;
|
||||
void setDelimiter(const NameDelimiterType delimiter);
|
||||
|
||||
void push(std::shared_ptr<NameElement> element);
|
||||
void push(NameElement element);
|
||||
void push(std::wstring name);
|
||||
void pop();
|
||||
|
||||
std::shared_ptr<NameElement> back() const;
|
||||
std::shared_ptr<NameElement> operator[](size_t pos) const;
|
||||
NameElement& back();
|
||||
const NameElement& back() const;
|
||||
NameElement& operator[](size_t pos);
|
||||
const NameElement& operator[](size_t pos) const;
|
||||
|
||||
NameHierarchy& operator=(const NameHierarchy& other);
|
||||
NameHierarchy& operator=(NameHierarchy&& other);
|
||||
|
||||
@@ -49,7 +51,7 @@ public:
|
||||
NameElement::Signature getSignature() const;
|
||||
|
||||
private:
|
||||
std::vector<std::shared_ptr<NameElement>> m_elements;
|
||||
std::vector<NameElement> m_elements;
|
||||
NameDelimiterType m_delimiter;
|
||||
};
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ CxxDeclName::CxxDeclName(std::wstring name, std::vector<std::wstring> templatePa
|
||||
NameHierarchy CxxDeclName::toNameHierarchy() const
|
||||
{
|
||||
NameHierarchy ret = getParent() ? getParent()->toNameHierarchy() : NameHierarchy(NAME_DELIMITER_CXX);
|
||||
ret.push(std::make_shared<NameElement>(m_name + getTemplateSuffix(m_templateParameterNames)));
|
||||
ret.push(m_name + getTemplateSuffix(m_templateParameterNames));
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -44,6 +44,6 @@ NameHierarchy CxxFunctionDeclName::toNameHierarchy() const
|
||||
}
|
||||
|
||||
NameHierarchy ret = CxxDeclName::toNameHierarchy();
|
||||
ret.back()->setSignature(prefix.str(), postfix.str());
|
||||
ret.back().setSignature(prefix.str(), postfix.str());
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -15,9 +15,10 @@ CxxStaticFunctionDeclName::CxxStaticFunctionDeclName(
|
||||
NameHierarchy CxxStaticFunctionDeclName::toNameHierarchy() const
|
||||
{
|
||||
NameHierarchy ret = CxxFunctionDeclName::toNameHierarchy();
|
||||
ret.back()->setSignature(
|
||||
ret.back()->getSignature().getPrefix(),
|
||||
ret.back()->getSignature().getPostfix() + L" (" + m_translationUnitFileName + L')'
|
||||
NameElement& last = ret.back();
|
||||
last.setSignature(
|
||||
last.getSignature().getPrefix(),
|
||||
last.getSignature().getPostfix() + L" (" + m_translationUnitFileName + L')'
|
||||
);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ CxxTypeName::CxxTypeName(
|
||||
NameHierarchy CxxTypeName::toNameHierarchy() const
|
||||
{
|
||||
NameHierarchy ret = getParent() ? getParent()->toNameHierarchy() : NameHierarchy(NAME_DELIMITER_CXX);
|
||||
ret.push(std::make_shared<NameElement>(m_name + getTemplateSuffix(m_templateArguments)));
|
||||
ret.push(m_name + getTemplateSuffix(m_templateArguments));
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,6 @@ NameHierarchy CxxVariableDeclName::toNameHierarchy() const
|
||||
signaturePrefix += m_typeName->toString();
|
||||
|
||||
NameHierarchy ret = CxxDeclName::toNameHierarchy();
|
||||
ret.back()->setSignature(std::move(signaturePrefix), L"");
|
||||
ret.back().setSignature(std::move(signaturePrefix), L"");
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -265,9 +265,9 @@ private:
|
||||
NameHierarchy createFunctionNameHierarchy(std::wstring ret, std::wstring name, std::wstring parameters) const
|
||||
{
|
||||
NameHierarchy nameHierarchy = createNameHierarchy(name);
|
||||
std::wstring lastName = nameHierarchy.back()->getName();
|
||||
std::wstring lastName = nameHierarchy.back().getName();
|
||||
nameHierarchy.pop();
|
||||
nameHierarchy.push(std::make_shared<NameElement>(lastName, ret, parameters));
|
||||
nameHierarchy.push(NameElement(lastName, ret, parameters));
|
||||
return nameHierarchy;
|
||||
}
|
||||
|
||||
@@ -276,7 +276,7 @@ private:
|
||||
NameHierarchy nameHierarchy(NAME_DELIMITER_CXX);
|
||||
for (std::wstring element: utility::splitToVector(s, nameDelimiterTypeToString(NAME_DELIMITER_CXX)))
|
||||
{
|
||||
nameHierarchy.push(std::make_shared<NameElement>(element));
|
||||
nameHierarchy.push(element);
|
||||
}
|
||||
return nameHierarchy;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user