Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Close stale issues and PRs / stale (push) Successful in 13s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
536 lines
40 KiB
HTML
536 lines
40 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
|
||
<meta name="generator" content="Doxygen 1.9.4"/>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||
<title>Range-v3: Release Notes</title>
|
||
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
||
<script type="text/javascript" src="jquery.js"></script>
|
||
<script type="text/javascript" src="dynsections.js"></script>
|
||
<link href="navtree.css" rel="stylesheet" type="text/css"/>
|
||
<script type="text/javascript" src="resize.js"></script>
|
||
<script type="text/javascript" src="navtreedata.js"></script>
|
||
<script type="text/javascript" src="navtree.js"></script>
|
||
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
||
<script type="text/javascript" src="search/searchdata.js"></script>
|
||
<script type="text/javascript" src="search/search.js"></script>
|
||
<script type="text/javascript">
|
||
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
|
||
$(document).ready(function() { init_search(); });
|
||
/* @license-end */
|
||
</script>
|
||
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
||
</head>
|
||
<body>
|
||
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||
<div id="titlearea">
|
||
<table cellspacing="0" cellpadding="0">
|
||
<tbody>
|
||
<tr id="projectrow">
|
||
<td id="projectalign">
|
||
<div id="projectname">Range-v3
|
||
</div>
|
||
<div id="projectbrief">Range algorithms, views, and actions for the Standard Library</div>
|
||
</td>
|
||
<td> <div id="MSearchBox" class="MSearchBoxInactive">
|
||
<span class="left">
|
||
<img id="MSearchSelect" src="search/mag_sel.svg"
|
||
onmouseover="return searchBox.OnSearchSelectShow()"
|
||
onmouseout="return searchBox.OnSearchSelectHide()"
|
||
alt=""/>
|
||
<input type="text" id="MSearchField" value="Search" accesskey="S"
|
||
onfocus="searchBox.OnSearchFieldFocus(true)"
|
||
onblur="searchBox.OnSearchFieldFocus(false)"
|
||
onkeyup="searchBox.OnSearchFieldChange(event)"/>
|
||
</span><span class="right">
|
||
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.svg" alt=""/></a>
|
||
</span>
|
||
</div>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
<!-- end header part -->
|
||
<!-- Generated by Doxygen 1.9.4 -->
|
||
<script type="text/javascript">
|
||
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
|
||
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
|
||
/* @license-end */
|
||
</script>
|
||
</div><!-- top -->
|
||
<div id="side-nav" class="ui-resizable side-nav-resizable">
|
||
<div id="nav-tree">
|
||
<div id="nav-tree-contents">
|
||
<div id="nav-sync" class="sync"></div>
|
||
</div>
|
||
</div>
|
||
<div id="splitbar" style="-moz-user-select:none;"
|
||
class="ui-resizable-handle">
|
||
</div>
|
||
</div>
|
||
<script type="text/javascript">
|
||
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
|
||
$(document).ready(function(){initNavTree('release_notes.html',''); initResizable(); });
|
||
/* @license-end */
|
||
</script>
|
||
<div id="doc-content">
|
||
<!-- window showing the filter options -->
|
||
<div id="MSearchSelectWindow"
|
||
onmouseover="return searchBox.OnSearchSelectShow()"
|
||
onmouseout="return searchBox.OnSearchSelectHide()"
|
||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
||
</div>
|
||
|
||
<!-- iframe showing the search results (closed by default) -->
|
||
<div id="MSearchResultsWindow">
|
||
<iframe src="javascript:void(0)" frameborder="0"
|
||
name="MSearchResults" id="MSearchResults">
|
||
</iframe>
|
||
</div>
|
||
|
||
<div><div class="header">
|
||
<div class="headertitle"><div class="title">Release Notes </div></div>
|
||
</div><!--header-->
|
||
<div class="contents">
|
||
<div class="textblock"><p ><a class="anchor" id="md_release_notes"></a></p>
|
||
<h1><a class="anchor" id="v0-12-0"></a>
|
||
Version 0.12.0 "Dude, Where's My Bored Ape?"</h1>
|
||
<p ><em>Released:</em> June 19, 2022</p>
|
||
<blockquote class="doxtable">
|
||
<p >‍<b>IMPORTANT:</b> This release deprecates <code>views::group_by</code> which was an endless source of confusion. <code>group_by</code> is replaced with <code>views::chunk_by</code> (which, beware, has <em>subtly</em> different semantics, see below.) </p>
|
||
</blockquote>
|
||
<p>Changes:</p><ul>
|
||
<li><b>NEW:</b> <code>views::chunk_by</code> which, like the old <code>views::group_by</code> it replaces, splits a range into a range-of-ranges, where adjacent elements satisfy a binary predicate (<a href="https://github.com/ericniebler/range-v3/pull/1648">#1648</a>). [<em>Note:</em> Whereas <code>views::group_by</code> evaluated the predicate between the current element and the <em>first</em> element in the chunk, <code>views::chunk_by</code> evaluates the predicate between <em>adjacent</em> elements. – <em>end note</em>]</li>
|
||
<li><b>NEW:</b> <code>constexpr</code> all the algorithms that are <code>constexpr</code> in C++20's <code>std::ranges</code> (<a href="https://github.com/ericniebler/range-v3/pull/1683">#1683</a>).</li>
|
||
<li><b>NEW:</b> Fold algorithms from <a href="http://wg21.link/P2322">P2322</a> (<a href="https://github.com/ericniebler/range-v3/pull/1628">#1628</a>), (<a href="https://github.com/ericniebler/range-v3/pull/1668">#1668</a>).</li>
|
||
<li><b>NEW:</b> <code><a class="el" href="classranges_1_1unformatted__ostream__iterator.html" title="Writes to an ostream object using the unformatted std::basic_ostream::write operation....">ranges::unformatted_ostream_iterator</a></code> (<a href="https://github.com/ericniebler/range-v3/pull/1586">#1586</a>).</li>
|
||
<li><b>NEW:</b> Support for the <code>build2</code> build system (<a href="https://github.com/ericniebler/range-v3/pull/1562">#1562</a>).</li>
|
||
<li>Implement <a href="http://wg21.link/P2328">P2328</a>: relax the constraint on <code><a class="el" href="structranges_1_1join__view.html">ranges::join_view</a></code> to support joining ranges of prvalue non-<code>view</code> ranges (<a href="https://github.com/ericniebler/range-v3/pull/1655">#1655</a>).</li>
|
||
<li>Improved algorithm for <code>ranges::linear_distribute</code> (<a href="https://github.com/ericniebler/range-v3/pull/1679">#1679</a>).</li>
|
||
<li>Renamed <code>safe_subrange_t</code> to <code>borrowed_subrange_t</code> (<a href="https://github.com/ericniebler/range-v3/pull/1542">#1542</a>).</li>
|
||
<li>Extend <code>ranges::to</code> to support conversion to container-of-containers (<a href="https://github.com/ericniebler/range-v3/pull/1553">#1553</a>).</li>
|
||
<li><code>views::enumerate</code> can be a <code>borrowed_view</code> (<a href="https://github.com/ericniebler/range-v3/pull/1571">#1571</a>).</li>
|
||
<li><code>ranges::upper_bound</code> works in the presence of overloaded <code>operator&</code> (<a href="https://github.com/ericniebler/range-v3/pull/1632">#1632</a>).</li>
|
||
<li>Input iterators are no longer required to be default-constructible (<a href="https://github.com/ericniebler/range-v3/pull/1652">#1652</a>).</li>
|
||
</ul>
|
||
<p >Bugs fixed:</p><ul>
|
||
<li><code>ranges::to<std::map>(v)</code> does not work (<a href="https://github.com/ericniebler/range-v3/pull/1700">#1700</a>)</li>
|
||
<li><code>ranges::reverse_iterator</code> has the wrong <code>value_type</code> when reversing a proxy range (<a href="https://github.com/ericniebler/range-v3/pull/1670">#1670</a>).</li>
|
||
<li>A post-increment of a <code>ranges::counted_iterator</code> wrapping an input iterator with a <code>void</code>-returning post-increment operator isn't incrementing the count (<a href="https://github.com/ericniebler/range-v3/pull/1664">#1664</a>).</li>
|
||
<li>Bad assert in <code>views::drop_last</code> (<a href="https://github.com/ericniebler/range-v3/pull/1599">#1599</a>).</li>
|
||
<li>Read of uninitialized <code>bool</code> in <code>views::cache1</code> (<a href="https://github.com/ericniebler/range-v3/pull/1610">#1610</a>).</li>
|
||
<li><code>ranges::unstable_remove_if</code> calls predicate on same element twice (<a href="https://github.com/ericniebler/range-v3/pull/1629">#1629</a>).</li>
|
||
<li><code>ranges::on(f,g)(x...)</code> should be <code>f(g(x)...)</code> instead of <code>f(g(x...))</code> (<a href="https://github.com/ericniebler/range-v3/pull/1661">#1661</a>).</li>
|
||
<li>Broken qualification of cmake targets (<a href="https://github.com/ericniebler/range-v3/pull/1557">#1557</a>).</li>
|
||
<li>Various portability and documentation fixes.</li>
|
||
</ul>
|
||
<p ><b>Credits:</b> I would like to thank the following people who contributed to this release (in no particular order): Barry Revzin, @dvirtz, Gonzalo Brito, Johel Ernesto Guerrero Peña, Joël Lamotte, Doug Roeper, Facundo Tuesca, Vitaly Zaitsev, @23rd, @furkanusta, Jonathan Haigh, @SmorkalovG, @marehr, Matt Beardsley, Chris Glover, Louis Dionne, Jin Shang (@js8544), Hui Xie, @huixie90, Robert Maynard, Silver Zachara, @sergegers, Théo DELRIEU, @LesnyRumcajs, Yehezkel Bernat, Maciej Patro, Klemens Nanni, Thomas Madlener, and Jason Merrill.</p>
|
||
<p >&#127881; Special thanks to Barry Revzin for stepping up to be part-time co-maintainer of range-v3. &#127881;</p>
|
||
<h1><a class="anchor" id="v0-11-0"></a>
|
||
Version 0.11.0 "Thanks, ISO"</h1>
|
||
<p ><em>Released:</em> August 6, 2020</p>
|
||
<blockquote class="doxtable">
|
||
<p >‍<b>IMPORTANT:</b> This release removes the heuristic that tries to guess whether a range type </p>
|
||
</blockquote>
|
||
<p>is a "view" (lightweight, non-owning range), in accordance with the C++20. <b>This is a potentially source-breaking change.</b> Code that previously used an rvalue range as the start of a pipeline could stop compiling if the range library is not explicitly told that that range type is a view. To override the new default, please specialize the <code>ranges::enable_view<R></code> Boolean variable template.</p>
|
||
<blockquote class="doxtable">
|
||
<p >‍<b>IMPORTANT:</b> This release removes the implicit conversion from views to containers. </p>
|
||
</blockquote>
|
||
<p>To construct a container from an arbitrary range, you must now explicitly use <code>ranges::to</code>. For example, the following code no longer works: </p><blockquote class="doxtable">
|
||
<p >‍ </p><div class="fragment"><div class="line"> {c++}</div>
|
||
<div class="line">std::vector<int> is = ranges::views::ints(0, 10); // ERROR: no conversion</div>
|
||
</div><!-- fragment --><p >Instead, please write this as:</p>
|
||
<div class="fragment"><div class="line"> {c++}</div>
|
||
<div class="line">auto is = ranges::views::ints(0, 10) | ranges::to<std::vector>; // OK</div>
|
||
</div><!-- fragment --><p ><code>ranges::to</code> lives in header <code><<a class="el" href="conversion_8hpp.html">range/v3/range/conversion.hpp</a>></code> </p>
|
||
</blockquote>
|
||
<blockquote class="doxtable">
|
||
<p >‍<b>IMPORTANT:</b> This release drops support for llvm-3.9. </p>
|
||
</blockquote>
|
||
<p>Changes:</p><ul>
|
||
<li><b>NEW:</b> A new concepts portability layer that short-circuits atomic constraints in <code>requires</code> clauses for better compile times when emulating concepts.</li>
|
||
<li><b>NEW:</b> Restored support for MSVC in <code>/std:c++17</code> mode, and for MSVC's default preprocessor.</li>
|
||
<li>Remove the implicit conversion from views to containers.</li>
|
||
<li>Rename the following entities to be consistent with C++20's <code>std::ranges</code> support:<ul>
|
||
<li><code>safe_range<R></code> -> <code>borrowed_range<R></code></li>
|
||
<li><code>enable_safe_range<R></code> -> <code>enable_borrowed_range<R></code></li>
|
||
<li><code>safe_iterator_t<R></code> -> <code>borrowed_iterator_t<R></code></li>
|
||
<li><code>safe_subrange_t<R></code> -> <code>borrowed_subrange_t<R></code></li>
|
||
<li><code>readable_traits<I></code> -> <code>indirectly_readable_traits<I></code></li>
|
||
<li><code>readable<I></code> -> <code>indirectly_readable<I></code></li>
|
||
<li><code>writable<I></code> -> <code>indirectly_writable<I></code></li>
|
||
</ul>
|
||
</li>
|
||
<li>Added the following to the <code>ranges::cpp20</code> namespace:<ul>
|
||
<li>Algorithm <code>for_each_n</code></li>
|
||
<li>Algorithm <code>sample</code></li>
|
||
<li>Class <code>view_base</code></li>
|
||
<li>Alias <code>views::all_t</code></li>
|
||
</ul>
|
||
</li>
|
||
<li>Type <code>__int128</code> is recognized as "integer-like".</li>
|
||
<li>Adds concepts <code>three_way_comparable[_with]</code> when <code><=></code> is supported.</li>
|
||
<li>Adds concepts <code>partially_ordered[_with]</code>.</li>
|
||
<li>Better conformance with C++20's use of the _<code>boolean-testable</code>_ concept.</li>
|
||
<li>Support C++20 coroutines.</li>
|
||
<li>Honor CMake's <code>CMAKE_CXX_STANDARD</code> variable.</li>
|
||
<li>A fix for the cardinality of <code>views::zip[_with]</code> (<a href="https://github.com/ericniebler/range-v3/pull/1486">#1486</a>).</li>
|
||
<li>Add <code>view_interface::data()</code> member function.</li>
|
||
<li>Add necessary specializations for <code>std::basic_common_reference</code> and <code>std::common_type</code>.</li>
|
||
<li>Numerous workarounds for MSVC.</li>
|
||
<li>Various CMake fixes and improvements.</li>
|
||
<li><code>drop_while_view</code> is not a <code>sized_range</code>.</li>
|
||
<li>Added support for Wind River Systems.</li>
|
||
<li>Bug fixes to <code>views::group_by</code> (<a href="https://github.com/ericniebler/range-v3/pull/1393">#1393</a>).</li>
|
||
<li><code>common_[reference|type]</code> of <code>common_[tuple|pair]</code> now yields a <code>common_[tuple|pair]</code> instead of a <code>std::[tuple|pair]</code> (<a href="https://github.com/ericniebler/range-v3/pull/1422">#1422</a>).</li>
|
||
<li>Avoid UB when currying an lvalue in some views and actions (<a href="https://github.com/ericniebler/range-v3/pull/1320">#1320</a>).</li>
|
||
</ul>
|
||
<p ><b>Credits:</b> I would like to thank the following people who contributed to this release (in no particular order): Christopher Di Bella, @marehr, Casey Carter, Dvir Yitzchaki, Justin Riddell, Johel Ernesto Guerrero Peña, Barry Revzin, Kamlesh Kumar, and Vincas Dargis.</p>
|
||
<h1><a class="anchor" id="v0-10-0"></a>
|
||
Version 0.10.0 "To Err is Human"</h1>
|
||
<p ><em>Released:</em> Dec 6, 2019.</p>
|
||
<p ><b>IMPORTANT:</b> Before upgrading, please note that several older compiler versions and build configurations are no longer supported! In particular, MSVC now needs <code>/std:c++latest</code>.</p>
|
||
<p ><b>ALSO:</b> When taking a dependency on the <code>range-v3</code>, <code>meta</code>, or <code>concepts</code> libraries via CMake, please now use the namespace qualified target names:</p><ul>
|
||
<li><code>range-v3::range-v3</code></li>
|
||
<li><code>range-v3<a class="el" href="namespacemeta.html" title="Tiny metaprogramming library.">meta</a></code></li>
|
||
<li><code>range-v3::concepts</code></li>
|
||
</ul>
|
||
<p >Changes:</p><ul>
|
||
<li><b>NEW:</b> Rewritten concepts portability layer with simpler macros for better diagnostics.</li>
|
||
<li><b>NEW:</b> The <code>views::cache1</code> view caches the most recent value in the range. This can help avoid reevaluation of transformations in complex view pipelines.</li>
|
||
<li><b>NEW:</b> <code>ranges::contains</code> algorithm.</li>
|
||
<li><b>NEW:</b> <code>enable_safe_range</code> trait for opting in to the <em>forwarding-range</em> concept. These are ranges whose iterators remain valid even after the range itself has been destroyed; <em>e.g.</em>, <code>std::string_view</code> and <code><a class="el" href="structranges_1_1subrange.html">ranges::subrange</a></code>.</li>
|
||
<li>The <code>readable</code> concept has changed such that types that are not <em>indirectly</em> readable with <code>operator*</code> (<em>e.g., <code>std::optional</code>) no longer satisfy that concept.</em></li>
|
||
<li><em>Using <code>views::join</code> to join a range of xvalue ranges works again.</em></li>
|
||
<li><em>The following range access primitives no longer accept temporary containers (_i.e.</em>, they refuse to return references known to be dangling):<ul>
|
||
<li><code>range::front</code></li>
|
||
<li><code>range::back</code></li>
|
||
<li><code>range::at</code></li>
|
||
<li><code>range::index</code></li>
|
||
</ul>
|
||
</li>
|
||
<li><code>views::concat</code> with a single argument now simply returns its argument.</li>
|
||
<li><code><a class="el" href="structranges_1_1ostream__iterator.html">ranges::ostream_iterator</a><T></code> now coerces arguments to <code>T</code> before inserting them into the wrapped ostream.</li>
|
||
<li>Smaller iterators for <code>views::transform</code> and <code>views::take_while</code>.</li>
|
||
<li><code>actions::split</code> and <code>actions::split_when</code> now support partial application and pipelining (<a href="https://github.com/ericniebler/range-v3/issues/1085">#1085</a>).</li>
|
||
<li><code>views::group_by</code> and its iterator both get a <code>.base()</code> member to access the underlying range and iterator, respectively.</li>
|
||
<li>Improved diagnostics with clang.</li>
|
||
<li>Assorted bug fixes and compiler work-arounds: <a href="https://github.com/ericniebler/range-v3/issues/284">#284</a>, <a href="https://github.com/ericniebler/range-v3/issues/491">#491</a>, <a href="https://github.com/ericniebler/range-v3/issues/499">#499</a>, <a href="https://github.com/ericniebler/range-v3/issues/871">#871</a>, <a href="https://github.com/ericniebler/range-v3/issues/1022">#1022</a>, <a href="https://github.com/ericniebler/range-v3/issues/1043">#1043</a>, <a href="https://github.com/ericniebler/range-v3/issues/1081">#1081</a>, <a href="https://github.com/ericniebler/range-v3/issues/1085">#1085</a>, <a href="https://github.com/ericniebler/range-v3/issues/1101">#1101</a>, <a href="https://github.com/ericniebler/range-v3/issues/1116">#1116</a>, <a href="https://github.com/ericniebler/range-v3/issues/1296">#1296</a>, <a href="https://github.com/ericniebler/range-v3/issues/1305">#1305</a>, and <a href="https://github.com/ericniebler/range-v3/issues/1335">#1335</a>.</li>
|
||
</ul>
|
||
<p >Many thanks to GitHub users @CaseyCarter, @morinmorin, @h-2, @MichaelWJung, @johelegp, @marehr, @alkino, @xuning97, @BRevzin, and @mpusz for their contributions.</p>
|
||
<h1><a class="anchor" id="v0-9-1"></a>
|
||
Version 0.9.1</h1>
|
||
<p ><em>Released:</em> Sept 1, 2019.</p>
|
||
<p >gcc-9.x portability fixes.</p>
|
||
<h1><a class="anchor" id="v0-9-0"></a>
|
||
Version 0.9.0 "Std::ranger Things"</h1>
|
||
<p ><em>Released:</em> Aug 26, 2019.</p>
|
||
<p >Bring many interfaces into sync with the C++20 draft.</p>
|
||
<ul>
|
||
<li><b>NEW:</b> An improved concepts portability layer with macros that use C++20 concepts when the compiler supports them.</li>
|
||
<li><b>NEW:</b> An improved directory structure that keeps disjoint parts of the library – iterators, ranges, algorithms, actions, views, functional programming support, and general utilities – physically separate.</li>
|
||
<li><b>NEW:</b> A <code>RANGES_DEEP_STL_INTEGRATION</code> configuration option that makes your STL implementation default to structural conformance to infer iterator category, as in C++20. Applies to libc++, libstdc++, and MSVC's Standard Library.</li>
|
||
<li><b>NEW:</b> A <code>ranges::cpp20</code> namespace that contains all the functionality of C++20's <code>std::ranges</code> namespace.</li>
|
||
<li>All concept names have been given standard_case (renamed from PascalCase) and have been harmonized with the C++20 draft.</li>
|
||
<li>The following range access customization points no longer accept rvalue ranges by default:<ul>
|
||
<li><code>ranges::begin</code></li>
|
||
<li><code>ranges::end</code></li>
|
||
<li><code>ranges::rbegin</code></li>
|
||
<li><code>ranges::rend</code></li>
|
||
<li><code>ranges::cbegin</code></li>
|
||
<li><code>ranges::cend</code></li>
|
||
<li><code>ranges::crbegin</code></li>
|
||
<li><code>ranges::crend</code></li>
|
||
<li><code>ranges::data</code></li>
|
||
<li><code>ranges::cdata</code></li>
|
||
</ul>
|
||
</li>
|
||
<li>Iterators may specify an <code>iterator_concept</code> type alias in addition to <code>iterator_category</code> – either as a nested type or as a member of a <code>std::iterator_traits</code> specialization – to denote conformance to the C++20 iterator concepts as distinct from the C++98 iterator requirements. (See <a href="http://wg21.link/p1037">P1037 "Deep Integration of the Ranges TS"</a> for more information.)</li>
|
||
<li>The <code>ranges::value_type</code> trait has been renamed to <code>readable_traits</code>.</li>
|
||
<li>The <code>ranges::difference_type</code> trait has been renamed to <code>incrementable_traits</code>.</li>
|
||
<li>The <code>ranges::iterator_category</code> trait has been deprecated. Specialize <code>std::iterator_traits</code> to non-intrusively specify an iterator's category and (optionally) concept.</li>
|
||
<li>Rename the <code>ranges::view</code> namespace to <code>ranges::views</code> and <code>ranges::action</code> to <code>ranges::actions</code> (with deprecated namespace aliases for migration).</li>
|
||
<li>Rename <code>view::bounded</code> to <code>views::common</code>.</li>
|
||
<li>Rename <code>unreachable</code> to <code>unreachable_sentinel_t</code>.</li>
|
||
<li>Change <code>dangling</code> from a class template that wraps an iterator to a class that acts as a placeholder for an iterator that would otherwise dangle.</li>
|
||
<li>Implement C++20's <code>subrange</code> as a view that wraps an iterator/sentinel pair; deprecate <code>iterator_range</code>.</li>
|
||
<li>Deprecate implicit conversion from view types to containers; rename <code>ranges::to_</code> to <code>ranges::to</code> and extend it to support converting a range-of-ranges to a container-of-containers.</li>
|
||
<li>Deprecate the <code>ranges::v3</code> inline versioning namespace.</li>
|
||
<li><p class="startli">The following views have had minor changes to bring them into conformance with the C++20 working draft:</p><ul>
|
||
<li><code>join_view</code></li>
|
||
<li><code>single_view</code></li>
|
||
<li><code>empty_view</code></li>
|
||
<li><code>split_view</code></li>
|
||
<li><code>reverse_view</code></li>
|
||
<li><code>all_view</code></li>
|
||
<li><code>take_view</code></li>
|
||
<li><code>iota_view</code> </li>
|
||
</ul>
|
||
<p class="startli"><code>iota_view<std::[u]intmax_t></code>, in particular, is given a user-defined <code>difference_type</code> that avoids integer overflow.</p>
|
||
</li>
|
||
<li>New names for the iterator and range type aliases: <table class="markdownTable">
|
||
<tr class="markdownTableHead">
|
||
<th class="markdownTableHeadNone">Old Name </th><th class="markdownTableHeadNone">New Name </th></tr>
|
||
<tr class="markdownTableRowOdd">
|
||
<td class="markdownTableBodyNone"><code>value_type_t</code> </td><td class="markdownTableBodyNone"><code>iter_value_t</code> </td></tr>
|
||
<tr class="markdownTableRowEven">
|
||
<td class="markdownTableBodyNone"><code>reference_t</code> </td><td class="markdownTableBodyNone"><code>iter_reference_t</code> </td></tr>
|
||
<tr class="markdownTableRowOdd">
|
||
<td class="markdownTableBodyNone"><code>difference_type_t</code> </td><td class="markdownTableBodyNone"><code>iter_difference_t</code> </td></tr>
|
||
<tr class="markdownTableRowEven">
|
||
<td class="markdownTableBodyNone"><code>size_type_t</code> </td><td class="markdownTableBodyNone"><em>deprecated</em> </td></tr>
|
||
<tr class="markdownTableRowOdd">
|
||
<td class="markdownTableBodyNone"><code>rvalue_reference_t</code> </td><td class="markdownTableBodyNone"><code>iter_rvalue_reference_t</code> </td></tr>
|
||
<tr class="markdownTableRowEven">
|
||
<td class="markdownTableBodyNone"><code>range_value_type_t</code> </td><td class="markdownTableBodyNone"><code>range_value_t</code> </td></tr>
|
||
<tr class="markdownTableRowOdd">
|
||
<td class="markdownTableBodyNone"><code>range_difference_type_t</code> </td><td class="markdownTableBodyNone"><code>range_difference_t</code> </td></tr>
|
||
<tr class="markdownTableRowEven">
|
||
<td class="markdownTableBodyNone"><code>range_size_type_t</code> </td><td class="markdownTableBodyNone"><code>range_size_t</code> </td></tr>
|
||
</table>
|
||
</li>
|
||
</ul>
|
||
<h1><a class="anchor" id="v0-5-0"></a>
|
||
Version 0.5.0</h1>
|
||
<p ><em>Released:</em> Apr 30, 2019.</p>
|
||
<ul>
|
||
<li><b>NEW:</b> MSVC support, from @CaseyCarter :tada: (See the docs for the list of supported compilers.)</li>
|
||
<li><b>NEW:</b> <code>view::enumerate</code>, from @MikeGitb</li>
|
||
<li><b>NEW:</b> <code>view::addressof</code>, from @tower120</li>
|
||
<li><b>NEW:</b> <code>unstable_remove_if</code> algorithm and action, from @tower120</li>
|
||
<li><b>NEW:</b> <code>adjacent_remove_if</code> algorithm and action, from @cjdb</li>
|
||
<li><b>NEW:</b> <code>ostream_joiner</code>, from @sv1990</li>
|
||
<li><code>view::drop_while</code> and <code>view::take_while</code> get projection support, from @mrpi</li>
|
||
<li><code>view::filter</code> and <code>view::remove_if</code> get projection support, from @mrpi</li>
|
||
<li><code>view::unique</code> accepts optional comparison operator, from @tete17</li>
|
||
<li><code>action::slice</code> supports sliding from the end, from @tete17</li>
|
||
<li>Support coroutines on MSVC, from @CaseyCarter</li>
|
||
<li>Faster <code>view::generate_n</code>, from GitHub user @tower120</li>
|
||
<li>Improved aligned new detection for libc++ on iOS, from @mtak-</li>
|
||
<li>Various CMake improvements, from @johelegp</li>
|
||
<li><code>view_adaptor</code> supports <code>basic_iterator</code>-style mixins, from @tower120</li>
|
||
<li>Fix <code>ranges::advance</code> for random-access iterators for <code>n==0</code>, from @tower120</li>
|
||
<li>Bugs fixed: <a href="https://github.com/ericniebler/range-v3/issues/755">#755</a>, <a href="https://github.com/ericniebler/range-v3/issues/759">#759</a>, <a href="https://github.com/ericniebler/range-v3/issues/942">#942</a>, <a href="https://github.com/ericniebler/range-v3/issues/946">#946</a>, <a href="https://github.com/ericniebler/range-v3/issues/952">#952</a>, <a href="https://github.com/ericniebler/range-v3/issues/975">#975</a>, <a href="https://github.com/ericniebler/range-v3/issues/978">#978</a>, <a href="https://github.com/ericniebler/range-v3/issues/986">#986</a>, <a href="https://github.com/ericniebler/range-v3/issues/996">#996</a>, <a href="https://github.com/ericniebler/range-v3/issues/1041">#1041</a>, <a href="https://github.com/ericniebler/range-v3/issues/1047">#1047</a>, <a href="https://github.com/ericniebler/range-v3/issues/1088">#1088</a>, <a href="https://github.com/ericniebler/range-v3/issues/1094">#1094</a>, <a href="https://github.com/ericniebler/range-v3/issues/1107">#1107</a>, <a href="https://github.com/ericniebler/range-v3/issues/1129">#1129</a></li>
|
||
</ul>
|
||
<h1><a class="anchor" id="v0-4-0"></a>
|
||
Version 0.4.0</h1>
|
||
<p ><em>Released:</em> Oct 18, 2018.</p>
|
||
<ul>
|
||
<li>Minor interface-breaking changes:<ul>
|
||
<li><code>single_view</code> returns by <code>const &</code> (see <a href="https://github.com/ericniebler/range-v3/issues/817">#817</a>).</li>
|
||
<li><code>reverse_view</code> of a non-Sized, non-Bounded RandomAccess range (eg., a null-terminated string) no longer satisfies SizedRange.</li>
|
||
<li>The <code>generate</code> and <code>generate_n</code> views now return the generated values by xvalue reference (<code>T &&</code>) to the value cached within the view (see <a href="https://github.com/ericniebler/range-v3/issues/905">#905</a>).</li>
|
||
<li>Views no longer prefer returning constant iterators when they can; some views have different constant and mutable iterators.</li>
|
||
</ul>
|
||
</li>
|
||
<li>Enhancements:<ul>
|
||
<li>Views can successfully adapt other views that have different constant and mutable iterators.</li>
|
||
<li>The <code>single</code> and <code>empty</code> views are much closer to the versions as specified in <a href="http://wg21.link/P0896">P0896</a>.</li>
|
||
</ul>
|
||
</li>
|
||
<li>Bug fixes:<ul>
|
||
<li>"single_view should not copy the value" <a href="https://github.com/ericniebler/range-v3/issues/817">#817</a>.</li>
|
||
<li>"Calling back() on strided range does not return the correct last value in range" <a href="https://github.com/ericniebler/range-v3/issues/901">#901</a>.</li>
|
||
<li>"generate(foo) | take(n) calls foo n+1 times" <a href="https://github.com/ericniebler/range-v3/issues/819">#819</a>.</li>
|
||
<li>"generate seems broken with move-only return types" <a href="https://github.com/ericniebler/range-v3/issues/905">#905</a>.</li>
|
||
<li>"Unexpected behavior in generate with return by reference" <a href="https://github.com/ericniebler/range-v3/issues/807">#807</a>.</li>
|
||
<li>"Inconsistent behaviour of ranges::distance with ranges::view::zip using infinite views." <a href="https://github.com/ericniebler/range-v3/issues/783">#783</a>.</li>
|
||
<li>"Infinite loop when using ranges::view::cycle with an infinite range" <a href="https://github.com/ericniebler/range-v3/issues/780">#780</a>.</li>
|
||
<li>"Composing ranges::view::cycle with ranges::view::slice" <a href="https://github.com/ericniebler/range-v3/issues/778">#778</a>.</li>
|
||
<li>"cartesian_product view, now with moar bugs." <a href="https://github.com/ericniebler/range-v3/issues/919">#919</a>.</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<h1><a class="anchor" id="v0-3-7"></a>
|
||
Version 0.3.7</h1>
|
||
<p ><em>Released:</em> Sept 19, 2018.</p>
|
||
<ul>
|
||
<li>Improved support for clang-cl (thanks to @CaseyCarter).</li>
|
||
<li>Fix for <code>any_view<T, category::sized | category::input></code> (see #869).</li>
|
||
<li>Fix <code>iter_move</code> of a <code>ranges::reverse_iterator</code> (see #888).</li>
|
||
<li>Fix <code>move_sentinel</code> comparisons (see #889).</li>
|
||
<li>Avoid ambiguity created by <code>boost::advance</code> and <code>std::advance</code> (see #893).</li>
|
||
</ul>
|
||
<h1><a class="anchor" id="v0-3-6"></a>
|
||
Version 0.3.6</h1>
|
||
<p ><em>Released:</em> May 15, 2018.</p>
|
||
<ul>
|
||
<li>NEW: <code>view::exclusive_scan</code> (thanks to GitHub user @mitsutaka-takeda).</li>
|
||
<li>All views get non-<code>const</code> overloads of <code>.<a class="el" href="group__list.html#gae64f0978e680ad1a96438c0756b4644d" title="An Boolean integral constant wrapper around true if L is an empty type list; false,...">empty()</a></code> and <code>.<a class="el" href="group__list.html#ga82704ab3563d63460b7ac1be6c9876c9" title="An integral constant wrapper that is the size of the meta::list L.">size()</a></code> (see <a href="https://github.com/ericniebler/stl2/issues/793">ericniebler/stl2#793</a>).</li>
|
||
<li>Upgrade Conan support for conan 1.0.</li>
|
||
<li><code>subspan</code> interface tweaks.</li>
|
||
<li>Fix bug in <code>view::split</code> (see <a href="https://stackoverflow.com/questions/49015671">this stackoverflow question</a>).</li>
|
||
<li>Fix bug in <code>view::stride</code> (see <a href="https://github.com/ericniebler/stl2/issues/805">ericniebler/stl2#805</a>).</li>
|
||
<li>Fix <code>const</code>-correctness problem in <code>view::chunk</code> (see <a href="https://stackoverflow.com/questions/49210190">this stackoverflow question</a>).</li>
|
||
<li>Replace uses of <code>ranges::result_of</code> with <code><a class="el" href="structranges_1_1invoke__result.html">ranges::invoke_result</a></code>.</li>
|
||
<li>Fix potential buffer overrun of <code>view::drop</code> over RandomAccessRanges.</li>
|
||
<li>Lots of <code>view::cartesian_product</code> fixes (see <a href="https://github.com/ericniebler/stl2/issues/820">ericniebler/stl2#820</a>, <a href="https://github.com/ericniebler/stl2/issues/823">ericniebler/stl2#823</a>).</li>
|
||
<li>Work around gcc-8 regression regarding <code>volatile</code> <code>std::initializer_list</code>s (see <a href="https://github.com/ericniebler/stl2/issues/826">ericniebler/stl2#826</a>).</li>
|
||
<li>Fix <code>const</code>-correctness problem of <code>view::take</code>.</li>
|
||
</ul>
|
||
<h1><a class="anchor" id="v0-3-5"></a>
|
||
Version 0.3.5</h1>
|
||
<p ><em>Released:</em> February 17, 2018.</p>
|
||
<ul>
|
||
<li>Rvalues may satisfy <code>Writable</code> (see <a href="https://github.com/ericniebler/stl2/issues/387">ericniebler/stl2#387</a>).</li>
|
||
<li><code>view_interface</code> gets a bounds-checking <code>at</code> method.</li>
|
||
<li><code>chunk_view</code> works on Input ranges.</li>
|
||
<li>Fix bug in <code>group_by_view</code>.</li>
|
||
<li>Improved concept checks for <code>partial_sum</code> numeric algorithm.</li>
|
||
<li>Define <code>ContiguousIterator</code> concept and <code>contiguous_iterator_tag</code> iterator category tag.</li>
|
||
<li>Sundry <code>span</code> fixes.</li>
|
||
<li><code>action::insert</code> avoids interfering with <code>vector</code>'s exponentional growth strategy.</li>
|
||
<li>Add an experimental <code>shared</code> view for views that need container-like scratch space to do their work.</li>
|
||
<li>Faster, simpler <code>reverse_view</code>.</li>
|
||
<li>Rework <code><a class="el" href="structranges_1_1reference__wrapper.html">ranges::reference_wrapper</a></code> to avoid <a href="https://wg21.link/lwg2993">LWG#2993</a>.</li>
|
||
<li>Reworked <code>any_view</code>, the type-erased view wrapper.</li>
|
||
<li><code>equal</code> algorithm is <code>constexpr</code> in C++14.</li>
|
||
<li><code>stride_view</code> no longer needs an <code>atomic</code> data member.</li>
|
||
<li><code>const</code>-correct <code>drop_view</code>.</li>
|
||
<li><code>adjacent_filter_view</code> supports bidirectional iteration.</li>
|
||
<li>Massive <code>view_adaptor</code> cleanup to remove the need for a <code>mutable</code> data member holding the adapted view.</li>
|
||
<li>Fix <code>counting_iterator</code> post-increment bug.</li>
|
||
<li><code>tail_view</code> of an empty range is an empty range, not undefined behavior.</li>
|
||
<li>Various portability fixes for gcc and clang trunk.</li>
|
||
</ul>
|
||
<h1><a class="anchor" id="v0-3-0"></a>
|
||
Version 0.3.0</h1>
|
||
<p ><em>Released:</em> June 30, 2017.</p>
|
||
<ul>
|
||
<li>Input views may now be move-only (from @CaseyCarter)</li>
|
||
<li>Input <code>any_view</code>s are now <em>much</em> more efficient (from @CaseyCarter)</li>
|
||
<li>Better support for systems lacking a working <code><thread></code> header (from @CaseyCarter)</li>
|
||
</ul>
|
||
<h1><a class="anchor" id="v0-2-6"></a>
|
||
Version 0.2.6</h1>
|
||
<p ><em>Released:</em> June 21, 2017.</p>
|
||
<ul>
|
||
<li>Experimental coroutines with <code>ranges::experimental::generator</code> (from @CaseyCarter)</li>
|
||
<li><code><a class="el" href="structranges_1_1optional.html">ranges::optional</a></code> now behaves like <code>std::optional</code> (from @CaseyCarter)</li>
|
||
<li>Extensive bug fixes with Input ranges (from @CaseyCarter)</li>
|
||
</ul>
|
||
<h1><a class="anchor" id="v0-2-5"></a>
|
||
Version 0.2.5</h1>
|
||
<p ><em>Released:</em> May 16, 2017.</p>
|
||
<ul>
|
||
<li><code>view::chunk</code> works on Input ranges (from @CaseyCarter)</li>
|
||
<li><code>for_each_n</code> algorithm (from @khlebnikov)</li>
|
||
<li>Portability fixes for MinGW, clang-3.6 and -3.7, and gcc-7; and cmake 3.0</li>
|
||
</ul>
|
||
<h1><a class="anchor" id="v0-2-4"></a>
|
||
Version 0.2.4</h1>
|
||
<p ><em>Released:</em> April 12, 2017.</p>
|
||
<p >Fix the following bug:</p><ul>
|
||
<li><code>action::stable_sort</code> of <code>vector</code> broken on Clang 3.8.1 since ~last Xmas (ericniebler/range-v3#632).</li>
|
||
</ul>
|
||
<h1><a class="anchor" id="v0-2-3"></a>
|
||
Version 0.2.3</h1>
|
||
<p ><em>Released:</em> April 4, 2017.</p>
|
||
<p >Fix the following bug:</p><ul>
|
||
<li>iterators that return move-only types by value do not satisfy Readable (ericniebler/stl2#399).</li>
|
||
</ul>
|
||
<h1><a class="anchor" id="v0-2-2"></a>
|
||
Version 0.2.2</h1>
|
||
<p ><em>Released:</em> March 30, 2017.</p>
|
||
<p >New in this release:</p><ul>
|
||
<li><code>view::linear_distribute(from,to,n)</code> - A view of <code>n</code> elements between <code>from</code> and <code>to</code>, distributed evenly.</li>
|
||
<li><code>view::indices(n)</code> - A view of the indices <code>[0,1,2...n-1]</code>.</li>
|
||
<li><code>view::closed_indices(n)</code> - A view of the indices <code>[0,1,2...n]</code>.</li>
|
||
</ul>
|
||
<p >This release deprecates <code>view::ints(n)</code> as confusing to new users.</p>
|
||
<h1><a class="anchor" id="v0-2-1"></a>
|
||
Version 0.2.1</h1>
|
||
<p ><em>Released:</em> March 22, 2017.</p>
|
||
<p >New in this release:</p><ul>
|
||
<li><code>view::cartesian_product</code></li>
|
||
<li><code>action::reverse</code></li>
|
||
</ul>
|
||
<h1><a class="anchor" id="v0-2-0"></a>
|
||
Version 0.2.0</h1>
|
||
<p ><em>Released:</em> March 13, 2017.</p>
|
||
<p >Bring many interfaces into sync with the Ranges TS.</p><ul>
|
||
<li>Many interfaces are simply renamed. The following table shows the old names and the new. (All names are in the <code>ranges::v3</code> namespace.) <table class="markdownTable">
|
||
<tr class="markdownTableHead">
|
||
<th class="markdownTableHeadNone">Old Name </th><th class="markdownTableHeadNone">New Name </th></tr>
|
||
<tr class="markdownTableRowOdd">
|
||
<td class="markdownTableBodyNone"><code>indirect_swap</code> </td><td class="markdownTableBodyNone"><code>iter_swap</code> </td></tr>
|
||
<tr class="markdownTableRowEven">
|
||
<td class="markdownTableBodyNone"><code>indirect_move</code> </td><td class="markdownTableBodyNone"><code>iter_move</code> </td></tr>
|
||
<tr class="markdownTableRowOdd">
|
||
<td class="markdownTableBodyNone"><code>iterator_value_t</code> </td><td class="markdownTableBodyNone"><code>value_type_t</code> </td></tr>
|
||
<tr class="markdownTableRowEven">
|
||
<td class="markdownTableBodyNone"><code>iterator_reference_t</code> </td><td class="markdownTableBodyNone"><code>reference_t</code> </td></tr>
|
||
<tr class="markdownTableRowOdd">
|
||
<td class="markdownTableBodyNone"><code>iterator_difference_t</code> </td><td class="markdownTableBodyNone"><code>difference_type_t</code> </td></tr>
|
||
<tr class="markdownTableRowEven">
|
||
<td class="markdownTableBodyNone"><code>iterator_size_t</code> </td><td class="markdownTableBodyNone"><code>size_type_t</code> </td></tr>
|
||
<tr class="markdownTableRowOdd">
|
||
<td class="markdownTableBodyNone"><code>iterator_rvalue_reference_t</code> </td><td class="markdownTableBodyNone"><code>rvalue_reference_t</code> </td></tr>
|
||
<tr class="markdownTableRowEven">
|
||
<td class="markdownTableBodyNone"><code>iterator_common_reference_t</code> </td><td class="markdownTableBodyNone"><code>iter_common_reference_t</code> </td></tr>
|
||
<tr class="markdownTableRowOdd">
|
||
<td class="markdownTableBodyNone"><code>range_value_t</code> </td><td class="markdownTableBodyNone"><code>range_value_type_t</code> </td></tr>
|
||
<tr class="markdownTableRowEven">
|
||
<td class="markdownTableBodyNone"><code>range_difference_t</code> </td><td class="markdownTableBodyNone"><code>range_difference_type_t</code> </td></tr>
|
||
<tr class="markdownTableRowOdd">
|
||
<td class="markdownTableBodyNone"><code>range_size_t</code> </td><td class="markdownTableBodyNone"><code>range_size_type_t</code> </td></tr>
|
||
<tr class="markdownTableRowEven">
|
||
<td class="markdownTableBodyNone"><code>range_iterator_t</code> </td><td class="markdownTableBodyNone"><code>iterator_t</code> </td></tr>
|
||
<tr class="markdownTableRowOdd">
|
||
<td class="markdownTableBodyNone"><code>range_sentinel_t</code> </td><td class="markdownTableBodyNone"><code>sentinel_t</code> </td></tr>
|
||
</table>
|
||
</li>
|
||
<li><code>common_iterator</code> now requires that its two types (<code>Iterator</code> and <code>Sentinel</code>) are different. Use <code>common_iterator_t<I, S></code> to get the old behavior (i.e., if the two types are the same, it is an alias for <code>I</code>; otherwise, it is <code>common_iterator<I, S></code>).</li>
|
||
<li>The following iterator adaptors now work with iterators that return proxies from their postfix increment operator (i.e., <code>operator++(int)</code>):<ul>
|
||
<li><code>common_iterator</code></li>
|
||
<li><code>counted_iterator</code></li>
|
||
</ul>
|
||
</li>
|
||
<li><p class="startli">The following customization points are now implemented per the Ranges TS spec and will no longer find the associated unconstrained overload in namespace <code>std::</code>:</p><ul>
|
||
<li><code>ranges::begin</code></li>
|
||
<li><code>ranges::end</code></li>
|
||
<li><code>ranges::size</code></li>
|
||
<li><code>ranges::swap</code></li>
|
||
<li><code>ranges::iter_swap</code></li>
|
||
</ul>
|
||
<p class="startli">(In practice, this has very little effect but it may effect overloading in rare situations.)</p>
|
||
</li>
|
||
<li><code>ranges::is_swappable</code> now only takes one template parameter. The new <code>ranges::is_swappable_with<T, U></code> tests whether <code>T</code> and <code>U</code> are swappable. <code>ranges::is_swappable<T></code> is equivalent to <code>ranges::is_swappable_with<T &, T &></code>.</li>
|
||
<li>The following object concepts have changed to conform with the Ranges TS specification, and approved changes (see <a href="http://wg21.link/p0547">P0547</a>):<ul>
|
||
<li><code>Destructible</code></li>
|
||
<li><code>Constructible</code></li>
|
||
<li><code>DefaultConstructible</code></li>
|
||
<li><code>MoveConstructible</code></li>
|
||
<li><code>MoveConstructible</code></li>
|
||
<li><code>Movable</code></li>
|
||
<li><code>Assignable</code></li>
|
||
</ul>
|
||
</li>
|
||
<li>The <code>View</code> concept is no longer satisfied by reference types.</li>
|
||
<li>The syntax for defining a concept has changed slightly. See <a href="https://github.com/ericniebler/range-v3/blob/master/include/range/v3/iterator/concepts.hpp">iterator/concepts.hpp</a> for examples.</li>
|
||
</ul>
|
||
<h1><a class="anchor" id="v0-1-1"></a>
|
||
Version 0.1.1</h1>
|
||
<ul>
|
||
<li>Small tweak to <code>Writable</code> concept to fix #537.</li>
|
||
</ul>
|
||
<h1><a class="anchor" id="v0-1-0"></a>
|
||
Version 0.1.0</h1>
|
||
<ul>
|
||
<li>March 8, 2017, Begin semantic versioning </li>
|
||
</ul>
|
||
</div></div><!-- contents -->
|
||
</div><!-- PageDoc -->
|
||
</div><!-- doc-content -->
|
||
<!-- start footer part -->
|
||
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
|
||
<ul>
|
||
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4 </li>
|
||
</ul>
|
||
</div>
|
||
</body>
|
||
</html>
|