@@ -11,9 +11,11 @@ namespace li {
11
11
12
12
namespace internal {
13
13
14
- // A simple memory pool for drt_node objects
14
+ /* *
15
+ * A memory pool for drt_node objects that manages node allocation and lifetime
16
+ */
15
17
template <typename T> struct drt_node_pool {
16
- template <typename ... Args> T* allocate (Args&&... args) {
18
+ template <typename ... Args> T* allocate (Args&&... args) noexcept {
17
19
auto new_node = std::make_unique<T>(std::forward<Args>(args)...);
18
20
T* ptr = new_node.get ();
19
21
pool_.emplace_back (std::move (new_node));
@@ -24,20 +26,20 @@ template <typename T> struct drt_node_pool {
24
26
};
25
27
26
28
template <typename V> struct drt_node {
27
- drt_node () : pool_(nullptr ), v_{0 , nullptr } {}
28
- drt_node (drt_node_pool<drt_node>& pool) : pool_(pool), v_{0 , nullptr } {}
29
+ drt_node () noexcept : pool_(nullptr ), v_{0 , nullptr } {}
30
+ drt_node (drt_node_pool<drt_node>& pool) noexcept : pool_(pool), v_{0 , nullptr } {}
29
31
30
32
struct iterator {
31
33
const drt_node<V>* ptr;
32
34
std::string_view first;
33
35
V second;
34
36
35
- auto operator ->() { return this ; }
36
- bool operator ==(const iterator& b) const { return this ->ptr == b.ptr ; }
37
- bool operator !=(const iterator& b) const { return this ->ptr != b.ptr ; }
37
+ auto operator ->() noexcept { return this ; }
38
+ bool operator ==(const iterator& b) const noexcept { return this ->ptr == b.ptr ; }
39
+ bool operator !=(const iterator& b) const noexcept { return this ->ptr != b.ptr ; }
38
40
};
39
41
40
- auto end () const { return iterator{nullptr , std::string_view (), V ()}; }
42
+ auto end () const noexcept { return iterator{nullptr , std::string_view (), V ()}; }
41
43
42
44
auto & find_or_create (std::string_view r, unsigned int c) {
43
45
if (c == r.size ())
@@ -68,7 +70,7 @@ template <typename V> struct drt_node {
68
70
}
69
71
70
72
// Find a route.
71
- iterator find (const std::string_view& r, unsigned int c) const {
73
+ iterator find (const std::string_view& r, unsigned int c) const noexcept {
72
74
// We found the route r.
73
75
if ((c == r.size () and v_.handler != nullptr ) or (children_.size () == 0 ))
74
76
return iterator{this , r, v_};
@@ -116,9 +118,8 @@ template <typename V> struct drt_node {
116
118
};
117
119
118
120
template <typename V> struct dynamic_routing_table_impl {
119
- dynamic_routing_table_impl () : root(pool) {}
121
+ dynamic_routing_table_impl () noexcept : root(pool) {}
120
122
121
- // Find a route and return reference to a procedure.
122
123
auto & operator [](const std::string_view& r) {
123
124
auto [itr, is_inserted] = strings.emplace (std::string (r));
124
125
std::string_view r2 (*itr);
@@ -130,41 +131,40 @@ template <typename V> struct dynamic_routing_table_impl {
130
131
return root.find_or_create (r, 0 );
131
132
}
132
133
133
- // Find a route and return an iterator.
134
- auto find (const std::string_view& r) const { return root.find (r, 0 ); }
134
+ auto find (const std::string_view& r) const noexcept { return root.find (r, 0 ); }
135
135
136
136
template <typename F> void for_all_routes (F f) const { root.for_all_routes (f); }
137
- auto end () const { return root.end (); }
137
+ auto end () const noexcept { return root.end (); }
138
138
139
139
std::unordered_set<std::string> strings;
140
140
drt_node_pool<drt_node<V>> pool;
141
141
drt_node<V> root;
142
142
};
143
143
} // namespace internal
144
144
145
+ /* *
146
+ * A dynamic routing table that supports route registration and lookup.
147
+ */
145
148
template <typename V> struct dynamic_routing_table {
146
- dynamic_routing_table () : impl_(std::make_shared<internal::dynamic_routing_table_impl<V>>()) {}
147
- dynamic_routing_table (const dynamic_routing_table& other) : impl_(other.impl_) {}
149
+ 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_) {}
148
152
149
- // Assignment operator
150
- dynamic_routing_table& operator =(const dynamic_routing_table& other) {
153
+ dynamic_routing_table& operator =(const dynamic_routing_table& other) noexcept {
151
154
if (this != &other) {
152
155
impl_ = other.impl_ ;
153
156
}
154
157
return *this ;
155
158
}
156
159
157
- // Find a route and return reference to a procedure.
158
160
auto & operator [](const std::string_view& r) { return impl_->operator [](r); }
159
161
auto & operator [](const std::string& s) { return impl_->operator [](s); }
160
162
161
- // Find a route and return an iterator.
162
- auto find (const std::string_view& r) const { return impl_->find (r); }
163
-
163
+ auto find (const std::string_view& r) const noexcept { return impl_->find (r); }
164
164
template <typename F> void for_all_routes (F f) const { impl_->for_all_routes (f); }
165
- auto end () const { return impl_->end (); }
165
+ auto end () const noexcept { return impl_->end (); }
166
166
167
- private:
167
+ private:
168
168
std::shared_ptr<internal::dynamic_routing_table_impl<V>> impl_;
169
169
};
170
170
0 commit comments