@@ -11,9 +11,11 @@ namespace li {
1111
1212namespace internal {
1313
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+ */
1517template <typename T> struct drt_node_pool {
16- template <typename ... Args> T* allocate (Args&&... args) {
18+ template <typename ... Args> T* allocate (Args&&... args) noexcept {
1719 auto new_node = std::make_unique<T>(std::forward<Args>(args)...);
1820 T* ptr = new_node.get ();
1921 pool_.emplace_back (std::move (new_node));
@@ -24,20 +26,20 @@ template <typename T> struct drt_node_pool {
2426};
2527
2628template <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 } {}
2931
3032 struct iterator {
3133 const drt_node<V>* ptr;
3234 std::string_view first;
3335 V second;
3436
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 ; }
3840 };
3941
40- auto end () const { return iterator{nullptr , std::string_view (), V ()}; }
42+ auto end () const noexcept { return iterator{nullptr , std::string_view (), V ()}; }
4143
4244 auto & find_or_create (std::string_view r, unsigned int c) {
4345 if (c == r.size ())
@@ -68,7 +70,7 @@ template <typename V> struct drt_node {
6870 }
6971
7072 // 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 {
7274 // We found the route r.
7375 if ((c == r.size () and v_.handler != nullptr ) or (children_.size () == 0 ))
7476 return iterator{this , r, v_};
@@ -116,9 +118,8 @@ template <typename V> struct drt_node {
116118};
117119
118120template <typename V> struct dynamic_routing_table_impl {
119- dynamic_routing_table_impl () : root(pool) {}
121+ dynamic_routing_table_impl () noexcept : root(pool) {}
120122
121- // Find a route and return reference to a procedure.
122123 auto & operator [](const std::string_view& r) {
123124 auto [itr, is_inserted] = strings.emplace (std::string (r));
124125 std::string_view r2 (*itr);
@@ -130,41 +131,40 @@ template <typename V> struct dynamic_routing_table_impl {
130131 return root.find_or_create (r, 0 );
131132 }
132133
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 ); }
135135
136136 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 (); }
138138
139139 std::unordered_set<std::string> strings;
140140 drt_node_pool<drt_node<V>> pool;
141141 drt_node<V> root;
142142};
143143} // namespace internal
144144
145+ /* *
146+ * A dynamic routing table that supports route registration and lookup.
147+ */
145148template <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_) {}
148152
149- // Assignment operator
150- dynamic_routing_table& operator =(const dynamic_routing_table& other) {
153+ dynamic_routing_table& operator =(const dynamic_routing_table& other) noexcept {
151154 if (this != &other) {
152155 impl_ = other.impl_ ;
153156 }
154157 return *this ;
155158 }
156159
157- // Find a route and return reference to a procedure.
158160 auto & operator [](const std::string_view& r) { return impl_->operator [](r); }
159161 auto & operator [](const std::string& s) { return impl_->operator [](s); }
160162
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); }
164164 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 (); }
166166
167- private:
167+ private:
168168 std::shared_ptr<internal::dynamic_routing_table_impl<V>> impl_;
169169};
170170
0 commit comments