Skip to content

Commit 7a5aa97

Browse files
committed
[http_server] Use pure data wrapper other than an impl instance
...because the function forwardings to the impl are redundant.
1 parent 3e79e2e commit 7a5aa97

File tree

3 files changed

+88
-124
lines changed

3 files changed

+88
-124
lines changed

libraries/http_server/http_server/dynamic_routing_table.hh

+18-30
Original file line numberDiff line numberDiff line change
@@ -117,28 +117,14 @@ template <typename V> struct drt_node {
117117
drt_node_pool<drt_node>& pool_;
118118
};
119119

120-
template <typename V> struct dynamic_routing_table_impl {
121-
dynamic_routing_table_impl() noexcept : root(pool) {}
120+
template <typename V> struct dynamic_routing_table_data {
121+
dynamic_routing_table_data() noexcept : root(pool_) {}
122122

123-
auto& operator[](const std::string_view& r) {
124-
auto [itr, is_inserted] = strings.emplace(std::string(r));
125-
std::string_view r2(*itr);
126-
return root.find_or_create(r2, 0);
127-
}
128-
auto& operator[](const std::string& s) {
129-
auto [itr, is_inserted] = strings.emplace(s);
130-
std::string_view r(*itr);
131-
return root.find_or_create(r, 0);
132-
}
133-
134-
auto find(const std::string_view& r) const noexcept { return root.find(r, 0); }
135-
136-
template <typename F> void for_all_routes(F f) const { root.for_all_routes(f); }
137-
auto end() const noexcept { return root.end(); }
138-
139-
std::unordered_set<std::string> strings;
140-
drt_node_pool<drt_node<V>> pool;
123+
std::unordered_set<std::string> paths;
141124
drt_node<V> root;
125+
126+
private:
127+
drt_node_pool<drt_node<V>> pool_;
142128
};
143129
} // namespace internal
144130

@@ -147,25 +133,27 @@ template <typename V> struct dynamic_routing_table_impl {
147133
*/
148134
template <typename V> struct dynamic_routing_table {
149135
dynamic_routing_table() noexcept
150-
: impl_(std::make_shared<internal::dynamic_routing_table_impl<V>>()) {}
151-
dynamic_routing_table(const dynamic_routing_table& other) noexcept : impl_(other.impl_) {}
136+
: data_(std::make_shared<internal::dynamic_routing_table_data<V>>()) {}
137+
dynamic_routing_table(const dynamic_routing_table& other) noexcept : data_(other.data_) {}
152138

153139
dynamic_routing_table& operator=(const dynamic_routing_table& other) noexcept {
154140
if (this != &other) {
155-
impl_ = other.impl_;
141+
data_ = other.data_;
156142
}
157143
return *this;
158144
}
159145

160-
auto& operator[](const std::string_view& r) { return impl_->operator[](r); }
161-
auto& operator[](const std::string& s) { return impl_->operator[](s); }
162-
163-
auto find(const std::string_view& r) const noexcept { return impl_->find(r); }
164-
template <typename F> void for_all_routes(F f) const { impl_->for_all_routes(f); }
165-
auto end() const noexcept { return impl_->end(); }
146+
auto& operator[](const std::string_view& r) { return this->operator[](std::string(r)); }
147+
auto& operator[](const std::string& s) {
148+
auto [itr, is_inserted] = data_->paths.emplace(s);
149+
return data_->root.find_or_create(*itr, 0);
150+
}
151+
auto find(const std::string_view& r) const noexcept { return data_->root.find(r, 0); }
152+
template <typename F> void for_all_routes(F f) const { data_->root.for_all_routes(f); }
153+
auto end() const noexcept { return data_->root.end(); }
166154

167155
private:
168-
std::shared_ptr<internal::dynamic_routing_table_impl<V>> impl_;
156+
std::shared_ptr<internal::dynamic_routing_table_data<V>> data_;
169157
};
170158

171159
} // namespace li

single_headers/lithium.hh

+35-47
Original file line numberDiff line numberDiff line change
@@ -6514,9 +6514,11 @@ namespace li {
65146514

65156515
namespace internal {
65166516

6517-
// A simple memory pool for drt_node objects
6517+
/**
6518+
* A memory pool for drt_node objects that manages node allocation and lifetime
6519+
*/
65186520
template <typename T> struct drt_node_pool {
6519-
template <typename... Args> T* allocate(Args&&... args) {
6521+
template <typename... Args> T* allocate(Args&&... args) noexcept {
65206522
auto new_node = std::make_unique<T>(std::forward<Args>(args)...);
65216523
T* ptr = new_node.get();
65226524
pool_.emplace_back(std::move(new_node));
@@ -6527,20 +6529,20 @@ template <typename T> struct drt_node_pool {
65276529
};
65286530

65296531
template <typename V> struct drt_node {
6530-
drt_node() : pool_(nullptr), v_{0, nullptr} {}
6531-
drt_node(drt_node_pool<drt_node>& pool) : pool_(pool), v_{0, nullptr} {}
6532+
drt_node() noexcept : pool_(nullptr), v_{0, nullptr} {}
6533+
drt_node(drt_node_pool<drt_node>& pool) noexcept : pool_(pool), v_{0, nullptr} {}
65326534

65336535
struct iterator {
65346536
const drt_node<V>* ptr;
65356537
std::string_view first;
65366538
V second;
65376539

6538-
auto operator->() { return this; }
6539-
bool operator==(const iterator& b) const { return this->ptr == b.ptr; }
6540-
bool operator!=(const iterator& b) const { return this->ptr != b.ptr; }
6540+
auto operator->() noexcept { return this; }
6541+
bool operator==(const iterator& b) const noexcept { return this->ptr == b.ptr; }
6542+
bool operator!=(const iterator& b) const noexcept { return this->ptr != b.ptr; }
65416543
};
65426544

6543-
auto end() const { return iterator{nullptr, std::string_view(), V()}; }
6545+
auto end() const noexcept { return iterator{nullptr, std::string_view(), V()}; }
65446546

65456547
auto& find_or_create(std::string_view r, unsigned int c) {
65466548
if (c == r.size())
@@ -6571,7 +6573,7 @@ template <typename V> struct drt_node {
65716573
}
65726574

65736575
// Find a route.
6574-
iterator find(const std::string_view& r, unsigned int c) const {
6576+
iterator find(const std::string_view& r, unsigned int c) const noexcept {
65756577
// We found the route r.
65766578
if ((c == r.size() and v_.handler != nullptr) or (children_.size() == 0))
65776579
return iterator{this, r, v_};
@@ -6618,57 +6620,43 @@ template <typename V> struct drt_node {
66186620
drt_node_pool<drt_node>& pool_;
66196621
};
66206622

6621-
template <typename V> struct dynamic_routing_table_impl {
6622-
dynamic_routing_table_impl() : root(pool) {}
6623+
template <typename V> struct dynamic_routing_table_data {
6624+
dynamic_routing_table_data() noexcept : root(pool_) {}
66236625

6624-
// Find a route and return reference to a procedure.
6625-
auto& operator[](const std::string_view& r) {
6626-
auto [itr, is_inserted] = strings.emplace(std::string(r));
6627-
std::string_view r2(*itr);
6628-
return root.find_or_create(r2, 0);
6629-
}
6630-
auto& operator[](const std::string& s) {
6631-
auto [itr, is_inserted] = strings.emplace(s);
6632-
std::string_view r(*itr);
6633-
return root.find_or_create(r, 0);
6634-
}
6635-
6636-
// Find a route and return an iterator.
6637-
auto find(const std::string_view& r) const { return root.find(r, 0); }
6638-
6639-
template <typename F> void for_all_routes(F f) const { root.for_all_routes(f); }
6640-
auto end() const { return root.end(); }
6641-
6642-
std::unordered_set<std::string> strings;
6643-
drt_node_pool<drt_node<V>> pool;
6626+
std::unordered_set<std::string> paths;
66446627
drt_node<V> root;
6628+
6629+
private:
6630+
drt_node_pool<drt_node<V>> pool_;
66456631
};
66466632
} // namespace internal
66476633

6634+
/**
6635+
* A dynamic routing table that supports route registration and lookup.
6636+
*/
66486637
template <typename V> struct dynamic_routing_table {
6649-
dynamic_routing_table() : impl_(std::make_shared<internal::dynamic_routing_table_impl<V>>()) {}
6650-
dynamic_routing_table(const dynamic_routing_table& other) : impl_(other.impl_) {}
6638+
dynamic_routing_table() noexcept
6639+
: data_(std::make_shared<internal::dynamic_routing_table_data<V>>()) {}
6640+
dynamic_routing_table(const dynamic_routing_table& other) noexcept : data_(other.data_) {}
66516641

6652-
// Assignment operator
6653-
dynamic_routing_table& operator=(const dynamic_routing_table& other) {
6642+
dynamic_routing_table& operator=(const dynamic_routing_table& other) noexcept {
66546643
if (this != &other) {
6655-
impl_ = other.impl_;
6644+
data_ = other.data_;
66566645
}
66576646
return *this;
66586647
}
66596648

6660-
// Find a route and return reference to a procedure.
6661-
auto& operator[](const std::string_view& r) { return impl_->operator[](r); }
6662-
auto& operator[](const std::string& s) { return impl_->operator[](s); }
6663-
6664-
// Find a route and return an iterator.
6665-
auto find(const std::string_view& r) const { return impl_->find(r); }
6666-
6667-
template <typename F> void for_all_routes(F f) const { impl_->for_all_routes(f); }
6668-
auto end() const { return impl_->end(); }
6649+
auto& operator[](const std::string_view& r) { return this->operator[](std::string(r)); }
6650+
auto& operator[](const std::string& s) {
6651+
auto [itr, is_inserted] = data_->paths.emplace(s);
6652+
return data_->root.find_or_create(*itr, 0);
6653+
}
6654+
auto find(const std::string_view& r) const noexcept { return data_->root.find(r, 0); }
6655+
template <typename F> void for_all_routes(F f) const { data_->root.for_all_routes(f); }
6656+
auto end() const noexcept { return data_->root.end(); }
66696657

6670-
private:
6671-
std::shared_ptr<internal::dynamic_routing_table_impl<V>> impl_;
6658+
private:
6659+
std::shared_ptr<internal::dynamic_routing_table_data<V>> data_;
66726660
};
66736661

66746662
} // namespace li

single_headers/lithium_http_server.hh

+35-47
Original file line numberDiff line numberDiff line change
@@ -3331,9 +3331,11 @@ namespace li {
33313331

33323332
namespace internal {
33333333

3334-
// A simple memory pool for drt_node objects
3334+
/**
3335+
* A memory pool for drt_node objects that manages node allocation and lifetime
3336+
*/
33353337
template <typename T> struct drt_node_pool {
3336-
template <typename... Args> T* allocate(Args&&... args) {
3338+
template <typename... Args> T* allocate(Args&&... args) noexcept {
33373339
auto new_node = std::make_unique<T>(std::forward<Args>(args)...);
33383340
T* ptr = new_node.get();
33393341
pool_.emplace_back(std::move(new_node));
@@ -3344,20 +3346,20 @@ template <typename T> struct drt_node_pool {
33443346
};
33453347

33463348
template <typename V> struct drt_node {
3347-
drt_node() : pool_(nullptr), v_{0, nullptr} {}
3348-
drt_node(drt_node_pool<drt_node>& pool) : pool_(pool), v_{0, nullptr} {}
3349+
drt_node() noexcept : pool_(nullptr), v_{0, nullptr} {}
3350+
drt_node(drt_node_pool<drt_node>& pool) noexcept : pool_(pool), v_{0, nullptr} {}
33493351

33503352
struct iterator {
33513353
const drt_node<V>* ptr;
33523354
std::string_view first;
33533355
V second;
33543356

3355-
auto operator->() { return this; }
3356-
bool operator==(const iterator& b) const { return this->ptr == b.ptr; }
3357-
bool operator!=(const iterator& b) const { return this->ptr != b.ptr; }
3357+
auto operator->() noexcept { return this; }
3358+
bool operator==(const iterator& b) const noexcept { return this->ptr == b.ptr; }
3359+
bool operator!=(const iterator& b) const noexcept { return this->ptr != b.ptr; }
33583360
};
33593361

3360-
auto end() const { return iterator{nullptr, std::string_view(), V()}; }
3362+
auto end() const noexcept { return iterator{nullptr, std::string_view(), V()}; }
33613363

33623364
auto& find_or_create(std::string_view r, unsigned int c) {
33633365
if (c == r.size())
@@ -3388,7 +3390,7 @@ template <typename V> struct drt_node {
33883390
}
33893391

33903392
// Find a route.
3391-
iterator find(const std::string_view& r, unsigned int c) const {
3393+
iterator find(const std::string_view& r, unsigned int c) const noexcept {
33923394
// We found the route r.
33933395
if ((c == r.size() and v_.handler != nullptr) or (children_.size() == 0))
33943396
return iterator{this, r, v_};
@@ -3435,57 +3437,43 @@ template <typename V> struct drt_node {
34353437
drt_node_pool<drt_node>& pool_;
34363438
};
34373439

3438-
template <typename V> struct dynamic_routing_table_impl {
3439-
dynamic_routing_table_impl() : root(pool) {}
3440+
template <typename V> struct dynamic_routing_table_data {
3441+
dynamic_routing_table_data() noexcept : root(pool_) {}
34403442

3441-
// Find a route and return reference to a procedure.
3442-
auto& operator[](const std::string_view& r) {
3443-
auto [itr, is_inserted] = strings.emplace(std::string(r));
3444-
std::string_view r2(*itr);
3445-
return root.find_or_create(r2, 0);
3446-
}
3447-
auto& operator[](const std::string& s) {
3448-
auto [itr, is_inserted] = strings.emplace(s);
3449-
std::string_view r(*itr);
3450-
return root.find_or_create(r, 0);
3451-
}
3452-
3453-
// Find a route and return an iterator.
3454-
auto find(const std::string_view& r) const { return root.find(r, 0); }
3455-
3456-
template <typename F> void for_all_routes(F f) const { root.for_all_routes(f); }
3457-
auto end() const { return root.end(); }
3458-
3459-
std::unordered_set<std::string> strings;
3460-
drt_node_pool<drt_node<V>> pool;
3443+
std::unordered_set<std::string> paths;
34613444
drt_node<V> root;
3445+
3446+
private:
3447+
drt_node_pool<drt_node<V>> pool_;
34623448
};
34633449
} // namespace internal
34643450

3451+
/**
3452+
* A dynamic routing table that supports route registration and lookup.
3453+
*/
34653454
template <typename V> struct dynamic_routing_table {
3466-
dynamic_routing_table() : impl_(std::make_shared<internal::dynamic_routing_table_impl<V>>()) {}
3467-
dynamic_routing_table(const dynamic_routing_table& other) : impl_(other.impl_) {}
3455+
dynamic_routing_table() noexcept
3456+
: data_(std::make_shared<internal::dynamic_routing_table_data<V>>()) {}
3457+
dynamic_routing_table(const dynamic_routing_table& other) noexcept : data_(other.data_) {}
34683458

3469-
// Assignment operator
3470-
dynamic_routing_table& operator=(const dynamic_routing_table& other) {
3459+
dynamic_routing_table& operator=(const dynamic_routing_table& other) noexcept {
34713460
if (this != &other) {
3472-
impl_ = other.impl_;
3461+
data_ = other.data_;
34733462
}
34743463
return *this;
34753464
}
34763465

3477-
// Find a route and return reference to a procedure.
3478-
auto& operator[](const std::string_view& r) { return impl_->operator[](r); }
3479-
auto& operator[](const std::string& s) { return impl_->operator[](s); }
3480-
3481-
// Find a route and return an iterator.
3482-
auto find(const std::string_view& r) const { return impl_->find(r); }
3483-
3484-
template <typename F> void for_all_routes(F f) const { impl_->for_all_routes(f); }
3485-
auto end() const { return impl_->end(); }
3466+
auto& operator[](const std::string_view& r) { return this->operator[](std::string(r)); }
3467+
auto& operator[](const std::string& s) {
3468+
auto [itr, is_inserted] = data_->paths.emplace(s);
3469+
return data_->root.find_or_create(*itr, 0);
3470+
}
3471+
auto find(const std::string_view& r) const noexcept { return data_->root.find(r, 0); }
3472+
template <typename F> void for_all_routes(F f) const { data_->root.for_all_routes(f); }
3473+
auto end() const noexcept { return data_->root.end(); }
34863474

3487-
private:
3488-
std::shared_ptr<internal::dynamic_routing_table_impl<V>> impl_;
3475+
private:
3476+
std::shared_ptr<internal::dynamic_routing_table_data<V>> data_;
34893477
};
34903478

34913479
} // namespace li

0 commit comments

Comments
 (0)