data: Don't store NameElement in NameHierarchy in shared_ptr to reduce heap allocations

This commit is contained in:
Eberhard Graether
2018-09-23 18:01:31 +02:00
parent 34cdde604e
commit a870858bb6
10 changed files with 55 additions and 46 deletions
+1 -1
View File
@@ -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;
}
+2 -2
View File
@@ -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;
};
+34 -28
View File
@@ -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();
+7 -5
View File
@@ -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;
}
+3 -3
View File
@@ -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;
}