Skip to content

Commit

Permalink
Code cleanup + bump dmsort version to 0.1.2
Browse files Browse the repository at this point in the history
  • Loading branch information
emilk committed Feb 5, 2017
1 parent e080e6f commit 8a959d1
Show file tree
Hide file tree
Showing 9 changed files with 32 additions and 61 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "dmsort"
version = "0.1.1"
version = "0.1.2"
authors = ["Emil Ernerfeldt <emilernerfeldt@gmail.com>"]
description = """
Fast adaptive sorting for when most of your data is already in order.
Expand All @@ -10,6 +10,7 @@ documentation = "https://emilk.github.io/drop-merge-sort/dmsort/index.html"
repository = "https://github.com/emilk/drop-merge-sort"
readme = "README.md"
keywords = ["sorting", "sort", "adaptive"]
categories = ["algorithms"]
license = "MIT"
include = [ "**/*.rs", "Cargo.toml", ]

Expand Down
2 changes: 1 addition & 1 deletion docs/dmsort/fn.sort.html
Expand Up @@ -47,7 +47,7 @@ <h1 class='fqn'><span class='in-band'>Function <a href='index.html'>dmsort</a>::
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">
[<span class='inner'>&#x2212;</span>]
</a>
</span><a class='srclink' href='../src/dmsort/dmsort.rs.html#391-393' title='goto source code'>[src]</a></span></h1>
</span><a class='srclink' href='../src/dmsort/dmsort.rs.html#381-383' title='goto source code'>[src]</a></span></h1>
<pre class='rust fn'>pub fn sort&lt;T:&nbsp;<a class='trait' href='https://doc.rust-lang.org/nightly/core/cmp/trait.Ord.html' title='core::cmp::Ord'>Ord</a>&gt;(slice: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>&amp;mut [</a>T<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>]</a>)</pre><div class='docblock'><p>Sorts the elements using the Ord trait.</p>

<h1 id='examples' class='section-header'><a href='#examples'>Examples</a></h1>
Expand Down
2 changes: 1 addition & 1 deletion docs/dmsort/fn.sort_by.html
Expand Up @@ -47,7 +47,7 @@ <h1 class='fqn'><span class='in-band'>Function <a href='index.html'>dmsort</a>::
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">
[<span class='inner'>&#x2212;</span>]
</a>
</span><a class='srclink' href='../src/dmsort/dmsort.rs.html#364-368' title='goto source code'>[src]</a></span></h1>
</span><a class='srclink' href='../src/dmsort/dmsort.rs.html#354-358' title='goto source code'>[src]</a></span></h1>
<pre class='rust fn'>pub fn sort_by&lt;T, F&gt;(slice: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>&amp;mut [</a>T<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>]</a>, compare: F) <span class='where'>where F: <a class='trait' href='https://doc.rust-lang.org/nightly/core/ops/trait.FnMut.html' title='core::ops::FnMut'>FnMut</a>(&amp;T, &amp;T) -&gt; <a class='enum' href='https://doc.rust-lang.org/nightly/core/cmp/enum.Ordering.html' title='core::cmp::Ordering'>Ordering</a></span></pre><div class='docblock'><p>Sorts the elements using the given compare function.</p>

<h1 id='examples' class='section-header'><a href='#examples'>Examples</a></h1>
Expand Down
2 changes: 1 addition & 1 deletion docs/dmsort/fn.sort_by_key.html
Expand Up @@ -47,7 +47,7 @@ <h1 class='fqn'><span class='in-band'>Function <a href='index.html'>dmsort</a>::
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">
[<span class='inner'>&#x2212;</span>]
</a>
</span><a class='srclink' href='../src/dmsort/dmsort.rs.html#377-382' title='goto source code'>[src]</a></span></h1>
</span><a class='srclink' href='../src/dmsort/dmsort.rs.html#367-372' title='goto source code'>[src]</a></span></h1>
<pre class='rust fn'>pub fn sort_by_key&lt;T, K, F&gt;(slice: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>&amp;mut [</a>T<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>]</a>, key: F) <span class='where'>where K: <a class='trait' href='https://doc.rust-lang.org/nightly/core/cmp/trait.Ord.html' title='core::cmp::Ord'>Ord</a>, F: <a class='trait' href='https://doc.rust-lang.org/nightly/core/ops/trait.FnMut.html' title='core::ops::FnMut'>FnMut</a>(&amp;T) -&gt; K</span></pre><div class='docblock'><p>Sorts the elements using the given key function.</p>

<h1 id='examples' class='section-header'><a href='#examples'>Examples</a></h1>
Expand Down
2 changes: 1 addition & 1 deletion docs/dmsort/fn.sort_copy.html
Expand Up @@ -47,7 +47,7 @@ <h1 class='fqn'><span class='in-band'>Function <a href='index.html'>dmsort</a>::
<a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">
[<span class='inner'>&#x2212;</span>]
</a>
</span><a class='srclink' href='../src/dmsort/dmsort.rs.html#190-192' title='goto source code'>[src]</a></span></h1>
</span><a class='srclink' href='../src/dmsort/dmsort.rs.html#176-178' title='goto source code'>[src]</a></span></h1>
<pre class='rust fn'>pub fn sort_copy&lt;T:&nbsp;<a class='trait' href='https://doc.rust-lang.org/nightly/core/marker/trait.Copy.html' title='core::marker::Copy'>Copy</a> + <a class='trait' href='https://doc.rust-lang.org/nightly/core/cmp/trait.Ord.html' title='core::cmp::Ord'>Ord</a>&gt;(slice: <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>&amp;mut [</a>T<a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.slice.html'>]</a>) -&gt; <a class='primitive' href='https://doc.rust-lang.org/nightly/std/primitive.usize.html'>usize</a></pre><div class='docblock'><p>UNSTABLE! FOR INTERNAL USE ONLY.</p>
</div></section>
<section id='search' class="content hidden"></section>
Expand Down
44 changes: 12 additions & 32 deletions docs/src/dmsort/dmsort.rs.html
Expand Up @@ -427,16 +427,6 @@
<span id="383">383</span>
<span id="384">384</span>
<span id="385">385</span>
<span id="386">386</span>
<span id="387">387</span>
<span id="388">388</span>
<span id="389">389</span>
<span id="390">390</span>
<span id="391">391</span>
<span id="392">392</span>
<span id="393">393</span>
<span id="394">394</span>
<span id="395">395</span>
</pre><pre class='rust '>
<span class='comment'>// Copyright (c) 2017 Emil Ernerfeldt</span>

Expand Down Expand Up @@ -470,24 +460,6 @@

<span class='comment'>// ----------------------------------------------------------------------------</span>

<span class='doccomment'>/// Helper function.</span>
<span class='attribute'>#[<span class='ident'>inline</span>(<span class='ident'>always</span>)]</span>
<span class='kw'>fn</span> <span class='ident'>max_in_slice</span><span class='op'>&lt;</span><span class='ident'>T</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='ident'>slice</span>: <span class='kw-2'>&amp;</span>[<span class='ident'>T</span>], <span class='kw-2'>mut</span> <span class='ident'>compare</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='kw-2'>&amp;</span><span class='ident'>T</span>
<span class='kw'>where</span> <span class='ident'>F</span>: <span class='ident'>FnMut</span>(<span class='kw-2'>&amp;</span><span class='ident'>T</span>, <span class='kw-2'>&amp;</span><span class='ident'>T</span>) <span class='op'>-&gt;</span> <span class='ident'>Ordering</span>
{
<span class='comment'>// slice.iter().max_by(|a, b| compare(a, b)).unwrap() // Not yet stable :(</span>
<span class='macro'>debug_assert</span><span class='macro'>!</span>(<span class='op'>!</span><span class='ident'>slice</span>.<span class='ident'>is_empty</span>());
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>max</span> <span class='op'>=</span> <span class='kw-2'>&amp;</span><span class='ident'>slice</span>[<span class='number'>0</span>];
<span class='kw'>for</span> <span class='ident'>value</span> <span class='kw'>in</span> <span class='ident'>slice</span>.<span class='ident'>iter</span>().<span class='ident'>skip</span>(<span class='number'>1</span>) {
<span class='kw'>if</span> <span class='ident'>compare</span>(<span class='ident'>max</span>, <span class='ident'>value</span>) <span class='op'>==</span> <span class='ident'>Ordering</span>::<span class='ident'>Less</span> {
<span class='ident'>max</span> <span class='op'>=</span> <span class='ident'>value</span>;
}
}
<span class='ident'>max</span>
}

<span class='comment'>// ----------------------------------------------------------------------------</span>

<span class='doccomment'>/// This is the readable reference implementation that only works for Copy types.</span>
<span class='doccomment'>/// Returns the number of dropped elements for diagnostic purposes.</span>
<span class='kw'>fn</span> <span class='ident'>sort_copy_by</span><span class='op'>&lt;</span><span class='ident'>T</span>, <span class='ident'>F</span><span class='op'>&gt;</span>(<span class='ident'>slice</span>: <span class='kw-2'>&amp;</span><span class='kw-2'>mut</span> [<span class='ident'>T</span>], <span class='kw-2'>mut</span> <span class='ident'>compare</span>: <span class='ident'>F</span>) <span class='op'>-&gt;</span> <span class='ident'>usize</span>
Expand All @@ -507,10 +479,13 @@
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>num_dropped_in_row</span> <span class='op'>=</span> <span class='number'>0</span>;
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>write</span> <span class='op'>=</span> <span class='number'>0</span>; <span class='comment'>// Index of where to write the next element to keep.</span>
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>read</span> <span class='op'>=</span> <span class='number'>0</span>; <span class='comment'>// Index of the input stream.</span>
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>iteration</span> <span class='op'>=</span> <span class='number'>0</span>;
<span class='kw'>let</span> <span class='ident'>ealy_out_stop</span> <span class='op'>=</span> <span class='ident'>slice</span>.<span class='ident'>len</span>() <span class='op'>/</span> <span class='ident'>EARLY_OUT_TEST_AT</span>;

<span class='kw'>while</span> <span class='ident'>read</span> <span class='op'>&lt;</span> <span class='ident'>slice</span>.<span class='ident'>len</span>() {
<span class='ident'>iteration</span> <span class='op'>+=</span> <span class='number'>1</span>;
<span class='kw'>if</span> <span class='ident'>EARLY_OUT</span>
<span class='op'>&amp;&amp;</span> <span class='ident'>read</span> <span class='op'>==</span> <span class='ident'>slice</span>.<span class='ident'>len</span>() <span class='op'>/</span> <span class='ident'>EARLY_OUT_TEST_AT</span>
<span class='op'>&amp;&amp;</span> <span class='ident'>iteration</span> <span class='op'>==</span> <span class='ident'>ealy_out_stop</span>
<span class='op'>&amp;&amp;</span> <span class='ident'>dropped</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>f32</span> <span class='op'>&gt;</span> <span class='ident'>read</span> <span class='kw'>as</span> <span class='ident'>f32</span> <span class='op'>*</span> <span class='ident'>EARLY_OUT_DISORDER_FRACTION</span> {
<span class='comment'>// We have seen a lot of the elements and dropped a lot of them.</span>
<span class='comment'>// This doesn&#39;t look good. Abort.</span>
Expand Down Expand Up @@ -584,7 +559,8 @@

<span class='kw'>if</span> <span class='ident'>FAST_BACKTRACKING</span> {
<span class='comment'>// Back-track until we can accept at least one of the recently dropped elements:</span>
<span class='kw'>let</span> <span class='ident'>max_of_dropped</span> <span class='op'>=</span> <span class='ident'>max_in_slice</span>(<span class='kw-2'>&amp;</span><span class='ident'>slice</span>[<span class='ident'>read</span>..(<span class='ident'>read</span> <span class='op'>+</span> <span class='ident'>num_dropped_in_row</span> <span class='op'>+</span> <span class='number'>1</span>)], <span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> <span class='ident'>compare</span>(<span class='ident'>a</span>, <span class='ident'>b</span>));
<span class='kw'>let</span> <span class='ident'>max_of_dropped</span> <span class='op'>=</span> <span class='ident'>slice</span>[<span class='ident'>read</span>..(<span class='ident'>read</span> <span class='op'>+</span> <span class='ident'>num_dropped_in_row</span> <span class='op'>+</span> <span class='number'>1</span>)]
.<span class='ident'>iter</span>().<span class='ident'>max_by</span>(<span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> <span class='ident'>compare</span>(<span class='ident'>a</span>, <span class='ident'>b</span>)).<span class='ident'>unwrap</span>();

<span class='kw'>while</span> <span class='number'>1</span> <span class='op'>&lt;=</span> <span class='ident'>write</span> <span class='op'>&amp;&amp;</span> <span class='ident'>compare</span>(<span class='ident'>max_of_dropped</span>, <span class='kw-2'>&amp;</span><span class='ident'>slice</span>[<span class='ident'>write</span> <span class='op'>-</span> <span class='number'>1</span>]) <span class='op'>==</span> <span class='ident'>Ordering</span>::<span class='ident'>Less</span> {
<span class='ident'>num_backtracked</span> <span class='op'>+=</span> <span class='number'>1</span>;
Expand Down Expand Up @@ -696,10 +672,13 @@

<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>num_dropped_in_row</span> <span class='op'>=</span> <span class='number'>0</span>;
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>read</span> <span class='op'>=</span> <span class='number'>0</span>;
<span class='kw'>let</span> <span class='kw-2'>mut</span> <span class='ident'>iteration</span> <span class='op'>=</span> <span class='number'>0</span>;
<span class='kw'>let</span> <span class='ident'>ealy_out_stop</span> <span class='op'>=</span> <span class='ident'>s</span>.<span class='ident'>slice</span>.<span class='ident'>len</span>() <span class='op'>/</span> <span class='ident'>EARLY_OUT_TEST_AT</span>;

<span class='kw'>while</span> <span class='ident'>read</span> <span class='op'>&lt;</span> <span class='ident'>s</span>.<span class='ident'>slice</span>.<span class='ident'>len</span>() {
<span class='ident'>iteration</span> <span class='op'>+=</span> <span class='number'>1</span>;
<span class='kw'>if</span> <span class='ident'>EARLY_OUT</span>
<span class='op'>&amp;&amp;</span> <span class='ident'>read</span> <span class='op'>==</span> <span class='ident'>s</span>.<span class='ident'>slice</span>.<span class='ident'>len</span>() <span class='op'>/</span> <span class='ident'>EARLY_OUT_TEST_AT</span>
<span class='op'>&amp;&amp;</span> <span class='ident'>iteration</span> <span class='op'>==</span> <span class='ident'>ealy_out_stop</span>
<span class='op'>&amp;&amp;</span> <span class='ident'>s</span>.<span class='ident'>dropped</span>.<span class='ident'>len</span>() <span class='kw'>as</span> <span class='ident'>f32</span> <span class='op'>&gt;</span> <span class='ident'>read</span> <span class='kw'>as</span> <span class='ident'>f32</span> <span class='op'>*</span> <span class='ident'>EARLY_OUT_DISORDER_FRACTION</span> {
<span class='comment'>// We have seen a lot of the elements and dropped a lot of them.</span>
<span class='comment'>// This doesn&#39;t look good. Abort.</span>
Expand Down Expand Up @@ -744,7 +723,8 @@

<span class='kw'>if</span> <span class='ident'>FAST_BACKTRACKING</span> {
<span class='comment'>// Back-track until we can accept at least one of the recently dropped elements:</span>
<span class='kw'>let</span> <span class='ident'>max_of_dropped</span> <span class='op'>=</span> <span class='ident'>max_in_slice</span>(<span class='kw-2'>&amp;</span><span class='ident'>s</span>.<span class='ident'>slice</span>[<span class='ident'>read</span>..(<span class='ident'>read</span> <span class='op'>+</span> <span class='ident'>num_dropped_in_row</span> <span class='op'>+</span> <span class='number'>1</span>)], <span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> <span class='ident'>compare</span>(<span class='ident'>a</span>, <span class='ident'>b</span>));
<span class='kw'>let</span> <span class='ident'>max_of_dropped</span> <span class='op'>=</span> <span class='ident'>s</span>.<span class='ident'>slice</span>[<span class='ident'>read</span>..(<span class='ident'>read</span> <span class='op'>+</span> <span class='ident'>num_dropped_in_row</span> <span class='op'>+</span> <span class='number'>1</span>)]
.<span class='ident'>iter</span>().<span class='ident'>max_by</span>(<span class='op'>|</span><span class='ident'>a</span>, <span class='ident'>b</span><span class='op'>|</span> <span class='ident'>compare</span>(<span class='ident'>a</span>, <span class='ident'>b</span>)).<span class='ident'>unwrap</span>();

<span class='kw'>while</span> <span class='number'>1</span> <span class='op'>&lt;=</span> <span class='ident'>s</span>.<span class='ident'>write</span> <span class='op'>&amp;&amp;</span> <span class='ident'>compare</span>(<span class='ident'>max_of_dropped</span>, <span class='ident'>s</span>.<span class='ident'>slice</span>.<span class='ident'>get_unchecked</span>(<span class='ident'>s</span>.<span class='ident'>write</span> <span class='op'>-</span> <span class='number'>1</span>)) <span class='op'>==</span> <span class='ident'>Ordering</span>::<span class='ident'>Less</span> {
<span class='ident'>num_backtracked</span> <span class='op'>+=</span> <span class='number'>1</span>;
Expand Down

0 comments on commit 8a959d1

Please sign in to comment.