29 #include <shared_mutex>
37 using Parameters = std::map<std::string, std::string>;
75 static std::string
normalize(
const std::string& route) {
76 std::string s = route.substr(0, route.find(
"?"));
77 std::filesystem::path p(s);
78 if (!p.is_absolute()) {
81 s = p.lexically_normal().string();
82 s = s.substr(0, s.find_last_not_of(
"/. \n\t\r") + 1);
96 auto is_illegal = [](
char c) ->
bool {
97 return !(isalnum(c) || c ==
'_' || c ==
'-' || c ==
'.');
99 return std::find_if(s.begin(), s.end(), is_illegal) == s.end();
108 std::string
resolve(
const std::string& route)
const {
110 std::shared_lock read_lock(access_);
112 if (routes_.count(key)) {
117 std::filesystem::path p(key);
118 while (!routes_.count(p.string())) {
119 if (p.string() ==
"/") {
132 std::unique_lock write_lock(access_);
133 backtrack_ = enabled;
141 std::vector<std::string> routes()
const {
142 std::vector<std::string> vs;
143 std::shared_lock read_lock(access_);
144 for (
const auto& kv : routes_) {
145 if (kv.first.empty()) {
148 vs.push_back(kv.first);
153 bool has(
const std::string& route)
const {
155 std::shared_lock read_lock(access_);
156 return routes_.count(key) != 0;
159 void add(
const std::string& route, T val) {
161 std::unique_lock write_lock(access_);
162 if (routes_.count(key)) {
163 throw std::runtime_error(
"route already exists");
168 void set(
const std::string& route, T val) {
170 std::unique_lock write_lock(access_);
180 std::pair<T, Parameters>
get(
const std::string& route)
const {
183 std::shared_lock read_lock(access_);
184 return std::make_pair(routes_.at(key), p);
187 void set_unsafe(
const std::string& key, T val) {
188 std::unique_lock write_lock(access_);
192 std::pair<T, Parameters> get_unsafe(
const std::string& key)
const {
194 std::shared_lock read_lock(access_);
195 return std::make_pair(routes_.at(key), p);
200 bool backtrack_ =
false;
203 std::map<std::string, T> routes_;
204 mutable std::shared_mutex access_;
Definition: route_muxer.hpp:61
static bool is_identifier(const std::string &s)
Definition: route_muxer.hpp:95
std::string resolve(const std::string &route) const
Definition: route_muxer.hpp:108
static std::string normalize(const std::string &route)
Definition: route_muxer.hpp:75
void set_default(T def)
Definition: route_muxer.hpp:139
std::pair< T, Parameters > get(const std::string &route) const
Definition: route_muxer.hpp:180
void set_backtrack(bool enabled)
Definition: route_muxer.hpp:131