Decentralised Art Server
High-performance C++ backend that exposes HTML interface and a secure REST API for managing Performative Transactions entities
 
Loading...
Searching...
No Matches
utils.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <sstream>
4#include <cstdlib>
5#include <cstdint>
6#include <iomanip>
7#include <chrono>
8#include <format>
9#include <string>
10#include <fstream>
11#include <filesystem>
12#include <functional>
13
14#include "native.h"
15#include <asio.hpp>
16
17#include "logo.hpp"
18
19#include <spdlog/spdlog.h>
20#include <absl/container/flat_hash_map.h>
21#include <absl/container/flat_hash_set.h>
22
23#define STRINGIFY(x) #x
24#define TOSTRING(x) STRINGIFY(x)
25
26namespace dcn::utils
27{
28 std::string loadBuildTimestamp(const std::filesystem::path & path);
29
30 std::string currentTimestamp();
31
41 asio::awaitable<void> watchdog(std::chrono::steady_clock::time_point& deadline);
42
43 asio::awaitable<void> ensureOnStrand(const asio::strand<asio::io_context::executor_type> & strand);
44
45 template<class DataT, class ChildT, template<typename...> class ChildListT>
46 std::vector<std::string> topologicalSort(
47 const absl::flat_hash_map<std::string, DataT> & data,
48 std::function<ChildListT<ChildT>(const DataT &)> get_childreen,
49 std::function<std::string(const ChildT &)> get_child_name)
50 {
51 std::vector<std::string> sorted;
52 absl::flat_hash_set<std::string> visited;
53 absl::flat_hash_set<std::string> on_stack;
54
55 std::function<void(const std::string&)> visit = [&](const std::string& name) {
56 if (visited.contains(name)) return;
57 if (on_stack.contains(name)) {
58 spdlog::error(std::format("Cycle detected involving : {}", name));
59 throw std::runtime_error("Cyclic dependency");
60 }
61
62 on_stack.insert(name);
63
64 auto it = data.find(name);
65 if (it == data.end()) {
66 spdlog::warn(std::format("Missing dependency: {}", name));
67 on_stack.erase(name);
68 return;
69 }
70
71 std::string child_name;
72 for (const auto& child : get_childreen(it->second))
73 {
74 child_name = get_child_name(child);
75 if(child_name.empty()) continue;
76 visit(child_name);
77 }
78
79 visited.insert(name);
80 on_stack.erase(name);
81 sorted.push_back(name);
82 };
83
84 // perform the sort
85 for (const auto& [name, _] : data) {
86 visit(name);
87 }
88
89 return sorted;
90 }
91
92 bool equalsIgnoreCase(const std::string& a, const std::string& b);
93}
Definition logo.hpp:6
std::string currentTimestamp()
Definition utils.cpp:14
std::vector< std::string > topologicalSort(const absl::flat_hash_map< std::string, DataT > &data, std::function< ChildListT< ChildT >(const DataT &)> get_childreen, std::function< std::string(const ChildT &)> get_child_name)
Definition utils.hpp:46
asio::awaitable< void > watchdog(std::chrono::steady_clock::time_point &deadline)
Suspends the coroutine until the given deadline is reached.
Definition utils.cpp:24
asio::awaitable< void > ensureOnStrand(const asio::strand< asio::io_context::executor_type > &strand)
Definition utils.cpp:37
bool equalsIgnoreCase(const std::string &a, const std::string &b)
Definition utils.cpp:46
std::string loadBuildTimestamp(const std::filesystem::path &path)
Definition utils.cpp:5