srctree

Robin Linden parent 1e0bdb63 8f54d266
util: Move the overloaded visitor helper to a new target

inlinesplit
dom/BUILD added: 75, removed: 43, total 32
@@ -5,7 +5,10 @@ cc_library(
srcs = ["dom.cpp"],
hdrs = ["dom.h"],
visibility = ["//visibility:public"],
deps = ["@range-v3"],
deps = [
"//util:overloaded",
"@range-v3",
],
)
 
cc_test(
 
dom/dom.cpp added: 75, removed: 43, total 32
@@ -4,6 +4,8 @@
 
#include "dom/dom.h"
 
#include "util/overloaded.h"
 
#include <range/v3/action/push_back.hpp>
#include <range/v3/view/remove_if.hpp>
#include <range/v3/view/transform.hpp>
@@ -18,20 +20,11 @@
namespace dom {
namespace {
 
template<class... Ts>
struct Overloaded : Ts... {
using Ts::operator()...;
};
 
// Not needed as of C++20, but gcc 10 won't work without it.
template<class... Ts>
Overloaded(Ts...) -> Overloaded<Ts...>;
 
void print_node(dom::Node const &node, std::ostream &os, uint8_t depth = 0) {
for (int8_t i = 0; i < depth; ++i) {
os << " ";
}
std::visit(Overloaded{
std::visit(util::Overloaded{
[&os, depth](dom::Element const &element) {
os << "tag: " << element.name << '\n';
for (auto const &child : element.children) {
 
html2/BUILD added: 75, removed: 43, total 32
@@ -10,6 +10,7 @@ cc_library(
visibility = ["//visibility:public"],
deps = [
"//dom2",
"//util:overloaded",
"//util:string",
"//util:unicode",
"@spdlog",
 
html2/token.cpp added: 75, removed: 43, total 32
@@ -4,6 +4,8 @@
 
#include "html2/token.h"
 
#include "util/overloaded.h"
 
#include <optional>
#include <ostream>
#include <sstream>
@@ -11,18 +13,6 @@
#include <variant>
 
namespace html2 {
namespace {
 
template<class... Ts>
struct Overloaded : Ts... {
using Ts::operator()...;
};
 
// Not needed as of C++20, but gcc 10 won't work without it.
template<class... Ts>
Overloaded(Ts...) -> Overloaded<Ts...>;
 
} // namespace
 
std::string to_string(Token const &token) {
auto try_print = []<typename T>(std::ostream &os, std::optional<T> maybe_value) {
@@ -34,7 +24,7 @@ std::string to_string(Token const &token) {
};
 
std::stringstream ss;
std::visit(Overloaded{
std::visit(util::Overloaded{
[&](DoctypeToken const &t) {
ss << "Doctype";
try_print(ss, t.name);
 
layout/BUILD added: 75, removed: 43, total 32
@@ -8,6 +8,7 @@ cc_library(
deps = [
"//geom",
"//style",
"//util:overloaded",
],
)
 
 
layout/layout.cpp added: 75, removed: 43, total 32
@@ -5,6 +5,8 @@
 
#include "layout/layout.h"
 
#include "util/overloaded.h"
 
#include <algorithm>
#include <cassert>
#include <charconv>
@@ -22,22 +24,13 @@ namespace {
constexpr int kDefaultFontSizePx = 10;
constexpr std::string_view kDefaultFontSize{"10px"};
 
template<class... Ts>
struct Overloaded : Ts... {
using Ts::operator()...;
};
 
// Not needed as of C++20, but gcc 10 won't work without it.
template<class... Ts>
Overloaded(Ts...) -> Overloaded<Ts...>;
 
bool last_node_was_anonymous(LayoutBox const &box) {
return !box.children.empty() && box.children.back().type == LayoutType::AnonymousBlock;
}
 
// https://www.w3.org/TR/CSS2/visuren.html#box-gen
std::optional<LayoutBox> create_tree(style::StyledNode const &node) {
auto visitor = Overloaded{
auto visitor = util::Overloaded{
[&node](dom::Element const &) -> std::optional<LayoutBox> {
auto display = style::get_property(node, "display");
if (display && *display == "none") {
@@ -274,7 +267,7 @@ std::string_view to_str(LayoutType type) {
}
 
std::string_view to_str(dom::Node const &node) {
return std::visit(Overloaded{
return std::visit(util::Overloaded{
[](dom::Element const &element) -> std::string_view { return element.name; },
[](dom::Text const &text) -> std::string_view { return text.text; },
},
 
filename was Deleted added: 75, removed: 43, total 32
@@ -0,0 +1,21 @@
// SPDX-FileCopyrightText: 2021 Robin Lindén <dev@robinlinden.eu>
//
// SPDX-License-Identifier: BSD-2-Clause
 
#ifndef UTIL_OVERLOADED_H_
#define UTIL_OVERLOADED_H_
 
namespace util {
 
template<class... Ts>
struct Overloaded : Ts... {
using Ts::operator()...;
};
 
// Not needed as of C++20, but gcc 10 won't work without it.
template<class... Ts>
Overloaded(Ts...) -> Overloaded<Ts...>;
 
} // namespace util
 
#endif
 
filename was Deleted added: 75, removed: 43, total 32
@@ -0,0 +1,30 @@
// SPDX-FileCopyrightText: 2022 Robin Lindén <dev@robinlinden.eu>
//
// SPDX-License-Identifier: BSD-2-Clause
 
#include "util/overloaded.h"
 
#include "etest/etest.h"
 
#include <string_view>
#include <variant>
 
using namespace std::literals;
using etest::expect_eq;
using util::Overloaded;
 
int main() {
etest::test("it does what it should", [] {
auto visitor = Overloaded{
[](bool) { return "bool"sv; },
[](int) { return "int"sv; },
[](long) { return "long"sv; },
};
 
expect_eq("bool"sv, std::visit(visitor, std::variant<bool>(true)));
expect_eq("int"sv, std::visit(visitor, std::variant<int>(1)));
expect_eq("long"sv, std::visit(visitor, std::variant<long>(1L)));
});
 
return etest::run_all_tests();
}