LCOV - code coverage report
Current view: top level - boost/url/params_encoded_ref.hpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 2 2
Test Date: 2025-11-10 19:06:20 Functions: 100.0 % 1 1

            Line data    Source code
       1              : //
       2              : // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
       3              : // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
       4              : //
       5              : // Distributed under the Boost Software License, Version 1.0. (See accompanying
       6              : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
       7              : //
       8              : // Official repository: https://github.com/boostorg/url
       9              : //
      10              : 
      11              : #ifndef BOOST_URL_PARAMS_ENCODED_REF_HPP
      12              : #define BOOST_URL_PARAMS_ENCODED_REF_HPP
      13              : 
      14              : #include <boost/url/detail/config.hpp>
      15              : #include <boost/url/ignore_case.hpp>
      16              : #include <boost/url/params_encoded_view.hpp>
      17              : #include <initializer_list>
      18              : 
      19              : namespace boost {
      20              : namespace urls {
      21              : 
      22              : #ifndef BOOST_URL_DOCS
      23              : class url_base;
      24              : class params_encoded_view;
      25              : #endif
      26              : 
      27              : /** A view representing query parameters in a URL
      28              : 
      29              :     Objects of this type are used to interpret
      30              :     the query parameters as a bidirectional view
      31              :     of key value pairs.
      32              : 
      33              :     The view does not retain ownership of the
      34              :     elements and instead references the original
      35              :     url. The caller is responsible for ensuring
      36              :     that the lifetime of the referenced url
      37              :     extends until it is no longer referenced.
      38              : 
      39              :     The view is modifiable; calling non-const
      40              :     members causes changes to the referenced
      41              :     url.
      42              : 
      43              :     @par Example
      44              :     @code
      45              :     url u( "?first=John&last=Doe" );
      46              : 
      47              :     params_encoded_ref p = u.encoded_params();
      48              :     @endcode
      49              : 
      50              :     Strings produced when elements are returned
      51              :     have type @ref param_pct_view and represent
      52              :     encoded strings. Strings passed to member
      53              :     functions may contain percent escapes, and
      54              :     throw exceptions on invalid inputs.
      55              : 
      56              :     @par Iterator Invalidation
      57              :     Changes to the underlying character buffer
      58              :     can invalidate iterators which reference it.
      59              :     Modifications made through the container
      60              :     invalidate some iterators to the underlying
      61              :     character buffer:
      62              :     @li @ref append : Only `end()`.
      63              :     @li @ref assign, @ref clear,
      64              :         `operator=` : All params.
      65              :     @li @ref erase : Erased params and all
      66              :         params after (including `end()`).
      67              :     @li @ref insert : All params at or after
      68              :         the insertion point (including `end()`).
      69              :     @li @ref replace, @ref set : Modified
      70              :         params and all params
      71              :         after (including `end()`).
      72              : */
      73              : class BOOST_URL_DECL params_encoded_ref
      74              :     : public params_encoded_base
      75              : {
      76              :     friend class url_base;
      77              : 
      78              :     url_base* u_ = nullptr;
      79              : 
      80              :     params_encoded_ref(
      81              :         url_base& u) noexcept;
      82              : 
      83              : public:
      84              :     //--------------------------------------------
      85              :     //
      86              :     // Special Members
      87              :     //
      88              :     //--------------------------------------------
      89              : 
      90              :     /** Constructor
      91              : 
      92              :         After construction, both views
      93              :         reference the same url. Ownership is not
      94              :         transferred; the caller is responsible
      95              :         for ensuring the lifetime of the url
      96              :         extends until it is no longer
      97              :         referenced.
      98              : 
      99              :         @par Postconditions
     100              :         @code
     101              :         &this->url() == &other.url();
     102              :         @endcode
     103              : 
     104              :         @par Complexity
     105              :         Constant.
     106              : 
     107              :         @par Exception Safety
     108              :         Throws nothing.
     109              : 
     110              :         @param other The other view.
     111              :     */
     112              :     params_encoded_ref(
     113              :         params_encoded_ref const& other) = default;
     114              : 
     115              :     /** Assignment
     116              : 
     117              :         The previous contents of this are
     118              :         replaced by the contents of `other.
     119              : 
     120              :         <br>
     121              :         All iterators are invalidated.
     122              : 
     123              :         @note
     124              :         The strings referenced by `other`
     125              :         must not come from the underlying url,
     126              :         or else the behavior is undefined.
     127              : 
     128              :         @par Effects
     129              :         @code
     130              :         this->assign( other.begin(), other.end() );
     131              :         @endcode
     132              : 
     133              :         @par Complexity
     134              :         Linear in `other.buffer().size()`.
     135              : 
     136              :         @par Exception Safety
     137              :         Strong guarantee.
     138              :         Calls to allocate may throw.
     139              : 
     140              :         @param other The params to assign.
     141              :         @return `*this`
     142              :     */
     143              :     params_encoded_ref&
     144              :     operator=(
     145              :         params_encoded_ref const& other);
     146              : 
     147              :     /** Assignment
     148              : 
     149              :         After assignment, the previous contents
     150              :         of the query parameters are replaced by
     151              :         the contents of the initializer-list.
     152              : 
     153              :         <br>
     154              :         All iterators are invalidated.
     155              : 
     156              :         @par Preconditions
     157              :         None of character buffers referenced by
     158              :         `init` may overlap the character buffer of
     159              :         the underlying url, or else the behavior
     160              :         is undefined.
     161              : 
     162              :         @par Effects
     163              :         @code
     164              :         this->assign( init.begin(), init.end() );
     165              :         @endcode
     166              : 
     167              :         @par Complexity
     168              :         Linear in `init.size()`.
     169              : 
     170              :         @par Exception Safety
     171              :         Strong guarantee.
     172              :         Calls to allocate may throw.
     173              :         Exceptions thrown on invalid input.
     174              : 
     175              :         @throw system_error
     176              :         `init` contains an invalid percent-encoding.
     177              : 
     178              :         @param init The list of params to assign.
     179              :         @return `*this`
     180              :     */
     181              :     params_encoded_ref&
     182              :     operator=(std::initializer_list<
     183              :         param_pct_view> init);
     184              : 
     185              :     /** Conversion
     186              : 
     187              :         @par Complexity
     188              :         Constant.
     189              : 
     190              :         @par Exception Safety
     191              :         Throws nothing.
     192              : 
     193              :         @return A view of the params.
     194              :     */
     195              :     operator
     196              :     params_encoded_view() const noexcept;
     197              : 
     198              :     //--------------------------------------------
     199              :     //
     200              :     // Observers
     201              :     //
     202              :     //--------------------------------------------
     203              : 
     204              :     /** Return the referenced url
     205              : 
     206              :         This function returns the url referenced
     207              :         by the view.
     208              : 
     209              :         @par Example
     210              :         @code
     211              :         url u( "?key=value" );
     212              : 
     213              :         assert( &u.encoded_params().url() == &u );
     214              :         @endcode
     215              : 
     216              :         @par Exception Safety
     217              :         @code
     218              :         Throws nothing.
     219              :         @endcode
     220              : 
     221              :         @return A reference to the url.
     222              :     */
     223              :     url_base&
     224            7 :     url() const noexcept
     225              :     {
     226            7 :         return *u_;
     227              :     }
     228              : 
     229              :     //--------------------------------------------
     230              :     //
     231              :     // Modifiers
     232              :     //
     233              :     //--------------------------------------------
     234              : 
     235              :     /** Clear the contents of the container
     236              : 
     237              :         <br>
     238              :         All iterators are invalidated.
     239              : 
     240              :         @par Effects
     241              :         @code
     242              :         this->url().remove_query();
     243              :         @endcode
     244              : 
     245              :         @par Postconditions
     246              :         @code
     247              :         this->empty() == true && this->url().has_query() == false
     248              :         @endcode
     249              : 
     250              :         @par Complexity
     251              :         Constant.
     252              : 
     253              :         @par Exception Safety
     254              :         Throws nothing.
     255              :     */
     256              :     void
     257              :     clear() noexcept;
     258              : 
     259              :     //--------------------------------------------
     260              : 
     261              :     /** Assign params
     262              : 
     263              :         This function replaces the entire
     264              :         contents of the view with the params
     265              :         in the <em>initializer-list</em>.
     266              : 
     267              :         <br>
     268              :         All iterators are invalidated.
     269              : 
     270              :         @note
     271              :         The strings referenced by the inputs
     272              :         must not come from the underlying url,
     273              :         or else the behavior is undefined.
     274              : 
     275              :         @par Example
     276              :         @code
     277              :         url u;
     278              : 
     279              :         u.encoded_params().assign({ { "first", "John" }, { "last", "Doe" } });
     280              :         @endcode
     281              : 
     282              :         @par Complexity
     283              :         Linear in `init.size()`.
     284              : 
     285              :         @par Exception Safety
     286              :         Strong guarantee.
     287              :         Calls to allocate may throw.
     288              :         Exceptions thrown on invalid input.
     289              : 
     290              :         @throw system_error
     291              :         `init` contains an invalid percent-encoding.
     292              : 
     293              :         @param init The list of params to assign.
     294              :     */
     295              :     void
     296              :     assign(
     297              :         std::initializer_list<
     298              :             param_pct_view> init);
     299              : 
     300              :     /** Assign params
     301              : 
     302              :         This function replaces the entire
     303              :         contents of the view with the params
     304              :         in the range.
     305              : 
     306              :         <br>
     307              :         All iterators are invalidated.
     308              : 
     309              :         @note
     310              :         The strings referenced by the inputs
     311              :         must not come from the underlying url,
     312              :         or else the behavior is undefined.
     313              : 
     314              :         @par Mandates
     315              :         @code
     316              :         std::is_convertible< std::iterator_traits< FwdIt >::reference_type, param_pct_view >::value == true
     317              :         @endcode
     318              : 
     319              :         @par Complexity
     320              :         Linear in the size of the range.
     321              : 
     322              :         @par Exception Safety
     323              :         Strong guarantee.
     324              :         Calls to allocate may throw.
     325              :         Exceptions thrown on invalid input.
     326              : 
     327              :         @throw system_error
     328              :         The range contains an invalid percent-encoding.
     329              : 
     330              :         @param first The first element to assign.
     331              :         @param last One past the last element to assign.
     332              :     */
     333              :     template<class FwdIt>
     334              :     void
     335              :     assign(FwdIt first, FwdIt last);
     336              : 
     337              :     //--------------------------------------------
     338              : 
     339              :     /** Append params
     340              : 
     341              :         This function appends a param to the view.
     342              : 
     343              :         <br>
     344              :         The `end()` iterator is invalidated.
     345              : 
     346              :         @par Example
     347              :         @code
     348              :         url u;
     349              : 
     350              :         u.encoded_params().append( { "first", "John" } );
     351              :         @endcode
     352              : 
     353              :         @par Complexity
     354              :         Linear in `this->url().encoded_query().size()`.
     355              : 
     356              :         @par Exception Safety
     357              :         Strong guarantee.
     358              :         Calls to allocate may throw.
     359              :         Exceptions thrown on invalid input.
     360              : 
     361              :         @throw system_error
     362              :         `p` contains an invalid percent-encoding.
     363              : 
     364              :         @return An iterator to the new element.
     365              : 
     366              :         @param p The param to append.
     367              :     */
     368              :     iterator
     369              :     append(
     370              :         param_pct_view const& p);
     371              : 
     372              :     /** Append params
     373              : 
     374              :         This function appends the params in
     375              :         an <em>initializer-list</em> to the view.
     376              : 
     377              :         <br>
     378              :         The `end()` iterator is invalidated.
     379              : 
     380              :         @par Example
     381              :         @code
     382              :         url u;
     383              : 
     384              :         u.encoded_params().append({ {"first", "John"}, {"last", "Doe"} });
     385              :         @endcode
     386              : 
     387              :         @par Complexity
     388              :         Linear in `this->url().encoded_query().size()`.
     389              : 
     390              :         @par Exception Safety
     391              :         Strong guarantee.
     392              :         Calls to allocate may throw.
     393              :         Exceptions thrown on invalid input.
     394              : 
     395              :         @throw system_error
     396              :         `init` contains an invalid percent-encoding.
     397              : 
     398              :         @return An iterator to the first new element.
     399              : 
     400              :         @param init The list of params to append.
     401              :     */
     402              :     iterator
     403              :     append(
     404              :         std::initializer_list<
     405              :             param_pct_view> init);
     406              : 
     407              :     /** Append params
     408              : 
     409              :         This function appends a range of params
     410              :         to the view.
     411              : 
     412              :         <br>
     413              :         The `end()` iterator is invalidated.
     414              : 
     415              :         @note
     416              :         The strings referenced by the inputs
     417              :         must not come from the underlying url,
     418              :         or else the behavior is undefined.
     419              : 
     420              :         @par Mandates
     421              :         @code
     422              :         std::is_convertible< std::iterator_traits< FwdIt >::reference_type, param_pct_view >::value == true
     423              :         @endcode
     424              : 
     425              :         @par Complexity
     426              :         Linear in `this->url().encoded_query().size()`.
     427              : 
     428              :         @par Exception Safety
     429              :         Strong guarantee.
     430              :         Calls to allocate may throw.
     431              :         Exceptions thrown on invalid input.
     432              : 
     433              :         @throw system_error
     434              :         The range contains an invalid percent-encoding.
     435              : 
     436              :         @return An iterator to the first new element.
     437              : 
     438              :         @param first The first element to append.
     439              :         @param last One past the last element to append.
     440              :         @return An iterator to the first new element.
     441              :     */
     442              :     template<class FwdIt>
     443              :     iterator
     444              :     append(
     445              :         FwdIt first, FwdIt last);
     446              : 
     447              :     //--------------------------------------------
     448              : 
     449              :     /** Insert params
     450              : 
     451              :         This function inserts a param
     452              :         before the specified position.
     453              : 
     454              :         <br>
     455              :         All iterators that are equal to
     456              :         `before` or come after are invalidated.
     457              : 
     458              :         @par Complexity
     459              :         Linear in `this->url().encoded_query().size()`.
     460              : 
     461              :         @par Exception Safety
     462              :         Strong guarantee.
     463              :         Calls to allocate may throw.
     464              :         Exceptions thrown on invalid input.
     465              : 
     466              :         @throw system_error
     467              :         `p` contains an invalid percent-encoding.
     468              : 
     469              :         @return An iterator to the inserted
     470              :         element.
     471              : 
     472              :         @param before An iterator before which
     473              :         the param is inserted. This may
     474              :         be equal to `end()`.
     475              : 
     476              :         @param p The param to insert.
     477              :     */
     478              :     iterator
     479              :     insert(
     480              :         iterator before,
     481              :         param_pct_view const& p);
     482              : 
     483              :     /** Insert params
     484              : 
     485              :         This function inserts the params in
     486              :         an <em>initializer-list</em> before
     487              :         the specified position.
     488              : 
     489              :         <br>
     490              :         All iterators that are equal to
     491              :         `before` or come after are invalidated.
     492              : 
     493              :         @note
     494              :         The strings referenced by the inputs
     495              :         must not come from the underlying url,
     496              :         or else the behavior is undefined.
     497              : 
     498              :         @par Complexity
     499              :         Linear in `this->url().encoded_query().size()`.
     500              : 
     501              :         @par Exception Safety
     502              :         Strong guarantee.
     503              :         Calls to allocate may throw.
     504              :         Exceptions thrown on invalid input.
     505              : 
     506              :         @throw system_error
     507              :         `init` contains an invalid percent-encoding.
     508              : 
     509              :         @return An iterator to the first
     510              :         element inserted, or `before` if
     511              :         `init.size() == 0`.
     512              : 
     513              :         @param before An iterator before which
     514              :         the element is inserted. This may
     515              :         be equal to `end()`.
     516              : 
     517              :         @param init The list of params to insert.
     518              :     */
     519              :     iterator
     520              :     insert(
     521              :         iterator before,
     522              :         std::initializer_list<
     523              :             param_pct_view> init);
     524              : 
     525              :     /** Insert params
     526              : 
     527              :         This function inserts a range of
     528              :         params before the specified position.
     529              : 
     530              :         <br>
     531              :         All iterators that are equal to
     532              :         `before` or come after are invalidated.
     533              : 
     534              :         @note
     535              :         The strings referenced by the inputs
     536              :         must not come from the underlying url,
     537              :         or else the behavior is undefined.
     538              : 
     539              :         @par Mandates
     540              :         @code
     541              :         std::is_convertible< std::iterator_traits< FwdIt >::reference_type, param_pct_view >::value == true
     542              :         @endcode
     543              : 
     544              :         @par Complexity
     545              :         Linear in `this->url().encoded_query().size()`.
     546              : 
     547              :         @par Exception Safety
     548              :         Strong guarantee.
     549              :         Calls to allocate may throw.
     550              :         Exceptions thrown on invalid input.
     551              : 
     552              :         @throw system_error
     553              :         The range contains an invalid percent-encoding.
     554              : 
     555              :         @return An iterator to the first
     556              :         element inserted, or `before` if
     557              :         `first == last`.
     558              : 
     559              :         @param before An iterator before which
     560              :         the element is inserted. This may
     561              :         be equal to `end()`.
     562              : 
     563              :         @param first The first element to insert.
     564              :         @param last One past the last element to insert.
     565              :         @return An iterator to the first element inserted.
     566              :     */
     567              :     template<class FwdIt>
     568              :     iterator
     569              :     insert(
     570              :         iterator before,
     571              :         FwdIt first,
     572              :         FwdIt last);
     573              : 
     574              :     //--------------------------------------------
     575              : 
     576              :     /** Erase params
     577              : 
     578              :         This function removes an element from
     579              :         the container.
     580              : 
     581              :         <br>
     582              :         All iterators that are equal to
     583              :         `pos` or come after are invalidated.
     584              : 
     585              :         @par Example
     586              :         @code
     587              :         url u( "?first=John&last=Doe" );
     588              : 
     589              :         params_encoded_ref::iterator it = u.encoded_params().erase( u.encoded_params().begin() );
     590              : 
     591              :         assert( u.encoded_query() == "last=Doe" );
     592              :         @endcode
     593              : 
     594              :         @par Complexity
     595              :         Linear in `this->url().encoded_query().size()`.
     596              : 
     597              :         @par Exception Safety
     598              :         Throws nothing.
     599              : 
     600              :         @return An iterator to one past
     601              :         the removed element.
     602              : 
     603              :         @param pos An iterator to the element.
     604              :     */
     605              :     iterator
     606              :     erase(iterator pos) noexcept;
     607              : 
     608              :     /** Erase params
     609              : 
     610              :         This function removes a range of params
     611              :         from the container.
     612              : 
     613              :         <br>
     614              :         All iterators that are equal to
     615              :         `first` or come after are invalidated.
     616              : 
     617              :         @par Complexity
     618              :         Linear in `this->url().encoded_query().size()`.
     619              : 
     620              :         @par Exception Safety
     621              :         Throws nothing.
     622              : 
     623              :         @return An iterator to one past
     624              :         the removed range.
     625              : 
     626              :         @param first The first element to remove.
     627              :         @param last One past the last element to remove.
     628              :         @return An iterator to one past the removed range.
     629              :     */
     630              :     iterator
     631              :     erase(
     632              :         iterator first,
     633              :         iterator last) noexcept;
     634              : 
     635              :     /** Erase params
     636              : 
     637              :         <br>
     638              :         All iterators are invalidated.
     639              : 
     640              :         @par Postconditions
     641              :         @code
     642              :         this->count( key, ic ) == 0
     643              :         @endcode
     644              : 
     645              :         @par Complexity
     646              :         Linear in `this->url().encoded_query().size()`.
     647              : 
     648              :         @par Exception Safety
     649              :         Exceptions thrown on invalid input.
     650              : 
     651              :         @throw system_error
     652              :         `key` contains an invalid percent-encoding.
     653              : 
     654              :         @return The number of params removed
     655              :         from the container.
     656              : 
     657              :         @param key The key to match.
     658              :         By default, a case-sensitive
     659              :         comparison is used.
     660              : 
     661              :         @param ic An optional parameter. If
     662              :         the value @ref ignore_case is passed
     663              :         here, the comparison is
     664              :         case-insensitive.
     665              :     */
     666              :     std::size_t
     667              :     erase(
     668              :         pct_string_view key,
     669              :         ignore_case_param ic = {}) noexcept;
     670              : 
     671              :     //--------------------------------------------
     672              : 
     673              :     /** Replace params
     674              : 
     675              :         This function replaces the contents
     676              :         of the element at `pos` with the
     677              :         specified param.
     678              : 
     679              :         <br>
     680              :         All iterators that are equal to
     681              :         `pos` or come after are invalidated.
     682              : 
     683              :         @note
     684              :         The strings passed in must not come
     685              :         from the element being replaced,
     686              :         or else the behavior is undefined.
     687              : 
     688              :         @par Example
     689              :         @code
     690              :         url u( "?first=John&last=Doe" );
     691              : 
     692              :         u.encoded_params().replace( u.encoded_params().begin(), { "title", "Mr" });
     693              : 
     694              :         assert( u.encoded_query() == "title=Mr&last=Doe" );
     695              :         @endcode
     696              : 
     697              :         @par Complexity
     698              :         Linear in `this->url().encoded_query().size()`.
     699              : 
     700              :         @par Exception Safety
     701              :         Strong guarantee.
     702              :         Calls to allocate may throw.
     703              :         Exceptions thrown on invalid input.
     704              : 
     705              :         @throw system_error
     706              :         `p` contains an invalid percent-encoding.
     707              : 
     708              :         @return An iterator to the element.
     709              : 
     710              :         @param pos An iterator to the element.
     711              : 
     712              :         @param p The param to assign.
     713              :     */
     714              :     iterator
     715              :     replace(
     716              :         iterator pos,
     717              :         param_pct_view const& p);
     718              : 
     719              :     /** Replace params
     720              : 
     721              :         This function replaces a range of
     722              :         params with the params in an
     723              :         <em>initializer-list</em>.
     724              : 
     725              :         <br>
     726              :         All iterators that are equal to
     727              :         `from` or come after are invalidated.
     728              : 
     729              :         @note
     730              :         The strings referenced by the inputs
     731              :         must not come from the underlying url,
     732              :         or else the behavior is undefined.
     733              : 
     734              :         @par Complexity
     735              :         Linear in `this->url().encoded_query().size()`.
     736              : 
     737              :         @par Exception Safety
     738              :         Strong guarantee.
     739              :         Calls to allocate may throw.
     740              :         Exceptions thrown on invalid input.
     741              : 
     742              :         @throw system_error
     743              :         `init` contains an invalid percent-encoding.
     744              : 
     745              :         @return An iterator to the first
     746              :         element inserted, or one past `to` if
     747              :         `init.size() == 0`.
     748              : 
     749              :         @param from,to The range of params
     750              :         to replace.
     751              : 
     752              :         @param init The list of params to assign.
     753              :     */
     754              :     iterator
     755              :     replace(
     756              :         iterator from,
     757              :         iterator to,
     758              :         std::initializer_list<
     759              :             param_pct_view> init);
     760              : 
     761              :     /** Replace params
     762              : 
     763              :         This function replaces a range of
     764              :         params with a range of params.
     765              : 
     766              :         <br>
     767              :         All iterators that are equal to
     768              :         `from` or come after are invalidated.
     769              : 
     770              :         @note
     771              :         The strings referenced by the inputs
     772              :         must not come from the underlying url,
     773              :         or else the behavior is undefined.
     774              : 
     775              :         @par Mandates
     776              :         @code
     777              :         std::is_convertible< std::iterator_traits< FwdIt >::reference_type, param_pct_view >::value == true
     778              :         @endcode
     779              : 
     780              :         @par Complexity
     781              :         Linear in `this->url().encoded_query().size()`.
     782              : 
     783              :         @par Exception Safety
     784              :         Strong guarantee.
     785              :         Calls to allocate may throw.
     786              :         Exceptions thrown on invalid input.
     787              : 
     788              :         @throw system_error
     789              :         The range contains an invalid percent-encoding.
     790              : 
     791              :         @return An iterator to the first
     792              :         element inserted, or one past `to` if
     793              :         `first == last`.
     794              : 
     795              :         @param from The first element to replace.
     796              :         @param to One past the last element to replace.
     797              :         @param first The first element to insert.
     798              :         @param last One past the last element to insert.
     799              :         @return An iterator to the first element inserted, or
     800              :         one past `to` if `first == last`.
     801              :     */
     802              :     template<class FwdIt>
     803              :     iterator
     804              :     replace(
     805              :         iterator from,
     806              :         iterator to,
     807              :         FwdIt first,
     808              :         FwdIt last);
     809              : 
     810              :     //--------------------------------------------
     811              : 
     812              :     /** Remove the value on an element
     813              : 
     814              :         This function removes the value of
     815              :         an element at the specified position.
     816              :         After the call returns, `has_value`
     817              :         for the element is false.
     818              : 
     819              :         <br>
     820              :         All iterators that are equal to
     821              :         `pos` or come after are invalidated.
     822              : 
     823              :         @par Example
     824              :         @code
     825              :         url u( "?first=John&last=Doe" );
     826              : 
     827              :         u.encoded_params().unset( u.encoded_params().begin() );
     828              : 
     829              :         assert( u.encoded_query() == "first&last=Doe" );
     830              :         @endcode
     831              : 
     832              :         @par Complexity
     833              :         Linear in `this->url().encoded_query().size()`.
     834              : 
     835              :         @par Exception Safety
     836              :         Throws nothing.
     837              : 
     838              :         @return An iterator to the element.
     839              : 
     840              :         @param pos An iterator to the element.
     841              :     */
     842              :     iterator
     843              :     unset(
     844              :         iterator pos) noexcept;
     845              : 
     846              :     /** Set a value
     847              : 
     848              :         This function replaces the value of an
     849              :         element at the specified position.
     850              : 
     851              :         <br>
     852              :         All iterators that are equal to
     853              :         `pos` or come after are invalidated.
     854              : 
     855              :         @note
     856              :         The string passed in must not come
     857              :         from the element being replaced,
     858              :         or else the behavior is undefined.
     859              : 
     860              :         @par Example
     861              :         @code
     862              :         url u( "?id=42&id=69" );
     863              : 
     864              :         u.encoded_params().set( u.encoded_params().begin(), "none" );
     865              : 
     866              :         assert( u.encoded_query() == "id=none&id=69" );
     867              :         @endcode
     868              : 
     869              :         @par Complexity
     870              :         Linear in `this->url().encoded_query().size()`.
     871              : 
     872              :         @par Exception Safety
     873              :         Strong guarantee.
     874              :         Calls to allocate may throw.
     875              :         Exceptions thrown on invalid input.
     876              : 
     877              :         @throw system_error
     878              :         `value` contains an invalid percent-encoding.
     879              : 
     880              :         @return An iterator to the element.
     881              : 
     882              :         @param pos An iterator to the element.
     883              : 
     884              :         @param value The value to assign. The
     885              :         empty string still counts as a value.
     886              :         That is, `has_value` for the element
     887              :         is true.
     888              :     */
     889              :     iterator
     890              :     set(
     891              :         iterator pos,
     892              :         pct_string_view value);
     893              : 
     894              :     /** Set a value
     895              : 
     896              :         This function performs one of two
     897              :         actions depending on the value of
     898              :         `this->contains( key, ic )`.
     899              : 
     900              :         @li If key is contained in the view
     901              :         then one of the matching params has
     902              :         its value changed to the specified value.
     903              :         The remaining params with a matching
     904              :         key are erased. Otherwise,
     905              : 
     906              :         @li If `key` is not contained in the
     907              :         view, then the function apppends the
     908              :         param `{ key, value }`.
     909              : 
     910              :         <br>
     911              :         All iterators are invalidated.
     912              : 
     913              :         @note
     914              :         The strings passed in must not come
     915              :         from the element being replaced,
     916              :         or else the behavior is undefined.
     917              : 
     918              :         @par Example
     919              :         @code
     920              :         url u( "?id=42&id=69" );
     921              : 
     922              :         u.encoded_params().set( "id", "none" );
     923              : 
     924              :         assert( u.encoded_params().count( "id" ) == 1 );
     925              :         @endcode
     926              : 
     927              :         @par Postconditions
     928              :         @code
     929              :         this->count( key, ic ) == 1 && this->find( key, ic )->value == value
     930              :         @endcode
     931              : 
     932              :         @par Complexity
     933              :         Linear in `this->url().encoded_query().size()`.
     934              : 
     935              :         @par Exception Safety
     936              :         Strong guarantee.
     937              :         Calls to allocate may throw.
     938              :         Exceptions thrown on invalid input.
     939              : 
     940              :         @throw system_error
     941              :         `key` or `value` contain an invalid
     942              :         percent-encoding.
     943              : 
     944              :         @return An iterator to the appended
     945              :         or modified element.
     946              : 
     947              :         @param key The key to match.
     948              :         By default, a case-sensitive
     949              :         comparison is used.
     950              : 
     951              :         @param value The value to assign. The
     952              :         empty string still counts as a value.
     953              :         That is, `has_value` for the element
     954              :         is true.
     955              : 
     956              :         @param ic An optional parameter. If
     957              :         the value @ref ignore_case is passed
     958              :         here, the comparison is
     959              :         case-insensitive.
     960              :     */
     961              :     iterator
     962              :     set(
     963              :         pct_string_view key,
     964              :         pct_string_view value,
     965              :         ignore_case_param ic = {});
     966              : 
     967              : private:
     968              :     template<class FwdIt>
     969              :     void
     970              :     assign(FwdIt first, FwdIt last,
     971              :         std::forward_iterator_tag);
     972              : 
     973              :     // Doxygen cannot render ` = delete`
     974              :     template<class FwdIt>
     975              :     void
     976              :     assign(FwdIt first, FwdIt last,
     977              :            std::input_iterator_tag) = delete;
     978              : 
     979              :     template<class FwdIt>
     980              :     iterator
     981              :     insert(
     982              :         iterator before,
     983              :         FwdIt first,
     984              :         FwdIt last,
     985              :         std::forward_iterator_tag);
     986              : 
     987              :     // Doxygen cannot render ` = delete`
     988              :     template<class FwdIt>
     989              :     iterator
     990              :     insert(
     991              :         iterator before,
     992              :         FwdIt first,
     993              :         FwdIt last,
     994              :         std::input_iterator_tag) = delete;
     995              : };
     996              : 
     997              : } // urls
     998              : } // boost
     999              : 
    1000              : // This is in <boost/url/url_base.hpp>
    1001              : //
    1002              : // #include <boost/url/impl/params_encoded_ref.hpp>
    1003              : 
    1004              : #endif
        

Generated by: LCOV version 2.1