Add template get() methods. Also, remove instances of the auto type.

This commit is contained in:
Jacob 2024-05-12 23:43:44 +02:00
parent 7fa001bcde
commit 8caa3d92eb
3 changed files with 69 additions and 10 deletions

View file

@ -321,6 +321,11 @@ namespace docpp {
* @return std::string The tag of the element * @return std::string The tag of the element
*/ */
std::string get(const int formatting = FORMATTING_NONE, const int tabc = 0) const; std::string get(const int formatting = FORMATTING_NONE, const int tabc = 0) const;
/**
* @brief Get the element in the form of a specific type.
* @return T The element in the form of a specific type
*/
template <typename T> T get(const int formatting = FORMATTING_NONE, const int tabc = 0) const;
/** /**
* @brief Get the tag of the element * @brief Get the tag of the element
@ -546,6 +551,11 @@ namespace docpp {
* @return std::string The section * @return std::string The section
*/ */
std::string get(const int formatting = FORMATTING_NONE, const int tabc = 0) const; std::string get(const int formatting = FORMATTING_NONE, const int tabc = 0) const;
/**
* @brief Get the element in the form of a specific type.
* @return T The element in the form of a specific type
*/
template <typename T> T get(const int formatting = FORMATTING_NONE, const int tabc = 0) const;
Section operator=(const Section& section); Section operator=(const Section& section);
void operator+=(const Element& element); void operator+=(const Element& element);
@ -582,6 +592,11 @@ namespace docpp {
* @return std::string The document * @return std::string The document
*/ */
std::string get(const int formatting = FORMATTING_NONE, const int tabc = 0) const; std::string get(const int formatting = FORMATTING_NONE, const int tabc = 0) const;
/**
* @brief Get the document in the form of a specific type.
* @return T The document in the form of a specific type
*/
template <typename T> T get(const int formatting = FORMATTING_NONE, const int tabc = 0) const;
/** /**
* @brief Get the section * @brief Get the section
@ -698,6 +713,9 @@ namespace docpp {
Property operator=(const std::pair<std::string, std::string>& property); Property operator=(const std::pair<std::string, std::string>& property);
}; };
/**
* @brief A class to represent the properties of a CSS element
*/
class Element { class Element {
private: private:
std::pair<std::string, std::vector<Property>> element{}; std::pair<std::string, std::vector<Property>> element{};
@ -849,6 +867,11 @@ namespace docpp {
* @return std::pair<std::string, std::vector<Property>> The element * @return std::pair<std::string, std::vector<Property>> The element
*/ */
std::string get(const int formatting = FORMATTING_NONE, const int tabc = 0) const; std::string get(const int formatting = FORMATTING_NONE, const int tabc = 0) const;
/**
* @brief Get the element in the form of a specific type.
* @return T The element in the form of a specific type
*/
template <typename T> T get(const int formatting = FORMATTING_NONE, const int tabc = 0) const;
/** /**
* @brief Get the tag of the element * @brief Get the tag of the element
* @return std::string The tag of the element * @return std::string The tag of the element
@ -1014,6 +1037,11 @@ namespace docpp {
* @return std::string The stylesheet * @return std::string The stylesheet
*/ */
std::string get(const int formatting = FORMATTING_NONE, const int tabc = 0) const; std::string get(const int formatting = FORMATTING_NONE, const int tabc = 0) const;
/**
* @brief Get the stylesheet in the form of a specific type.
* @return T The stylesheet in the form of a specific type
*/
template <typename T> T get(const int formatting = FORMATTING_NONE, const int tabc = 0) const;
Stylesheet operator=(const Stylesheet& stylesheet); Stylesheet operator=(const Stylesheet& stylesheet);
void operator+=(const Element& element); void operator+=(const Element& element);

View file

@ -204,7 +204,7 @@ std::string docpp::HTML::Element::get(const int formatting, const int tabc) cons
ret += "<" + this->tag; ret += "<" + this->tag;
for (const auto& it : this->properties.getProperties()) { for (const Property& it : this->properties.getProperties()) {
if (!it.getKey().compare("")) continue; if (!it.getKey().compare("")) continue;
if (!it.getValue().compare("")) continue; if (!it.getValue().compare("")) continue;
@ -228,6 +228,10 @@ std::string docpp::HTML::Element::get(const int formatting, const int tabc) cons
return std::move(ret); return std::move(ret);
} }
template <typename T> T docpp::HTML::Element::get(const int formatting, const int tabc) const {
return T(this->get(formatting, tabc));
}
std::string docpp::HTML::Element::getTag() const { std::string docpp::HTML::Element::getTag() const {
return this->tag; return this->tag;
} }
@ -332,7 +336,7 @@ void docpp::HTML::Section::erase(const size_type index) {
void docpp::HTML::Section::erase(const Section& section) { void docpp::HTML::Section::erase(const Section& section) {
for (size_type i{0}; i < this->size(); i++) { for (size_type i{0}; i < this->size(); i++) {
const auto it = this->getSections().at(i); const Section it = this->getSections().at(i);
if (it.get() == section.get()) { if (it.get() == section.get()) {
this->erase(i); this->erase(i);
@ -345,7 +349,7 @@ void docpp::HTML::Section::erase(const Section& section) {
void docpp::HTML::Section::erase(const Element& element) { void docpp::HTML::Section::erase(const Element& element) {
for (size_type i{0}; i < this->size(); i++) { for (size_type i{0}; i < this->size(); i++) {
const auto it = this->getElements().at(i); const Element it = this->getElements().at(i);
if (it.get() == element.get()) { if (it.get() == element.get()) {
this->erase(i); this->erase(i);
@ -389,7 +393,7 @@ docpp::HTML::Section docpp::HTML::Section::at_section(const size_type index) con
docpp::HTML::Section::size_type docpp::HTML::Section::find(const Element& element) { docpp::HTML::Section::size_type docpp::HTML::Section::find(const Element& element) {
for (size_type i{0}; i < this->size(); i++) { for (size_type i{0}; i < this->size(); i++) {
const auto it = this->getElements().at(i); const Element it = this->getElements().at(i);
if (it.get() == element.get()) { if (it.get() == element.get()) {
return i; return i;
@ -401,7 +405,7 @@ docpp::HTML::Section::size_type docpp::HTML::Section::find(const Element& elemen
docpp::HTML::Section::size_type docpp::HTML::Section::find(const Section& section) { docpp::HTML::Section::size_type docpp::HTML::Section::find(const Section& section) {
for (size_type i{0}; i < this->size(); i++) { for (size_type i{0}; i < this->size(); i++) {
const auto it = this->getSections().at(i); const Section it = this->getSections().at(i);
if (it.get() == section.get()) { if (it.get() == section.get()) {
return i; return i;
@ -412,7 +416,7 @@ docpp::HTML::Section::size_type docpp::HTML::Section::find(const Section& sectio
} }
docpp::HTML::Section::size_type docpp::HTML::Section::find(const std::string& str) { docpp::HTML::Section::size_type docpp::HTML::Section::find(const std::string& str) {
const auto elements = this->getElements(); const std::vector<Element> elements = this->getElements();
for (size_type i{0}; i < elements.size(); i++) { for (size_type i{0}; i < elements.size(); i++) {
if (!elements.at(i).get().compare(str)) { if (!elements.at(i).get().compare(str)) {
@ -420,7 +424,7 @@ docpp::HTML::Section::size_type docpp::HTML::Section::find(const std::string& st
} }
} }
const auto sections = this->getSections(); const std::vector<Section> sections = this->getSections();
for (size_type i{0}; i < sections.size(); i++) { for (size_type i{0}; i < sections.size(); i++) {
if (!sections.at(i).get().compare(str)) { if (!sections.at(i).get().compare(str)) {
@ -512,7 +516,7 @@ std::string docpp::HTML::Section::get(const int formatting, const int tabc) cons
if (this->tag.compare("")) { if (this->tag.compare("")) {
ret += "<" + this->tag; ret += "<" + this->tag;
for (const auto& it : this->properties.getProperties()) { for (const Property& it : this->properties.getProperties()) {
if (!it.getKey().compare("")) continue; if (!it.getKey().compare("")) continue;
if (!it.getValue().compare("")) continue; if (!it.getValue().compare("")) continue;
@ -549,6 +553,10 @@ std::string docpp::HTML::Section::get(const int formatting, const int tabc) cons
return std::move(ret); return std::move(ret);
} }
template <typename T> T docpp::HTML::Section::get(const int formatting, const int tabc) const {
return T(this->get(formatting, tabc));
}
void docpp::HTML::Section::swap(const size_type index1, const size_type index2) { void docpp::HTML::Section::swap(const size_type index1, const size_type index2) {
if (this->elements.find(index1) != this->elements.end() && this->elements.find(index2) != this->elements.end()) { if (this->elements.find(index1) != this->elements.end() && this->elements.find(index2) != this->elements.end()) {
std::swap(this->elements[index1], this->elements[index2]); std::swap(this->elements[index1], this->elements[index2]);
@ -571,6 +579,10 @@ std::string docpp::HTML::Document::get(const int formatting, const int tabc) con
return this->doctype + (formatting == FORMATTING_PRETTY ? "\n" : formatting == FORMATTING_NEWLINE ? "\n" : "") + this->document.get(formatting, tabc); return this->doctype + (formatting == FORMATTING_PRETTY ? "\n" : formatting == FORMATTING_NEWLINE ? "\n" : "") + this->document.get(formatting, tabc);
} }
template <typename T> T docpp::HTML::Document::get(const int formatting, const int tabc) const {
return T(this->get(formatting, tabc));
}
docpp::HTML::Section& docpp::HTML::Document::getSection() { docpp::HTML::Section& docpp::HTML::Document::getSection() {
return this->document; return this->document;
} }
@ -765,7 +777,7 @@ std::string docpp::CSS::Element::get(const int formatting, const int tabc) const
ret += "\n"; ret += "\n";
} }
for (const auto& it : this->element.second) { for (const Property& it : this->element.second) {
if (!it.getKey().compare("")) continue; if (!it.getKey().compare("")) continue;
if (!it.getValue().compare("")) continue; if (!it.getValue().compare("")) continue;
@ -792,6 +804,10 @@ std::string docpp::CSS::Element::get(const int formatting, const int tabc) const
return std::move(ret); return std::move(ret);
} }
template <typename T> T docpp::CSS::Element::get(const int formatting, const int tabc) const {
return T(this->get(formatting, tabc));
}
std::string docpp::CSS::Element::getTag() const { std::string docpp::CSS::Element::getTag() const {
return this->element.first; return this->element.first;
} }
@ -904,9 +920,13 @@ std::vector<docpp::CSS::Element> docpp::CSS::Stylesheet::getElements() const {
std::string docpp::CSS::Stylesheet::get(const int formatting, const int tabc) const { std::string docpp::CSS::Stylesheet::get(const int formatting, const int tabc) const {
std::string ret{}; std::string ret{};
for (const auto& it : this->elements) { for (const Element& it : this->elements) {
ret += it.get(formatting, tabc); ret += it.get(formatting, tabc);
} }
return std::move(ret); return std::move(ret);
} }
template <typename T> T docpp::CSS::Stylesheet::get(const int formatting, const int tabc) const {
return T(this->get(formatting, tabc));
}

View file

@ -373,6 +373,16 @@ SCENARIO("Test HTML", "[HTML]") {
REQUIRE(caught); REQUIRE(caught);
}; };
const auto test23 = []() {
docpp::HTML::Section sect{};
sect.push_back(docpp::HTML::Element("p", {}, "Test 1"));
sect.push_back(docpp::HTML::Element("p", {}, "Test 2"));
sect.push_back(docpp::HTML::Element("p", {}, "Test 3"));
REQUIRE(sect.get<std::string>() == "<p>Test 1</p><p>Test 2</p><p>Test 3</p>");
};
std::vector<void (*)()> tests{ std::vector<void (*)()> tests{
test1, test1,
test2, test2,
@ -396,6 +406,7 @@ SCENARIO("Test HTML", "[HTML]") {
test20, test20,
test21, test21,
test22, test22,
test23,
}; };
for (const auto& test : tests) { for (const auto& test : tests) {