Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-30 10:02:05

0001 //
0002 // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
0003 // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
0004 //
0005 // Distributed under the Boost Software License, Version 1.0. (See accompanying
0006 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
0007 //
0008 // Official repository: https://github.com/boostorg/url
0009 //
0010 
0011 #ifndef BOOST_URL_PARAMS_ENCODED_REF_HPP
0012 #define BOOST_URL_PARAMS_ENCODED_REF_HPP
0013 
0014 #include <boost/url/detail/config.hpp>
0015 #include <boost/url/ignore_case.hpp>
0016 #include <boost/url/params_encoded_view.hpp>
0017 #include <initializer_list>
0018 
0019 namespace boost {
0020 namespace urls {
0021 
0022 #ifndef BOOST_URL_DOCS
0023 class url_base;
0024 class params_encoded_view;
0025 #endif
0026 
0027 /** A view representing query parameters in a URL
0028 
0029     Objects of this type are used to interpret
0030     the query parameters as a bidirectional view
0031     of key value pairs.
0032 
0033     The view does not retain ownership of the
0034     elements and instead references the original
0035     url. The caller is responsible for ensuring
0036     that the lifetime of the referenced url
0037     extends until it is no longer referenced.
0038 
0039     The view is modifiable; calling non-const
0040     members causes changes to the referenced
0041     url.
0042 
0043     @par Example
0044     @code
0045     url u( "?first=John&last=Doe" );
0046 
0047     params_encoded_ref p = u.encoded_params();
0048     @endcode
0049 
0050     Strings produced when elements are returned
0051     have type @ref param_pct_view and represent
0052     encoded strings. Strings passed to member
0053     functions may contain percent escapes, and
0054     throw exceptions on invalid inputs.
0055 
0056     @par Iterator Invalidation
0057     Changes to the underlying character buffer
0058     can invalidate iterators which reference it.
0059     Modifications made through the container
0060     invalidate some iterators to the underlying
0061     character buffer:
0062     @li @ref append : Only `end()`.
0063     @li @ref assign, @ref clear,
0064         `operator=` : All params.
0065     @li @ref erase : Erased params and all
0066         params after (including `end()`).
0067     @li @ref insert : All params at or after
0068         the insertion point (including `end()`).
0069     @li @ref replace, @ref set : Modified
0070         params and all params
0071         after (including `end()`).
0072 */
0073 class BOOST_URL_DECL params_encoded_ref
0074     : public params_encoded_base
0075 {
0076     friend class url_base;
0077 
0078     url_base* u_ = nullptr;
0079 
0080     params_encoded_ref(
0081         url_base& u) noexcept;
0082 
0083 public:
0084     //--------------------------------------------
0085     //
0086     // Special Members
0087     //
0088     //--------------------------------------------
0089 
0090     /** Constructor
0091 
0092         After construction, both views
0093         reference the same url. Ownership is not
0094         transferred; the caller is responsible
0095         for ensuring the lifetime of the url
0096         extends until it is no longer
0097         referenced.
0098 
0099         @par Postconditions
0100         @code
0101         &this->url() == &other.url();
0102         @endcode
0103 
0104         @par Complexity
0105         Constant.
0106 
0107         @par Exception Safety
0108         Throws nothing.
0109 
0110         @param other The other view.
0111     */
0112     params_encoded_ref(
0113         params_encoded_ref const& other) = default;
0114 
0115     /** Assignment
0116 
0117         The previous contents of this are
0118         replaced by the contents of `other.
0119 
0120         <br>
0121         All iterators are invalidated.
0122 
0123         @note
0124         The strings referenced by `other`
0125         must not come from the underlying url,
0126         or else the behavior is undefined.
0127 
0128         @par Effects
0129         @code
0130         this->assign( other.begin(), other.end() );
0131         @endcode
0132 
0133         @par Complexity
0134         Linear in `other.buffer().size()`.
0135 
0136         @par Exception Safety
0137         Strong guarantee.
0138         Calls to allocate may throw.
0139 
0140         @param other The params to assign.
0141     */
0142     params_encoded_ref&
0143     operator=(
0144         params_encoded_ref const& other);
0145 
0146     /** Assignment
0147 
0148         After assignment, the previous contents
0149         of the query parameters are replaced by
0150         the contents of the initializer-list.
0151 
0152         <br>
0153         All iterators are invalidated.
0154 
0155         @par Preconditions
0156         None of character buffers referenced by
0157         `init` may overlap the character buffer of
0158         the underlying url, or else the behavior
0159         is undefined.
0160 
0161         @par Effects
0162         @code
0163         this->assign( init.begin(), init.end() );
0164         @endcode
0165 
0166         @par Complexity
0167         Linear in `init.size()`.
0168 
0169         @par Exception Safety
0170         Strong guarantee.
0171         Calls to allocate may throw.
0172         Exceptions thrown on invalid input.
0173 
0174         @throw system_error
0175         `init` contains an invalid percent-encoding.
0176 
0177         @param init The list of params to assign.
0178     */
0179     params_encoded_ref&
0180     operator=(std::initializer_list<
0181         param_pct_view> init);
0182 
0183     /** Conversion
0184 
0185         @par Complexity
0186         Constant.
0187 
0188         @par Exception Safety
0189         Throws nothing.
0190     */
0191     operator
0192     params_encoded_view() const noexcept;
0193 
0194     //--------------------------------------------
0195     //
0196     // Observers
0197     //
0198     //--------------------------------------------
0199 
0200     /** Return the referenced url
0201 
0202         This function returns the url referenced
0203         by the view.
0204 
0205         @par Example
0206         @code
0207         url u( "?key=value" );
0208 
0209         assert( &u.encoded_params().url() == &u );
0210         @endcode
0211 
0212         @par Exception Safety
0213         @code
0214         Throws nothing.
0215         @endcode
0216     */
0217     url_base&
0218     url() const noexcept
0219     {
0220         return *u_;
0221     }
0222 
0223     //--------------------------------------------
0224     //
0225     // Modifiers
0226     //
0227     //--------------------------------------------
0228 
0229     /** Clear the contents of the container
0230 
0231         <br>
0232         All iterators are invalidated.
0233 
0234         @par Effects
0235         @code
0236         this->url().remove_query();
0237         @endcode
0238 
0239         @par Postconditions
0240         @code
0241         this->empty() == true && this->url().has_query() == false
0242         @endcode
0243 
0244         @par Complexity
0245         Constant.
0246 
0247         @par Exception Safety
0248         Throws nothing.
0249     */
0250     void
0251     clear() noexcept;
0252 
0253     //--------------------------------------------
0254 
0255     /** Assign params
0256 
0257         This function replaces the entire
0258         contents of the view with the params
0259         in the <em>initializer-list</em>.
0260 
0261         <br>
0262         All iterators are invalidated.
0263 
0264         @note
0265         The strings referenced by the inputs
0266         must not come from the underlying url,
0267         or else the behavior is undefined.
0268 
0269         @par Example
0270         @code
0271         url u;
0272 
0273         u.encoded_params().assign({ { "first", "John" }, { "last", "Doe" } });
0274         @endcode
0275 
0276         @par Complexity
0277         Linear in `init.size()`.
0278 
0279         @par Exception Safety
0280         Strong guarantee.
0281         Calls to allocate may throw.
0282         Exceptions thrown on invalid input.
0283 
0284         @throw system_error
0285         `init` contains an invalid percent-encoding.
0286 
0287         @param init The list of params to assign.
0288     */
0289     void
0290     assign(
0291         std::initializer_list<
0292             param_pct_view> init);
0293 
0294     /** Assign params
0295 
0296         This function replaces the entire
0297         contents of the view with the params
0298         in the range.
0299 
0300         <br>
0301         All iterators are invalidated.
0302 
0303         @note
0304         The strings referenced by the inputs
0305         must not come from the underlying url,
0306         or else the behavior is undefined.
0307 
0308         @par Mandates
0309         @code
0310         std::is_convertible< std::iterator_traits< FwdIt >::reference_type, param_pct_view >::value == true
0311         @endcode
0312 
0313         @par Complexity
0314         Linear in the size of the range.
0315 
0316         @par Exception Safety
0317         Strong guarantee.
0318         Calls to allocate may throw.
0319         Exceptions thrown on invalid input.
0320 
0321         @throw system_error
0322         The range contains an invalid percent-encoding.
0323 
0324         @param first, last The range of params
0325         to assign.
0326     */
0327     template<class FwdIt>
0328     void
0329     assign(FwdIt first, FwdIt last);
0330 
0331     //--------------------------------------------
0332 
0333     /** Append params
0334 
0335         This function appends a param to the view.
0336 
0337         <br>
0338         The `end()` iterator is invalidated.
0339 
0340         @par Example
0341         @code
0342         url u;
0343 
0344         u.encoded_params().append( { "first", "John" } );
0345         @endcode
0346 
0347         @par Complexity
0348         Linear in `this->url().encoded_query().size()`.
0349 
0350         @par Exception Safety
0351         Strong guarantee.
0352         Calls to allocate may throw.
0353         Exceptions thrown on invalid input.
0354 
0355         @throw system_error
0356         `p` contains an invalid percent-encoding.
0357 
0358         @return An iterator to the new element.
0359 
0360         @param p The param to append.
0361     */
0362     iterator
0363     append(
0364         param_pct_view const& p);
0365 
0366     /** Append params
0367 
0368         This function appends the params in
0369         an <em>initializer-list</em> to the view.
0370 
0371         <br>
0372         The `end()` iterator is invalidated.
0373 
0374         @par Example
0375         @code
0376         url u;
0377 
0378         u.encoded_params().append({ {"first", "John"}, {"last", "Doe"} });
0379         @endcode
0380 
0381         @par Complexity
0382         Linear in `this->url().encoded_query().size()`.
0383 
0384         @par Exception Safety
0385         Strong guarantee.
0386         Calls to allocate may throw.
0387         Exceptions thrown on invalid input.
0388 
0389         @throw system_error
0390         `init` contains an invalid percent-encoding.
0391 
0392         @return An iterator to the first new element.
0393 
0394         @param init The list of params to append.
0395     */
0396     iterator
0397     append(
0398         std::initializer_list<
0399             param_pct_view> init);
0400 
0401     /** Append params
0402 
0403         This function appends a range of params
0404         to the view.
0405 
0406         <br>
0407         The `end()` iterator is invalidated.
0408 
0409         @note
0410         The strings referenced by the inputs
0411         must not come from the underlying url,
0412         or else the behavior is undefined.
0413 
0414         @par Mandates
0415         @code
0416         std::is_convertible< std::iterator_traits< FwdIt >::reference_type, param_pct_view >::value == true
0417         @endcode
0418 
0419         @par Complexity
0420         Linear in `this->url().encoded_query().size()`.
0421 
0422         @par Exception Safety
0423         Strong guarantee.
0424         Calls to allocate may throw.
0425         Exceptions thrown on invalid input.
0426 
0427         @throw system_error
0428         The range contains an invalid percent-encoding.
0429 
0430         @return An iterator to the first new element.
0431 
0432         @param first, last The range of params
0433         to append.
0434     */
0435     template<class FwdIt>
0436     iterator
0437     append(
0438         FwdIt first, FwdIt last);
0439 
0440     //--------------------------------------------
0441 
0442     /** Insert params
0443 
0444         This function inserts a param
0445         before the specified position.
0446 
0447         <br>
0448         All iterators that are equal to
0449         `before` or come after are invalidated.
0450 
0451         @par Complexity
0452         Linear in `this->url().encoded_query().size()`.
0453 
0454         @par Exception Safety
0455         Strong guarantee.
0456         Calls to allocate may throw.
0457         Exceptions thrown on invalid input.
0458 
0459         @throw system_error
0460         `p` contains an invalid percent-encoding.
0461 
0462         @return An iterator to the inserted
0463         element.
0464 
0465         @param before An iterator before which
0466         the param is inserted. This may
0467         be equal to `end()`.
0468 
0469         @param p The param to insert.
0470     */
0471     iterator
0472     insert(
0473         iterator before,
0474         param_pct_view const& p);
0475 
0476     /** Insert params
0477 
0478         This function inserts the params in
0479         an <em>initializer-list</em> before
0480         the specified position.
0481 
0482         <br>
0483         All iterators that are equal to
0484         `before` or come after are invalidated.
0485 
0486         @note
0487         The strings referenced by the inputs
0488         must not come from the underlying url,
0489         or else the behavior is undefined.
0490 
0491         @par Complexity
0492         Linear in `this->url().encoded_query().size()`.
0493 
0494         @par Exception Safety
0495         Strong guarantee.
0496         Calls to allocate may throw.
0497         Exceptions thrown on invalid input.
0498 
0499         @throw system_error
0500         `init` contains an invalid percent-encoding.
0501 
0502         @return An iterator to the first
0503         element inserted, or `before` if
0504         `init.size() == 0`.
0505 
0506         @param before An iterator before which
0507         the element is inserted. This may
0508         be equal to `end()`.
0509 
0510         @param init The list of params to insert.
0511     */
0512     iterator
0513     insert(
0514         iterator before,
0515         std::initializer_list<
0516             param_pct_view> init);
0517 
0518     /** Insert params
0519 
0520         This function inserts a range of
0521         params before the specified position.
0522 
0523         <br>
0524         All iterators that are equal to
0525         `before` or come after are invalidated.
0526 
0527         @note
0528         The strings referenced by the inputs
0529         must not come from the underlying url,
0530         or else the behavior is undefined.
0531 
0532         @par Mandates
0533         @code
0534         std::is_convertible< std::iterator_traits< FwdIt >::reference_type, param_pct_view >::value == true
0535         @endcode
0536 
0537         @par Complexity
0538         Linear in `this->url().encoded_query().size()`.
0539 
0540         @par Exception Safety
0541         Strong guarantee.
0542         Calls to allocate may throw.
0543         Exceptions thrown on invalid input.
0544 
0545         @throw system_error
0546         The range contains an invalid percent-encoding.
0547 
0548         @return An iterator to the first
0549         element inserted, or `before` if
0550         `first == last`.
0551 
0552         @param before An iterator before which
0553         the element is inserted. This may
0554         be equal to `end()`.
0555 
0556         @param first, last The range of params
0557         to insert.
0558     */
0559     template<class FwdIt>
0560     iterator
0561     insert(
0562         iterator before,
0563         FwdIt first,
0564         FwdIt last);
0565 
0566     //--------------------------------------------
0567 
0568     /** Erase params
0569 
0570         This function removes an element from
0571         the container.
0572 
0573         <br>
0574         All iterators that are equal to
0575         `pos` or come after are invalidated.
0576 
0577         @par Example
0578         @code
0579         url u( "?first=John&last=Doe" );
0580 
0581         params_encoded_ref::iterator it = u.encoded_params().erase( u.encoded_params().begin() );
0582 
0583         assert( u.encoded_query() == "last=Doe" );
0584         @endcode
0585 
0586         @par Complexity
0587         Linear in `this->url().encoded_query().size()`.
0588 
0589         @par Exception Safety
0590         Throws nothing.
0591 
0592         @return An iterator to one past
0593         the removed element.
0594 
0595         @param pos An iterator to the element.
0596     */
0597     iterator
0598     erase(iterator pos) noexcept;
0599 
0600     /** Erase params
0601 
0602         This function removes a range of params
0603         from the container.
0604 
0605         <br>
0606         All iterators that are equal to
0607         `first` or come after are invalidated.
0608 
0609         @par Complexity
0610         Linear in `this->url().encoded_query().size()`.
0611 
0612         @par Exception Safety
0613         Throws nothing.
0614 
0615         @return An iterator to one past
0616         the removed range.
0617 
0618         @param first, last The range of
0619         params to erase.
0620     */
0621     iterator
0622     erase(
0623         iterator first,
0624         iterator last) noexcept;
0625 
0626     /** Erase params
0627 
0628         <br>
0629         All iterators are invalidated.
0630 
0631         @par Postconditions
0632         @code
0633         this->count( key, ic ) == 0
0634         @endcode
0635 
0636         @par Complexity
0637         Linear in `this->url().encoded_query().size()`.
0638 
0639         @par Exception Safety
0640         Exceptions thrown on invalid input.
0641 
0642         @throw system_error
0643         `key` contains an invalid percent-encoding.
0644 
0645         @return The number of params removed
0646         from the container.
0647 
0648         @param key The key to match.
0649         By default, a case-sensitive
0650         comparison is used.
0651 
0652         @param ic An optional parameter. If
0653         the value @ref ignore_case is passed
0654         here, the comparison is
0655         case-insensitive.
0656     */
0657     std::size_t
0658     erase(
0659         pct_string_view key,
0660         ignore_case_param ic = {}) noexcept;
0661 
0662     //--------------------------------------------
0663 
0664     /** Replace params
0665 
0666         This function replaces the contents
0667         of the element at `pos` with the
0668         specified param.
0669 
0670         <br>
0671         All iterators that are equal to
0672         `pos` or come after are invalidated.
0673 
0674         @note
0675         The strings passed in must not come
0676         from the element being replaced,
0677         or else the behavior is undefined.
0678 
0679         @par Example
0680         @code
0681         url u( "?first=John&last=Doe" );
0682 
0683         u.encoded_params().replace( u.encoded_params().begin(), { "title", "Mr" });
0684 
0685         assert( u.encoded_query() == "title=Mr&last=Doe" );
0686         @endcode
0687 
0688         @par Complexity
0689         Linear in `this->url().encoded_query().size()`.
0690 
0691         @par Exception Safety
0692         Strong guarantee.
0693         Calls to allocate may throw.
0694         Exceptions thrown on invalid input.
0695 
0696         @throw system_error
0697         `p` contains an invalid percent-encoding.
0698 
0699         @return An iterator to the element.
0700 
0701         @param pos An iterator to the element.
0702 
0703         @param p The param to assign.
0704     */
0705     iterator
0706     replace(
0707         iterator pos,
0708         param_pct_view const& p);
0709 
0710     /** Replace params
0711 
0712         This function replaces a range of
0713         params with the params in an
0714         <em>initializer-list</em>.
0715 
0716         <br>
0717         All iterators that are equal to
0718         `from` or come after are invalidated.
0719 
0720         @note
0721         The strings referenced by the inputs
0722         must not come from the underlying url,
0723         or else the behavior is undefined.
0724 
0725         @par Complexity
0726         Linear in `this->url().encoded_query().size()`.
0727 
0728         @par Exception Safety
0729         Strong guarantee.
0730         Calls to allocate may throw.
0731         Exceptions thrown on invalid input.
0732 
0733         @throw system_error
0734         `init` contains an invalid percent-encoding.
0735 
0736         @return An iterator to the first
0737         element inserted, or one past `to` if
0738         `init.size() == 0`.
0739 
0740         @param from,to The range of params
0741         to replace.
0742 
0743         @param init The list of params to assign.
0744     */
0745     iterator
0746     replace(
0747         iterator from,
0748         iterator to,
0749         std::initializer_list<
0750             param_pct_view> init);
0751 
0752     /** Replace params
0753 
0754         This function replaces a range of
0755         params with a range of params.
0756 
0757         <br>
0758         All iterators that are equal to
0759         `from` or come after are invalidated.
0760 
0761         @note
0762         The strings referenced by the inputs
0763         must not come from the underlying url,
0764         or else the behavior is undefined.
0765 
0766         @par Mandates
0767         @code
0768         std::is_convertible< std::iterator_traits< FwdIt >::reference_type, param_pct_view >::value == true
0769         @endcode
0770 
0771         @par Complexity
0772         Linear in `this->url().encoded_query().size()`.
0773 
0774         @par Exception Safety
0775         Strong guarantee.
0776         Calls to allocate may throw.
0777         Exceptions thrown on invalid input.
0778 
0779         @throw system_error
0780         The range contains an invalid percent-encoding.
0781 
0782         @return An iterator to the first
0783         element inserted, or one past `to` if
0784         `first == last`.
0785 
0786         @param from,to The range of params to
0787         replace.
0788 
0789         @param first, last The range of params
0790         to assign.
0791     */
0792     template<class FwdIt>
0793     iterator
0794     replace(
0795         iterator from,
0796         iterator to,
0797         FwdIt first,
0798         FwdIt last);
0799 
0800     //--------------------------------------------
0801 
0802     /** Remove the value on an element
0803 
0804         This function removes the value of
0805         an element at the specified position.
0806         After the call returns, `has_value`
0807         for the element is false.
0808 
0809         <br>
0810         All iterators that are equal to
0811         `pos` or come after are invalidated.
0812 
0813         @par Example
0814         @code
0815         url u( "?first=John&last=Doe" );
0816 
0817         u.encoded_params().unset( u.encoded_params().begin() );
0818 
0819         assert( u.encoded_query() == "first&last=Doe" );
0820         @endcode
0821 
0822         @par Complexity
0823         Linear in `this->url().encoded_query().size()`.
0824 
0825         @par Exception Safety
0826         Throws nothing.
0827 
0828         @return An iterator to the element.
0829 
0830         @param pos An iterator to the element.
0831     */
0832     iterator
0833     unset(
0834         iterator pos) noexcept;
0835 
0836     /** Set a value
0837 
0838         This function replaces the value of an
0839         element at the specified position.
0840 
0841         <br>
0842         All iterators that are equal to
0843         `pos` or come after are invalidated.
0844 
0845         @note
0846         The string passed in must not come
0847         from the element being replaced,
0848         or else the behavior is undefined.
0849 
0850         @par Example
0851         @code
0852         url u( "?id=42&id=69" );
0853 
0854         u.encoded_params().set( u.encoded_params().begin(), "none" );
0855 
0856         assert( u.encoded_query() == "id=none&id=69" );
0857         @endcode
0858 
0859         @par Complexity
0860         Linear in `this->url().encoded_query().size()`.
0861 
0862         @par Exception Safety
0863         Strong guarantee.
0864         Calls to allocate may throw.
0865         Exceptions thrown on invalid input.
0866 
0867         @throw system_error
0868         `value` contains an invalid percent-encoding.
0869 
0870         @return An iterator to the element.
0871 
0872         @param pos An iterator to the element.
0873 
0874         @param value The value to assign. The
0875         empty string still counts as a value.
0876         That is, `has_value` for the element
0877         is true.
0878     */
0879     iterator
0880     set(
0881         iterator pos,
0882         pct_string_view value);
0883 
0884     /** Set a value
0885 
0886         This function performs one of two
0887         actions depending on the value of
0888         `this->contains( key, ic )`.
0889 
0890         @li If key is contained in the view
0891         then one of the matching params has
0892         its value changed to the specified value.
0893         The remaining params with a matching
0894         key are erased. Otherwise,
0895 
0896         @li If `key` is not contained in the
0897         view, then the function apppends the
0898         param `{ key, value }`.
0899 
0900         <br>
0901         All iterators are invalidated.
0902 
0903         @note
0904         The strings passed in must not come
0905         from the element being replaced,
0906         or else the behavior is undefined.
0907 
0908         @par Example
0909         @code
0910         url u( "?id=42&id=69" );
0911 
0912         u.encoded_params().set( "id", "none" );
0913 
0914         assert( u.encoded_params().count( "id" ) == 1 );
0915         @endcode
0916 
0917         @par Postconditions
0918         @code
0919         this->count( key, ic ) == 1 && this->find( key, ic )->value == value
0920         @endcode
0921 
0922         @par Complexity
0923         Linear in `this->url().encoded_query().size()`.
0924 
0925         @par Exception Safety
0926         Strong guarantee.
0927         Calls to allocate may throw.
0928         Exceptions thrown on invalid input.
0929 
0930         @throw system_error
0931         `key` or `value` contain an invalid
0932         percent-encoding.
0933 
0934         @return An iterator to the appended
0935         or modified element.
0936 
0937         @param key The key to match.
0938         By default, a case-sensitive
0939         comparison is used.
0940 
0941         @param value The value to assign. The
0942         empty string still counts as a value.
0943         That is, `has_value` for the element
0944         is true.
0945 
0946         @param ic An optional parameter. If
0947         the value @ref ignore_case is passed
0948         here, the comparison is
0949         case-insensitive.
0950     */
0951     iterator
0952     set(
0953         pct_string_view key,
0954         pct_string_view value,
0955         ignore_case_param ic = {});
0956 
0957 private:
0958     detail::params_iter_impl
0959     find_impl(
0960         detail::params_iter_impl,
0961         pct_string_view,
0962         ignore_case_param) const noexcept;
0963 
0964     detail::params_iter_impl
0965     find_last_impl(
0966         detail::params_iter_impl,
0967         pct_string_view,
0968         ignore_case_param) const noexcept;
0969 
0970     template<class FwdIt>
0971     void
0972     assign(FwdIt first, FwdIt last,
0973         std::forward_iterator_tag);
0974 
0975     // Doxygen cannot render ` = delete`
0976     template<class FwdIt>
0977     void
0978     assign(FwdIt first, FwdIt last,
0979            std::input_iterator_tag) = delete;
0980 
0981     template<class FwdIt>
0982     iterator
0983     insert(
0984         iterator before,
0985         FwdIt first,
0986         FwdIt last,
0987         std::forward_iterator_tag);
0988 
0989     // Doxygen cannot render ` = delete`
0990     template<class FwdIt>
0991     iterator
0992     insert(
0993         iterator before,
0994         FwdIt first,
0995         FwdIt last,
0996         std::input_iterator_tag) = delete;
0997 };
0998 
0999 } // urls
1000 } // boost
1001 
1002 // This is in <boost/url/url_base.hpp>
1003 //
1004 // #include <boost/url/impl/params_encoded_ref.hpp>
1005 
1006 #endif