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 : #ifndef BOOST_URL_MATCHES_HPP
11 : #define BOOST_URL_MATCHES_HPP
12 :
13 : #include <boost/url/detail/config.hpp>
14 : #include <boost/url/string_view.hpp>
15 :
16 : namespace boost {
17 : namespace urls {
18 :
19 : // Base route match results
20 : class matches_base
21 : {
22 : public:
23 : using iterator = core::string_view*;
24 : using const_iterator = core::string_view const*;
25 : using size_type = std::size_t;
26 : using difference_type = std::ptrdiff_t;
27 : using reference = core::string_view&;
28 : using const_reference = core::string_view const&;
29 : using pointer = core::string_view*;
30 : using const_pointer = core::string_view const*;
31 :
32 93 : matches_base() = default;
33 :
34 93 : virtual ~matches_base() = default;
35 :
36 : virtual
37 : core::string_view const*
38 : matches() const = 0;
39 :
40 : virtual
41 : core::string_view const*
42 : ids() const = 0;
43 :
44 : virtual
45 : core::string_view*
46 : matches() = 0;
47 :
48 : virtual
49 : core::string_view*
50 : ids() = 0;
51 :
52 : virtual
53 : std::size_t
54 : size() const = 0;
55 :
56 : virtual
57 : void
58 : resize(std::size_t) = 0;
59 :
60 : const_reference
61 : at( size_type pos ) const;
62 :
63 : const_reference
64 : at( core::string_view id ) const;
65 :
66 : const_reference
67 : operator[]( size_type pos ) const;
68 :
69 : const_reference
70 : operator[]( core::string_view id ) const;
71 :
72 : const_iterator
73 : find( core::string_view id ) const;
74 :
75 : const_iterator
76 : begin() const;
77 :
78 : const_iterator
79 : end() const;
80 :
81 : bool
82 : empty() const noexcept;
83 : };
84 :
85 : /// A range type with the match results
86 : template <std::size_t N = 20>
87 : class matches_storage
88 : : public matches_base
89 : {
90 : core::string_view matches_storage_[N];
91 : core::string_view ids_storage_[N];
92 : std::size_t size_;
93 :
94 : matches_storage(
95 : core::string_view matches[N],
96 : core::string_view ids[N],
97 : std::size_t n)
98 : {
99 : for (std::size_t i = 0; i < n; ++i)
100 : {
101 : matches_storage_[i] = matches[i];
102 : ids_storage_[i] = ids[i];
103 : }
104 : }
105 :
106 : virtual
107 : core::string_view*
108 245 : matches() override
109 : {
110 245 : return matches_storage_;
111 : }
112 :
113 : virtual
114 : core::string_view*
115 93 : ids() override
116 : {
117 93 : return ids_storage_;
118 : }
119 :
120 : public:
121 93 : matches_storage() = default;
122 :
123 : virtual
124 : core::string_view const*
125 1016 : matches() const override
126 : {
127 1016 : return matches_storage_;
128 : }
129 :
130 : virtual
131 : core::string_view const*
132 792 : ids() const override
133 : {
134 792 : return ids_storage_;
135 : }
136 :
137 : virtual
138 : std::size_t
139 1758 : size() const override
140 : {
141 1758 : return size_;
142 : }
143 :
144 : virtual
145 : void
146 93 : resize(std::size_t n) override
147 : {
148 93 : size_ = n;
149 93 : }
150 : };
151 :
152 : /// Default type for storing route match results
153 : using matches = matches_storage<20>;
154 :
155 : } // urls
156 : } // boost
157 :
158 : #endif
159 :
|