cmDocumentation: Get rid of raw pointers in AllSections map

Also simplify a lot of logic around adding sections into it.
Prefer move sematics over references.
This commit is contained in:
Artur Ryt
2018-11-30 20:08:50 +01:00
committed by Brad King
parent 4308eb3d16
commit 57862079d8
2 changed files with 40 additions and 84 deletions

View File

@@ -2,7 +2,6 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmDocumentation.h"
#include "cmAlgorithms.h"
#include "cmDocumentationEntry.h"
#include "cmDocumentationSection.h"
#include "cmRST.h"
@@ -55,11 +54,6 @@ cmDocumentation::cmDocumentation()
this->ShowGenerators = true;
}
cmDocumentation::~cmDocumentation()
{
cmDeleteAll(this->AllSections);
}
bool cmDocumentation::PrintVersion(std::ostream& os)
{
/* clang-format off */
@@ -174,20 +168,16 @@ void cmDocumentation::WarnFormFromFilename(
void cmDocumentation::addCommonStandardDocSections()
{
cmDocumentationSection* sec;
sec = new cmDocumentationSection("Options");
sec->Append(cmDocumentationStandardOptions);
this->AllSections["Options"] = sec;
cmDocumentationSection sec{ "Options" };
sec.Append(cmDocumentationStandardOptions);
this->AllSections.emplace("Options", std::move(sec));
}
void cmDocumentation::addCMakeStandardDocSections()
{
cmDocumentationSection* sec;
sec = new cmDocumentationSection("Generators");
sec->Append(cmDocumentationGeneratorsHeader);
this->AllSections["Generators"] = sec;
cmDocumentationSection sec{ "Generators" };
sec.Append(cmDocumentationGeneratorsHeader);
this->AllSections.emplace("Generators", std::move(sec));
}
void cmDocumentation::addCTestStandardDocSections()
@@ -199,11 +189,7 @@ void cmDocumentation::addCTestStandardDocSections()
void cmDocumentation::addCPackStandardDocSections()
{
cmDocumentationSection* sec;
sec = new cmDocumentationSection("Generators");
sec->Append(cmDocumentationGeneratorsHeader);
this->AllSections["Generators"] = sec;
addCMakeStandardDocSections();
}
bool cmDocumentation::CheckOptions(int argc, const char* const* argv,
@@ -364,85 +350,59 @@ void cmDocumentation::SetName(const std::string& name)
}
void cmDocumentation::SetSection(const char* name,
cmDocumentationSection* section)
cmDocumentationSection section)
{
if (this->AllSections.find(name) != this->AllSections.end()) {
delete this->AllSections[name];
}
this->AllSections[name] = section;
this->SectionAtName(name) = std::move(section);
}
void cmDocumentation::SetSection(const char* name,
std::vector<cmDocumentationEntry>& docs)
{
cmDocumentationSection* sec = new cmDocumentationSection(name);
sec->Append(docs);
this->SetSection(name, sec);
cmDocumentationSection sec{ name };
sec.Append(docs);
this->SetSection(name, std::move(sec));
}
void cmDocumentation::SetSection(const char* name, const char* docs[][2])
{
cmDocumentationSection* sec = new cmDocumentationSection(name);
sec->Append(docs);
this->SetSection(name, sec);
cmDocumentationSection sec{ name };
sec.Append(docs);
this->SetSection(name, std::move(sec));
}
void cmDocumentation::SetSections(
std::map<std::string, cmDocumentationSection*>& sections)
std::map<std::string, cmDocumentationSection> sections)
{
for (auto const& s : sections) {
this->SetSection(s.first.c_str(), s.second);
for (auto& s : sections) {
this->SetSection(s.first.c_str(), std::move(s.second));
}
}
cmDocumentationSection& cmDocumentation::SectionAtName(const char* name)
{
return this->AllSections.emplace(name, cmDocumentationSection{ name })
.first->second;
}
void cmDocumentation::PrependSection(const char* name, const char* docs[][2])
{
cmDocumentationSection* sec = nullptr;
if (this->AllSections.find(name) == this->AllSections.end()) {
sec = new cmDocumentationSection(name);
this->SetSection(name, sec);
} else {
sec = this->AllSections[name];
}
sec->Prepend(docs);
this->SectionAtName(name).Prepend(docs);
}
void cmDocumentation::PrependSection(const char* name,
std::vector<cmDocumentationEntry>& docs)
{
cmDocumentationSection* sec = nullptr;
if (this->AllSections.find(name) == this->AllSections.end()) {
sec = new cmDocumentationSection(name);
this->SetSection(name, sec);
} else {
sec = this->AllSections[name];
}
sec->Prepend(docs);
this->SectionAtName(name).Prepend(docs);
}
void cmDocumentation::AppendSection(const char* name, const char* docs[][2])
{
cmDocumentationSection* sec = nullptr;
if (this->AllSections.find(name) == this->AllSections.end()) {
sec = new cmDocumentationSection(name);
this->SetSection(name, sec);
} else {
sec = this->AllSections[name];
}
sec->Append(docs);
this->SectionAtName(name).Append(docs);
}
void cmDocumentation::AppendSection(const char* name,
std::vector<cmDocumentationEntry>& docs)
{
cmDocumentationSection* sec = nullptr;
if (this->AllSections.find(name) == this->AllSections.end()) {
sec = new cmDocumentationSection(name);
this->SetSection(name, sec);
} else {
sec = this->AllSections[name];
}
sec->Append(docs);
this->SectionAtName(name).Append(docs);
}
void cmDocumentation::AppendSection(const char* name,
@@ -625,11 +585,10 @@ bool cmDocumentation::PrintHelpListPolicies(std::ostream& os)
bool cmDocumentation::PrintHelpListGenerators(std::ostream& os)
{
std::map<std::string, cmDocumentationSection*>::iterator si;
si = this->AllSections.find("Generators");
const auto si = this->AllSections.find("Generators");
if (si != this->AllSections.end()) {
this->Formatter.SetIndent(" ");
this->Formatter.PrintSection(os, *si->second);
this->Formatter.PrintSection(os, si->second);
}
return true;
}
@@ -655,29 +614,27 @@ bool cmDocumentation::PrintHelpListVariables(std::ostream& os)
bool cmDocumentation::PrintUsage(std::ostream& os)
{
std::map<std::string, cmDocumentationSection*>::iterator si;
si = this->AllSections.find("Usage");
const auto si = this->AllSections.find("Usage");
if (si != this->AllSections.end()) {
this->Formatter.PrintSection(os, *si->second);
this->Formatter.PrintSection(os, si->second);
}
return true;
}
bool cmDocumentation::PrintHelp(std::ostream& os)
{
std::map<std::string, cmDocumentationSection*>::iterator si;
si = this->AllSections.find("Usage");
auto si = this->AllSections.find("Usage");
if (si != this->AllSections.end()) {
this->Formatter.PrintSection(os, *si->second);
this->Formatter.PrintSection(os, si->second);
}
si = this->AllSections.find("Options");
if (si != this->AllSections.end()) {
this->Formatter.PrintSection(os, *si->second);
this->Formatter.PrintSection(os, si->second);
}
if (this->ShowGenerators) {
si = this->AllSections.find("Generators");
if (si != this->AllSections.end()) {
this->Formatter.PrintSection(os, *si->second);
this->Formatter.PrintSection(os, si->second);
}
}
return true;

View File

@@ -6,13 +6,13 @@
#include "cmConfigure.h" // IWYU pragma: keep
#include "cmDocumentationFormatter.h"
#include "cmDocumentationSection.h"
#include <iosfwd>
#include <map>
#include <string>
#include <vector>
class cmDocumentationSection;
struct cmDocumentationEntry;
/** Class to generate documentation. */
@@ -21,8 +21,6 @@ class cmDocumentation : public cmDocumentationEnums
public:
cmDocumentation();
~cmDocumentation();
/**
* Check command line arguments for documentation options. Returns
* true if documentation options are found, and false otherwise.
@@ -52,11 +50,11 @@ public:
/** Set a section of the documentation. Typical sections include Name,
Usage, Description, Options */
void SetSection(const char* sectionName, cmDocumentationSection* section);
void SetSection(const char* sectionName, cmDocumentationSection section);
void SetSection(const char* sectionName,
std::vector<cmDocumentationEntry>& docs);
void SetSection(const char* sectionName, const char* docs[][2]);
void SetSections(std::map<std::string, cmDocumentationSection*>& sections);
void SetSections(std::map<std::string, cmDocumentationSection> sections);
/** Add the documentation to the beginning/end of the section */
void PrependSection(const char* sectionName, const char* docs[][2]);
@@ -110,7 +108,8 @@ private:
bool ShowGenerators;
std::string NameString;
std::map<std::string, cmDocumentationSection*> AllSections;
std::map<std::string, cmDocumentationSection> AllSections;
cmDocumentationSection& SectionAtName(const char* name);
std::string CurrentArgument;