Skip to content

Commit 1966842

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 7f74880 commit 1966842

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

Lines changed: 18 additions & 30 deletions
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

Lines changed: 35 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -6511,9 +6511,11 @@ namespace li {
65116511

65126512
namespace internal {
65136513

6514-
// A simple memory pool for drt_node objects
6514+
/**
6515+
* A memory pool for drt_node objects that manages node allocation and lifetime
6516+
*/
65156517
template <typename T> struct drt_node_pool {
6516-
template <typename... Args> T* allocate(Args&&... args) {
6518+
template <typename... Args> T* allocate(Args&&... args) noexcept {
65176519
auto new_node = std::make_unique<T>(std::forward<Args>(args)...);
65186520
T* ptr = new_node.get();
65196521
pool_.emplace_back(std::move(new_node));
@@ -6524,20 +6526,20 @@ template <typename T> struct drt_node_pool {
65246526
};
65256527

65266528
template <typename V> struct drt_node {
6527-
drt_node() : pool_(nullptr), v_{0, nullptr} {}
6528-
drt_node(drt_node_pool<drt_node>& pool) : pool_(pool), v_{0, nullptr} {}
6529+
drt_node() noexcept : pool_(nullptr), v_{0, nullptr} {}
6530+
drt_node(drt_node_pool<drt_node>& pool) noexcept : pool_(pool), v_{0, nullptr} {}
65296531

65306532
struct iterator {
65316533
const drt_node<V>* ptr;
65326534
std::string_view first;
65336535
V second;
65346536

6535-
auto operator->() { return this; }
6536-
bool operator==(const iterator& b) const { return this->ptr == b.ptr; }
6537-
bool operator!=(const iterator& b) const { return this->ptr != b.ptr; }
6537+
auto operator->() noexcept { return this; }
6538+
bool operator==(const iterator& b) const noexcept { return this->ptr == b.ptr; }
6539+
bool operator!=(const iterator& b) const noexcept { return this->ptr != b.ptr; }
65386540
};
65396541

6540-
auto end() const { return iterator{nullptr, std::string_view(), V()}; }
6542+
auto end() const noexcept { return iterator{nullptr, std::string_view(), V()}; }
65416543

65426544
auto& find_or_create(std::string_view r, unsigned int c) {
65436545
if (c == r.size())
@@ -6568,7 +6570,7 @@ template <typename V> struct drt_node {
65686570
}
65696571

65706572
// Find a route.
6571-
iterator find(const std::string_view& r, unsigned int c) const {
6573+
iterator find(const std::string_view& r, unsigned int c) const noexcept {
65726574
// We found the route r.
65736575
if ((c == r.size() and v_.handler != nullptr) or (children_.size() == 0))
65746576
return iterator{this, r, v_};
@@ -6615,57 +6617,43 @@ template <typename V> struct drt_node {
66156617
drt_node_pool<drt_node>& pool_;
66166618
};
66176619

6618-
template <typename V> struct dynamic_routing_table_impl {
6619-
dynamic_routing_table_impl() : root(pool) {}
6620+
template <typename V> struct dynamic_routing_table_data {
6621+
dynamic_routing_table_data() noexcept : root(pool_) {}
66206622

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

6631+
/**
6632+
* A dynamic routing table that supports route registration and lookup.
6633+
*/
66456634
template <typename V> struct dynamic_routing_table {
6646-
dynamic_routing_table() : impl_(std::make_shared<internal::dynamic_routing_table_impl<V>>()) {}
6647-
dynamic_routing_table(const dynamic_routing_table& other) : impl_(other.impl_) {}
6635+
dynamic_routing_table() noexcept
6636+
: data_(std::make_shared<internal::dynamic_routing_table_data<V>>()) {}
6637+
dynamic_routing_table(const dynamic_routing_table& other) noexcept : data_(other.data_) {}
66486638

6649-
// Assignment operator
6650-
dynamic_routing_table& operator=(const dynamic_routing_table& other) {
6639+
dynamic_routing_table& operator=(const dynamic_routing_table& other) noexcept {
66516640
if (this != &other) {
6652-
impl_ = other.impl_;
6641+
data_ = other.data_;
66536642
}
66546643
return *this;
66556644
}
66566645

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

6667-
private:
6668-
std::shared_ptr<internal::dynamic_routing_table_impl<V>> impl_;
6655+
private:
6656+
std::shared_ptr<internal::dynamic_routing_table_data<V>> data_;
66696657
};
66706658

66716659
} // namespace li

single_headers/lithium_http_server.hh

Lines changed: 35 additions & 47 deletions
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)