Line data Source code
1 : //
2 : // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
3 : //
4 : // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 : //
7 : // Official repository: https://github.com/boostorg/url
8 : //
9 :
10 : #include <boost/url/detail/except.hpp>
11 : #include <boost/url/decode_view.hpp>
12 : #include <boost/url/grammar/unsigned_rule.hpp>
13 : #include <boost/mp11/algorithm.hpp>
14 :
15 : namespace boost {
16 : namespace urls {
17 :
18 : template <class T>
19 : template <class U>
20 : void
21 113 : router<T>::
22 : insert(core::string_view pattern, U&& v)
23 : {
24 : BOOST_STATIC_ASSERT(
25 : std::is_same<T, U>::value ||
26 : std::is_convertible<U, T>::value ||
27 : std::is_base_of<T, U>::value);
28 : using U_ = typename std::decay<
29 : typename std::conditional<
30 : std::is_base_of<T, U>::value, U, T
31 : >::type>::type;
32 : struct impl : any_resource
33 : {
34 : U_ u;
35 :
36 : explicit
37 113 : impl(U&& u_)
38 113 : : u(std::forward<U>(u_))
39 : {
40 113 : }
41 :
42 : void const*
43 76 : get() const noexcept override
44 : {
45 76 : return static_cast<T const*>(&u);
46 : }
47 : };
48 113 : any_resource const* p = new impl(
49 113 : std::forward<U>(v));
50 113 : insert_impl( pattern, p );
51 111 : }
52 :
53 : template <class T>
54 : T const*
55 93 : router<T>::
56 : find(segments_encoded_view path, matches_base& m) const noexcept
57 : {
58 93 : core::string_view* matches_it = m.matches();
59 93 : core::string_view* ids_it = m.ids();
60 93 : any_resource const* p = find_impl(
61 : path, matches_it, ids_it );
62 93 : if (p)
63 : {
64 76 : BOOST_ASSERT(matches_it >= m.matches());
65 152 : m.resize(static_cast<std::size_t>(
66 76 : matches_it - m.matches()));
67 : return reinterpret_cast<
68 76 : T const*>(p->get());
69 : }
70 17 : m.resize(0);
71 17 : return nullptr;
72 : }
73 :
74 : } // urls
75 : } // boost
|