params_encoded_ref.hpp 24 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006
  1. //
  2. // Copyright (c) 2019 Vinnie Falco ([email protected])
  3. // Copyright (c) 2022 Alan de Freitas ([email protected])
  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. #ifndef BOOST_URL_PARAMS_ENCODED_REF_HPP
  11. #define BOOST_URL_PARAMS_ENCODED_REF_HPP
  12. #include <boost/url/detail/config.hpp>
  13. #include <boost/url/ignore_case.hpp>
  14. #include <boost/url/params_encoded_view.hpp>
  15. #include <initializer_list>
  16. namespace boost {
  17. namespace urls {
  18. #ifndef BOOST_URL_DOCS
  19. class url_base;
  20. class params_encoded_view;
  21. #endif
  22. /** A view representing query parameters in a URL
  23. Objects of this type are used to interpret
  24. the query parameters as a bidirectional view
  25. of key value pairs.
  26. The view does not retain ownership of the
  27. elements and instead references the original
  28. url. The caller is responsible for ensuring
  29. that the lifetime of the referenced url
  30. extends until it is no longer referenced.
  31. The view is modifiable; calling non-const
  32. members causes changes to the referenced
  33. url.
  34. @par Example
  35. @code
  36. url u( "?first=John&last=Doe" );
  37. params_encoded_ref p = u.encoded_params();
  38. @endcode
  39. Strings produced when elements are returned
  40. have type @ref param_pct_view and represent
  41. encoded strings. Strings passed to member
  42. functions may contain percent escapes, and
  43. throw exceptions on invalid inputs.
  44. @par Iterator Invalidation
  45. Changes to the underlying character buffer
  46. can invalidate iterators which reference it.
  47. Modifications made through the container
  48. invalidate some iterators to the underlying
  49. character buffer:
  50. @li @ref append : Only `end()`.
  51. @li @ref assign, @ref clear,
  52. `operator=` : All params.
  53. @li @ref erase : Erased params and all
  54. params after (including `end()`).
  55. @li @ref insert : All params at or after
  56. the insertion point (including `end()`).
  57. @li @ref replace, @ref set : Modified
  58. params and all params
  59. after (including `end()`).
  60. */
  61. class BOOST_URL_DECL params_encoded_ref
  62. : public params_encoded_base
  63. {
  64. friend class url_base;
  65. url_base* u_ = nullptr;
  66. params_encoded_ref(
  67. url_base& u) noexcept;
  68. public:
  69. //--------------------------------------------
  70. //
  71. // Special Members
  72. //
  73. //--------------------------------------------
  74. /** Constructor
  75. After construction, both views
  76. reference the same url. Ownership is not
  77. transferred; the caller is responsible
  78. for ensuring the lifetime of the url
  79. extends until it is no longer
  80. referenced.
  81. @par Postconditions
  82. @code
  83. &this->url() == &other.url();
  84. @endcode
  85. @par Complexity
  86. Constant.
  87. @par Exception Safety
  88. Throws nothing.
  89. @param other The other view.
  90. */
  91. params_encoded_ref(
  92. params_encoded_ref const& other) = default;
  93. /** Assignment
  94. The previous contents of this are
  95. replaced by the contents of `other.
  96. <br>
  97. All iterators are invalidated.
  98. @note
  99. The strings referenced by `other`
  100. must not come from the underlying url,
  101. or else the behavior is undefined.
  102. @par Effects
  103. @code
  104. this->assign( other.begin(), other.end() );
  105. @endcode
  106. @par Complexity
  107. Linear in `other.buffer().size()`.
  108. @par Exception Safety
  109. Strong guarantee.
  110. Calls to allocate may throw.
  111. @param other The params to assign.
  112. */
  113. params_encoded_ref&
  114. operator=(
  115. params_encoded_ref const& other);
  116. /** Assignment
  117. After assignment, the previous contents
  118. of the query parameters are replaced by
  119. the contents of the initializer-list.
  120. <br>
  121. All iterators are invalidated.
  122. @par Preconditions
  123. None of character buffers referenced by
  124. `init` may overlap the character buffer of
  125. the underlying url, or else the behavior
  126. is undefined.
  127. @par Effects
  128. @code
  129. this->assign( init.begin(), init.end() );
  130. @endcode
  131. @par Complexity
  132. Linear in `init.size()`.
  133. @par Exception Safety
  134. Strong guarantee.
  135. Calls to allocate may throw.
  136. Exceptions thrown on invalid input.
  137. @throw system_error
  138. `init` contains an invalid percent-encoding.
  139. @param init The list of params to assign.
  140. */
  141. params_encoded_ref&
  142. operator=(std::initializer_list<
  143. param_pct_view> init);
  144. /** Conversion
  145. @par Complexity
  146. Constant.
  147. @par Exception Safety
  148. Throws nothing.
  149. */
  150. operator
  151. params_encoded_view() const noexcept;
  152. //--------------------------------------------
  153. //
  154. // Observers
  155. //
  156. //--------------------------------------------
  157. /** Return the referenced url
  158. This function returns the url referenced
  159. by the view.
  160. @par Example
  161. @code
  162. url u( "?key=value" );
  163. assert( &u.encoded_params().url() == &u );
  164. @endcode
  165. @par Exception Safety
  166. @code
  167. Throws nothing.
  168. @endcode
  169. */
  170. url_base&
  171. url() const noexcept
  172. {
  173. return *u_;
  174. }
  175. //--------------------------------------------
  176. //
  177. // Modifiers
  178. //
  179. //--------------------------------------------
  180. /** Clear the contents of the container
  181. <br>
  182. All iterators are invalidated.
  183. @par Effects
  184. @code
  185. this->url().remove_query();
  186. @endcode
  187. @par Postconditions
  188. @code
  189. this->empty() == true && this->url().has_query() == false
  190. @endcode
  191. @par Complexity
  192. Constant.
  193. @par Exception Safety
  194. Throws nothing.
  195. */
  196. void
  197. clear() noexcept;
  198. //--------------------------------------------
  199. /** Assign params
  200. This function replaces the entire
  201. contents of the view with the params
  202. in the <em>initializer-list</em>.
  203. <br>
  204. All iterators are invalidated.
  205. @note
  206. The strings referenced by the inputs
  207. must not come from the underlying url,
  208. or else the behavior is undefined.
  209. @par Example
  210. @code
  211. url u;
  212. u.encoded_params().assign({ { "first", "John" }, { "last", "Doe" } });
  213. @endcode
  214. @par Complexity
  215. Linear in `init.size()`.
  216. @par Exception Safety
  217. Strong guarantee.
  218. Calls to allocate may throw.
  219. Exceptions thrown on invalid input.
  220. @throw system_error
  221. `init` contains an invalid percent-encoding.
  222. @param init The list of params to assign.
  223. */
  224. void
  225. assign(
  226. std::initializer_list<
  227. param_pct_view> init);
  228. /** Assign params
  229. This function replaces the entire
  230. contents of the view with the params
  231. in the range.
  232. <br>
  233. All iterators are invalidated.
  234. @note
  235. The strings referenced by the inputs
  236. must not come from the underlying url,
  237. or else the behavior is undefined.
  238. @par Mandates
  239. @code
  240. std::is_convertible< std::iterator_traits< FwdIt >::reference_type, param_pct_view >::value == true
  241. @endcode
  242. @par Complexity
  243. Linear in the size of the range.
  244. @par Exception Safety
  245. Strong guarantee.
  246. Calls to allocate may throw.
  247. Exceptions thrown on invalid input.
  248. @throw system_error
  249. The range contains an invalid percent-encoding.
  250. @param first, last The range of params
  251. to assign.
  252. */
  253. template<class FwdIt>
  254. void
  255. assign(FwdIt first, FwdIt last);
  256. //--------------------------------------------
  257. /** Append params
  258. This function appends a param to the view.
  259. <br>
  260. The `end()` iterator is invalidated.
  261. @par Example
  262. @code
  263. url u;
  264. u.encoded_params().append( { "first", "John" } );
  265. @endcode
  266. @par Complexity
  267. Linear in `this->url().encoded_query().size()`.
  268. @par Exception Safety
  269. Strong guarantee.
  270. Calls to allocate may throw.
  271. Exceptions thrown on invalid input.
  272. @throw system_error
  273. `p` contains an invalid percent-encoding.
  274. @return An iterator to the new element.
  275. @param p The param to append.
  276. */
  277. iterator
  278. append(
  279. param_pct_view const& p);
  280. /** Append params
  281. This function appends the params in
  282. an <em>initializer-list</em> to the view.
  283. <br>
  284. The `end()` iterator is invalidated.
  285. @par Example
  286. @code
  287. url u;
  288. u.encoded_params().append({ {"first", "John"}, {"last", "Doe"} });
  289. @endcode
  290. @par Complexity
  291. Linear in `this->url().encoded_query().size()`.
  292. @par Exception Safety
  293. Strong guarantee.
  294. Calls to allocate may throw.
  295. Exceptions thrown on invalid input.
  296. @throw system_error
  297. `init` contains an invalid percent-encoding.
  298. @return An iterator to the first new element.
  299. @param init The list of params to append.
  300. */
  301. iterator
  302. append(
  303. std::initializer_list<
  304. param_pct_view> init);
  305. /** Append params
  306. This function appends a range of params
  307. to the view.
  308. <br>
  309. The `end()` iterator is invalidated.
  310. @note
  311. The strings referenced by the inputs
  312. must not come from the underlying url,
  313. or else the behavior is undefined.
  314. @par Mandates
  315. @code
  316. std::is_convertible< std::iterator_traits< FwdIt >::reference_type, param_pct_view >::value == true
  317. @endcode
  318. @par Complexity
  319. Linear in `this->url().encoded_query().size()`.
  320. @par Exception Safety
  321. Strong guarantee.
  322. Calls to allocate may throw.
  323. Exceptions thrown on invalid input.
  324. @throw system_error
  325. The range contains an invalid percent-encoding.
  326. @return An iterator to the first new element.
  327. @param first, last The range of params
  328. to append.
  329. */
  330. template<class FwdIt>
  331. iterator
  332. append(
  333. FwdIt first, FwdIt last);
  334. //--------------------------------------------
  335. /** Insert params
  336. This function inserts a param
  337. before the specified position.
  338. <br>
  339. All iterators that are equal to
  340. `before` or come after are invalidated.
  341. @par Complexity
  342. Linear in `this->url().encoded_query().size()`.
  343. @par Exception Safety
  344. Strong guarantee.
  345. Calls to allocate may throw.
  346. Exceptions thrown on invalid input.
  347. @throw system_error
  348. `p` contains an invalid percent-encoding.
  349. @return An iterator to the inserted
  350. element.
  351. @param before An iterator before which
  352. the param is inserted. This may
  353. be equal to `end()`.
  354. @param p The param to insert.
  355. */
  356. iterator
  357. insert(
  358. iterator before,
  359. param_pct_view const& p);
  360. /** Insert params
  361. This function inserts the params in
  362. an <em>initializer-list</em> before
  363. the specified position.
  364. <br>
  365. All iterators that are equal to
  366. `before` or come after are invalidated.
  367. @note
  368. The strings referenced by the inputs
  369. must not come from the underlying url,
  370. or else the behavior is undefined.
  371. @par Complexity
  372. Linear in `this->url().encoded_query().size()`.
  373. @par Exception Safety
  374. Strong guarantee.
  375. Calls to allocate may throw.
  376. Exceptions thrown on invalid input.
  377. @throw system_error
  378. `init` contains an invalid percent-encoding.
  379. @return An iterator to the first
  380. element inserted, or `before` if
  381. `init.size() == 0`.
  382. @param before An iterator before which
  383. the element is inserted. This may
  384. be equal to `end()`.
  385. @param init The list of params to insert.
  386. */
  387. iterator
  388. insert(
  389. iterator before,
  390. std::initializer_list<
  391. param_pct_view> init);
  392. /** Insert params
  393. This function inserts a range of
  394. params before the specified position.
  395. <br>
  396. All iterators that are equal to
  397. `before` or come after are invalidated.
  398. @note
  399. The strings referenced by the inputs
  400. must not come from the underlying url,
  401. or else the behavior is undefined.
  402. @par Mandates
  403. @code
  404. std::is_convertible< std::iterator_traits< FwdIt >::reference_type, param_pct_view >::value == true
  405. @endcode
  406. @par Complexity
  407. Linear in `this->url().encoded_query().size()`.
  408. @par Exception Safety
  409. Strong guarantee.
  410. Calls to allocate may throw.
  411. Exceptions thrown on invalid input.
  412. @throw system_error
  413. The range contains an invalid percent-encoding.
  414. @return An iterator to the first
  415. element inserted, or `before` if
  416. `first == last`.
  417. @param before An iterator before which
  418. the element is inserted. This may
  419. be equal to `end()`.
  420. @param first, last The range of params
  421. to insert.
  422. */
  423. template<class FwdIt>
  424. iterator
  425. insert(
  426. iterator before,
  427. FwdIt first,
  428. FwdIt last);
  429. //--------------------------------------------
  430. /** Erase params
  431. This function removes an element from
  432. the container.
  433. <br>
  434. All iterators that are equal to
  435. `pos` or come after are invalidated.
  436. @par Example
  437. @code
  438. url u( "?first=John&last=Doe" );
  439. params_encoded_ref::iterator it = u.encoded_params().erase( u.encoded_params().begin() );
  440. assert( u.encoded_query() == "last=Doe" );
  441. @endcode
  442. @par Complexity
  443. Linear in `this->url().encoded_query().size()`.
  444. @par Exception Safety
  445. Throws nothing.
  446. @return An iterator to one past
  447. the removed element.
  448. @param pos An iterator to the element.
  449. */
  450. iterator
  451. erase(iterator pos) noexcept;
  452. /** Erase params
  453. This function removes a range of params
  454. from the container.
  455. <br>
  456. All iterators that are equal to
  457. `first` or come after are invalidated.
  458. @par Complexity
  459. Linear in `this->url().encoded_query().size()`.
  460. @par Exception Safety
  461. Throws nothing.
  462. @return An iterator to one past
  463. the removed range.
  464. @param first, last The range of
  465. params to erase.
  466. */
  467. iterator
  468. erase(
  469. iterator first,
  470. iterator last) noexcept;
  471. /** Erase params
  472. <br>
  473. All iterators are invalidated.
  474. @par Postconditions
  475. @code
  476. this->count( key, ic ) == 0
  477. @endcode
  478. @par Complexity
  479. Linear in `this->url().encoded_query().size()`.
  480. @par Exception Safety
  481. Exceptions thrown on invalid input.
  482. @throw system_error
  483. `key` contains an invalid percent-encoding.
  484. @return The number of params removed
  485. from the container.
  486. @param key The key to match.
  487. By default, a case-sensitive
  488. comparison is used.
  489. @param ic An optional parameter. If
  490. the value @ref ignore_case is passed
  491. here, the comparison is
  492. case-insensitive.
  493. */
  494. std::size_t
  495. erase(
  496. pct_string_view key,
  497. ignore_case_param ic = {}) noexcept;
  498. //--------------------------------------------
  499. /** Replace params
  500. This function replaces the contents
  501. of the element at `pos` with the
  502. specified param.
  503. <br>
  504. All iterators that are equal to
  505. `pos` or come after are invalidated.
  506. @note
  507. The strings passed in must not come
  508. from the element being replaced,
  509. or else the behavior is undefined.
  510. @par Example
  511. @code
  512. url u( "?first=John&last=Doe" );
  513. u.encoded_params().replace( u.encoded_params().begin(), { "title", "Mr" });
  514. assert( u.encoded_query() == "title=Mr&last=Doe" );
  515. @endcode
  516. @par Complexity
  517. Linear in `this->url().encoded_query().size()`.
  518. @par Exception Safety
  519. Strong guarantee.
  520. Calls to allocate may throw.
  521. Exceptions thrown on invalid input.
  522. @throw system_error
  523. `p` contains an invalid percent-encoding.
  524. @return An iterator to the element.
  525. @param pos An iterator to the element.
  526. @param p The param to assign.
  527. */
  528. iterator
  529. replace(
  530. iterator pos,
  531. param_pct_view const& p);
  532. /** Replace params
  533. This function replaces a range of
  534. params with the params in an
  535. <em>initializer-list</em>.
  536. <br>
  537. All iterators that are equal to
  538. `from` or come after are invalidated.
  539. @note
  540. The strings referenced by the inputs
  541. must not come from the underlying url,
  542. or else the behavior is undefined.
  543. @par Complexity
  544. Linear in `this->url().encoded_query().size()`.
  545. @par Exception Safety
  546. Strong guarantee.
  547. Calls to allocate may throw.
  548. Exceptions thrown on invalid input.
  549. @throw system_error
  550. `init` contains an invalid percent-encoding.
  551. @return An iterator to the first
  552. element inserted, or one past `to` if
  553. `init.size() == 0`.
  554. @param from,to The range of params
  555. to replace.
  556. @param init The list of params to assign.
  557. */
  558. iterator
  559. replace(
  560. iterator from,
  561. iterator to,
  562. std::initializer_list<
  563. param_pct_view> init);
  564. /** Replace params
  565. This function replaces a range of
  566. params with a range of params.
  567. <br>
  568. All iterators that are equal to
  569. `from` or come after are invalidated.
  570. @note
  571. The strings referenced by the inputs
  572. must not come from the underlying url,
  573. or else the behavior is undefined.
  574. @par Mandates
  575. @code
  576. std::is_convertible< std::iterator_traits< FwdIt >::reference_type, param_pct_view >::value == true
  577. @endcode
  578. @par Complexity
  579. Linear in `this->url().encoded_query().size()`.
  580. @par Exception Safety
  581. Strong guarantee.
  582. Calls to allocate may throw.
  583. Exceptions thrown on invalid input.
  584. @throw system_error
  585. The range contains an invalid percent-encoding.
  586. @return An iterator to the first
  587. element inserted, or one past `to` if
  588. `first == last`.
  589. @param from,to The range of params to
  590. replace.
  591. @param first, last The range of params
  592. to assign.
  593. */
  594. template<class FwdIt>
  595. iterator
  596. replace(
  597. iterator from,
  598. iterator to,
  599. FwdIt first,
  600. FwdIt last);
  601. //--------------------------------------------
  602. /** Remove the value on an element
  603. This function removes the value of
  604. an element at the specified position.
  605. After the call returns, `has_value`
  606. for the element is false.
  607. <br>
  608. All iterators that are equal to
  609. `pos` or come after are invalidated.
  610. @par Example
  611. @code
  612. url u( "?first=John&last=Doe" );
  613. u.encoded_params().unset( u.encoded_params().begin() );
  614. assert( u.encoded_query() == "first&last=Doe" );
  615. @endcode
  616. @par Complexity
  617. Linear in `this->url().encoded_query().size()`.
  618. @par Exception Safety
  619. Throws nothing.
  620. @return An iterator to the element.
  621. @param pos An iterator to the element.
  622. */
  623. iterator
  624. unset(
  625. iterator pos) noexcept;
  626. /** Set a value
  627. This function replaces the value of an
  628. element at the specified position.
  629. <br>
  630. All iterators that are equal to
  631. `pos` or come after are invalidated.
  632. @note
  633. The string passed in must not come
  634. from the element being replaced,
  635. or else the behavior is undefined.
  636. @par Example
  637. @code
  638. url u( "?id=42&id=69" );
  639. u.encoded_params().set( u.encoded_params().begin(), "none" );
  640. assert( u.encoded_query() == "id=none&id=69" );
  641. @endcode
  642. @par Complexity
  643. Linear in `this->url().encoded_query().size()`.
  644. @par Exception Safety
  645. Strong guarantee.
  646. Calls to allocate may throw.
  647. Exceptions thrown on invalid input.
  648. @throw system_error
  649. `value` contains an invalid percent-encoding.
  650. @return An iterator to the element.
  651. @param pos An iterator to the element.
  652. @param value The value to assign. The
  653. empty string still counts as a value.
  654. That is, `has_value` for the element
  655. is true.
  656. */
  657. iterator
  658. set(
  659. iterator pos,
  660. pct_string_view value);
  661. /** Set a value
  662. This function performs one of two
  663. actions depending on the value of
  664. `this->contains( key, ic )`.
  665. @li If key is contained in the view
  666. then one of the matching params has
  667. its value changed to the specified value.
  668. The remaining params with a matching
  669. key are erased. Otherwise,
  670. @li If `key` is not contained in the
  671. view, then the function apppends the
  672. param `{ key, value }`.
  673. <br>
  674. All iterators are invalidated.
  675. @note
  676. The strings passed in must not come
  677. from the element being replaced,
  678. or else the behavior is undefined.
  679. @par Example
  680. @code
  681. url u( "?id=42&id=69" );
  682. u.encoded_params().set( "id", "none" );
  683. assert( u.encoded_params().count( "id" ) == 1 );
  684. @endcode
  685. @par Postconditions
  686. @code
  687. this->count( key, ic ) == 1 && this->find( key, ic )->value == value
  688. @endcode
  689. @par Complexity
  690. Linear in `this->url().encoded_query().size()`.
  691. @par Exception Safety
  692. Strong guarantee.
  693. Calls to allocate may throw.
  694. Exceptions thrown on invalid input.
  695. @throw system_error
  696. `key` or `value` contain an invalid
  697. percent-encoding.
  698. @return An iterator to the appended
  699. or modified element.
  700. @param key The key to match.
  701. By default, a case-sensitive
  702. comparison is used.
  703. @param value The value to assign. The
  704. empty string still counts as a value.
  705. That is, `has_value` for the element
  706. is true.
  707. @param ic An optional parameter. If
  708. the value @ref ignore_case is passed
  709. here, the comparison is
  710. case-insensitive.
  711. */
  712. iterator
  713. set(
  714. pct_string_view key,
  715. pct_string_view value,
  716. ignore_case_param ic = {});
  717. private:
  718. detail::params_iter_impl
  719. find_impl(
  720. detail::params_iter_impl,
  721. pct_string_view,
  722. ignore_case_param) const noexcept;
  723. detail::params_iter_impl
  724. find_last_impl(
  725. detail::params_iter_impl,
  726. pct_string_view,
  727. ignore_case_param) const noexcept;
  728. template<class FwdIt>
  729. void
  730. assign(FwdIt first, FwdIt last,
  731. std::forward_iterator_tag);
  732. // Doxygen cannot render ` = delete`
  733. template<class FwdIt>
  734. void
  735. assign(FwdIt first, FwdIt last,
  736. std::input_iterator_tag) = delete;
  737. template<class FwdIt>
  738. iterator
  739. insert(
  740. iterator before,
  741. FwdIt first,
  742. FwdIt last,
  743. std::forward_iterator_tag);
  744. // Doxygen cannot render ` = delete`
  745. template<class FwdIt>
  746. iterator
  747. insert(
  748. iterator before,
  749. FwdIt first,
  750. FwdIt last,
  751. std::input_iterator_tag) = delete;
  752. };
  753. } // urls
  754. } // boost
  755. // This is in <boost/url/url_base.hpp>
  756. //
  757. // #include <boost/url/impl/params_encoded_ref.hpp>
  758. #endif