mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 11:15:31 -05:00
2 lines
No EOL
18 KiB
HTML
2 lines
No EOL
18 KiB
HTML
<!DOCTYPE html>
|
||
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>CCBV (containers-data.CCBV)</title><link rel="stylesheet" href="../../odoc.css"/><meta charset="utf-8"/><meta name="generator" content="odoc 2.0.0"/><meta name="viewport" content="width=device-width,initial-scale=1.0"/><script src="../../highlight.pack.js"></script><script>hljs.initHighlightingOnLoad();</script></head><body class="odoc"><nav class="odoc-nav"><a href="../index.html">Up</a> – <a href="../index.html">containers-data</a> » CCBV</nav><header class="odoc-preamble"><h1>Module <code><span>CCBV</span></code></h1><p>Imperative Bitvectors</p><p><b>BREAKING CHANGES</b> since 1.2: size is now stored along with the bitvector. Some functions have a new signature.</p><p>The size of the bitvector used to be rounded up to the multiple of 30 or 62. In other words some functions such as <a href="#type-iter"><code>iter</code></a> would iterate on more bits than what was originally asked for. This is not the case anymore.</p></header><div class="odoc-content"><div class="odoc-spec"><div class="spec type" id="type-t" class="anchored"><a href="#type-t" class="anchor"></a><code><span><span class="keyword">type</span> t</span></code></div><div class="spec-doc"><p>A resizable bitvector</p></div></div><div class="odoc-spec"><div class="spec value" id="val-empty" class="anchored"><a href="#val-empty" class="anchor"></a><code><span><span class="keyword">val</span> empty : <span>unit <span class="arrow">-></span></span> <a href="#type-t">t</a></span></code></div><div class="spec-doc"><p>Empty bitvector.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-create" class="anchored"><a href="#val-create" class="anchor"></a><code><span><span class="keyword">val</span> create : <span>size:int <span class="arrow">-></span></span> <span>bool <span class="arrow">-></span></span> <a href="#type-t">t</a></span></code></div><div class="spec-doc"><p>Create a bitvector of given size, with given default value.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-copy" class="anchored"><a href="#val-copy" class="anchor"></a><code><span><span class="keyword">val</span> copy : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <a href="#type-t">t</a></span></code></div><div class="spec-doc"><p>Copy of bitvector.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-cardinal" class="anchored"><a href="#val-cardinal" class="anchor"></a><code><span><span class="keyword">val</span> cardinal : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> int</span></code></div><div class="spec-doc"><p>Number of bits set to one, seen as a set of bits.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-length" class="anchored"><a href="#val-length" class="anchor"></a><code><span><span class="keyword">val</span> length : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> int</span></code></div><div class="spec-doc"><p>Size of underlying bitvector. This is not related to the underlying implementation. Changed at 1.2</p></div></div><div class="odoc-spec"><div class="spec value" id="val-capacity" class="anchored"><a href="#val-capacity" class="anchor"></a><code><span><span class="keyword">val</span> capacity : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> int</span></code></div><div class="spec-doc"><p>The number of bits this bitvector can store without resizing.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 1.2</li></ul></div></div><div class="odoc-spec"><div class="spec value" id="val-resize" class="anchored"><a href="#val-resize" class="anchor"></a><code><span><span class="keyword">val</span> resize : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span>int <span class="arrow">-></span></span> unit</span></code></div><div class="spec-doc"><p>Resize the BV so that it has the specified length. This can grow or shrink the underlying bitvector.</p><ul class="at-tags"><li class="raises"><span class="at-tag">raises</span> <span class="value">Invalid_arg</span> <p>on negative sizes.</p></li></ul></div></div><div class="odoc-spec"><div class="spec value" id="val-is_empty" class="anchored"><a href="#val-is_empty" class="anchor"></a><code><span><span class="keyword">val</span> is_empty : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> bool</span></code></div><div class="spec-doc"><p>Are there any true bits?</p></div></div><div class="odoc-spec"><div class="spec value" id="val-set" class="anchored"><a href="#val-set" class="anchor"></a><code><span><span class="keyword">val</span> set : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span>int <span class="arrow">-></span></span> unit</span></code></div><div class="spec-doc"><p>Set i-th bit, extending the bitvector if needed.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-get" class="anchored"><a href="#val-get" class="anchor"></a><code><span><span class="keyword">val</span> get : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span>int <span class="arrow">-></span></span> bool</span></code></div><div class="spec-doc"><p>Is the i-th bit true? Return false if the index is too high.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-reset" class="anchored"><a href="#val-reset" class="anchor"></a><code><span><span class="keyword">val</span> reset : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span>int <span class="arrow">-></span></span> unit</span></code></div><div class="spec-doc"><p>Set i-th bit to 0, extending the bitvector if needed.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-flip" class="anchored"><a href="#val-flip" class="anchor"></a><code><span><span class="keyword">val</span> flip : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span>int <span class="arrow">-></span></span> unit</span></code></div><div class="spec-doc"><p>Flip i-th bit, extending the bitvector if needed.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-clear" class="anchored"><a href="#val-clear" class="anchor"></a><code><span><span class="keyword">val</span> clear : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> unit</span></code></div><div class="spec-doc"><p>Set every bit to 0.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-iter" class="anchored"><a href="#val-iter" class="anchor"></a><code><span><span class="keyword">val</span> iter : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span><span>(<span>int <span class="arrow">-></span></span> <span>bool <span class="arrow">-></span></span> unit)</span> <span class="arrow">-></span></span> unit</span></code></div><div class="spec-doc"><p>Iterate on all bits.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-iter_true" class="anchored"><a href="#val-iter_true" class="anchor"></a><code><span><span class="keyword">val</span> iter_true : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span><span>(<span>int <span class="arrow">-></span></span> unit)</span> <span class="arrow">-></span></span> unit</span></code></div><div class="spec-doc"><p>Iterate on bits set to 1.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-to_list" class="anchored"><a href="#val-to_list" class="anchor"></a><code><span><span class="keyword">val</span> to_list : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span>int list</span></span></code></div><div class="spec-doc"><p>List of indexes that are true.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-to_sorted_list" class="anchored"><a href="#val-to_sorted_list" class="anchor"></a><code><span><span class="keyword">val</span> to_sorted_list : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span>int list</span></span></code></div><div class="spec-doc"><p>Same as <a href="#val-to_list"><code>to_list</code></a>, but also guarantees the list is sorted in increasing order.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-of_list" class="anchored"><a href="#val-of_list" class="anchor"></a><code><span><span class="keyword">val</span> of_list : <span><span>int list</span> <span class="arrow">-></span></span> <a href="#type-t">t</a></span></code></div><div class="spec-doc"><p>From a list of true bits.</p><p>The bits are interpreted as indices into the returned bitvector, so the final bitvector <code>bv</code> will have <code>length bv</code> equal to 1 more than max of list indices.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-first" class="anchored"><a href="#val-first" class="anchor"></a><code><span><span class="keyword">val</span> first : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span>int option</span></span></code></div><div class="spec-doc"><p>First set bit, or return <code>None</code>. Changed type at 1.2</p></div></div><div class="odoc-spec"><div class="spec value" id="val-first_exn" class="anchored"><a href="#val-first_exn" class="anchor"></a><code><span><span class="keyword">val</span> first_exn : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> int</span></code></div><div class="spec-doc"><p>First set bit, or</p><ul class="at-tags"><li class="raises"><span class="at-tag">raises</span> <span class="value">Not_found</span> <p>if all bits are 0.</p></li></ul><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 1.2</li></ul></div></div><div class="odoc-spec"><div class="spec value" id="val-filter" class="anchored"><a href="#val-filter" class="anchor"></a><code><span><span class="keyword">val</span> filter : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span><span>(<span>int <span class="arrow">-></span></span> bool)</span> <span class="arrow">-></span></span> unit</span></code></div><div class="spec-doc"><p><code>filter bv p</code> only keeps the true bits of <code>bv</code> whose <code>index</code> satisfies <code>p index</code>.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-negate_self" class="anchored"><a href="#val-negate_self" class="anchor"></a><code><span><span class="keyword">val</span> negate_self : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> unit</span></code></div><div class="spec-doc"><p><code>negate_self t</code> flips all of the bits in <code>t</code>.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 1.2</li></ul></div></div><div class="odoc-spec"><div class="spec value" id="val-negate" class="anchored"><a href="#val-negate" class="anchor"></a><code><span><span class="keyword">val</span> negate : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <a href="#type-t">t</a></span></code></div><div class="spec-doc"><p><code>negate t</code> returns a copy of <code>t</code> with all of the bits flipped.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-union_into" class="anchored"><a href="#val-union_into" class="anchor"></a><code><span><span class="keyword">val</span> union_into : <span>into:<a href="#type-t">t</a> <span class="arrow">-></span></span> <span><a href="#type-t">t</a> <span class="arrow">-></span></span> unit</span></code></div><div class="spec-doc"><p><code>union_into ~into bv</code> sets <code>into</code> to the union of itself and <code>bv</code>. Also updates the length of <code>into</code> to be at least <code>length bv</code>.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-inter_into" class="anchored"><a href="#val-inter_into" class="anchor"></a><code><span><span class="keyword">val</span> inter_into : <span>into:<a href="#type-t">t</a> <span class="arrow">-></span></span> <span><a href="#type-t">t</a> <span class="arrow">-></span></span> unit</span></code></div><div class="spec-doc"><p><code>inter_into ~into bv</code> sets <code>into</code> to the intersection of itself and <code>bv</code>. Also updates the length of <code>into</code> to be at most <code>length bv</code>.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-union" class="anchored"><a href="#val-union" class="anchor"></a><code><span><span class="keyword">val</span> union : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <a href="#type-t">t</a></span></code></div><div class="spec-doc"><p><code>union bv1 bv2</code> returns the union of the two sets.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-inter" class="anchored"><a href="#val-inter" class="anchor"></a><code><span><span class="keyword">val</span> inter : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <a href="#type-t">t</a></span></code></div><div class="spec-doc"><p><code>inter bv1 bv2</code> returns the intersection of the two sets.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-diff_into" class="anchored"><a href="#val-diff_into" class="anchor"></a><code><span><span class="keyword">val</span> diff_into : <span>into:<a href="#type-t">t</a> <span class="arrow">-></span></span> <span><a href="#type-t">t</a> <span class="arrow">-></span></span> unit</span></code></div><div class="spec-doc"><p><code>diff_into ~into t</code> modifies <code>into</code> with only the bits set but not in <code>t</code>.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 1.2</li></ul></div></div><div class="odoc-spec"><div class="spec value" id="val-diff" class="anchored"><a href="#val-diff" class="anchor"></a><code><span><span class="keyword">val</span> diff : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <a href="#type-t">t</a></span></code></div><div class="spec-doc"><p><code>diff t1 t2</code> returns those bits found in <code>t1</code> but not in <code>t2</code>.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 1.2</li></ul></div></div><div class="odoc-spec"><div class="spec value" id="val-select" class="anchored"><a href="#val-select" class="anchor"></a><code><span><span class="keyword">val</span> select : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span><span><span class="type-var">'a</span> array</span> <span class="arrow">-></span></span> <span><span class="type-var">'a</span> list</span></span></code></div><div class="spec-doc"><p><code>select arr bv</code> selects the elements of <code>arr</code> whose index corresponds to a true bit in <code>bv</code>. If <code>bv</code> is too short, elements of <code>arr</code> with too high an index cannot be selected and are therefore not selected.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-selecti" class="anchored"><a href="#val-selecti" class="anchor"></a><code><span><span class="keyword">val</span> selecti : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span><span><span class="type-var">'a</span> array</span> <span class="arrow">-></span></span> <span><span>(<span class="type-var">'a</span> * int)</span> list</span></span></code></div><div class="spec-doc"><p>Same as <a href="#val-select"><code>select</code></a>, but selected elements are paired with their indexes.</p></div></div><div class="odoc-spec"><div class="spec value" id="val-equal" class="anchored"><a href="#val-equal" class="anchor"></a><code><span><span class="keyword">val</span> equal : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span><a href="#type-t">t</a> <span class="arrow">-></span></span> bool</span></code></div><div class="spec-doc"><p>Bitwise comparison, including the size (<code>equal a b</code> implies <code>length a=length b</code>).</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 3.5</li></ul></div></div><div class="odoc-spec"><div class="spec type" id="type-iter" class="anchored"><a href="#type-iter" class="anchor"></a><code><span><span class="keyword">type</span> <span>'a iter</span></span><span> = <span><span>(<span><span class="type-var">'a</span> <span class="arrow">-></span></span> unit)</span> <span class="arrow">-></span></span> unit</span></code></div></div><div class="odoc-spec"><div class="spec value" id="val-to_iter" class="anchored"><a href="#val-to_iter" class="anchor"></a><code><span><span class="keyword">val</span> to_iter : <span><a href="#type-t">t</a> <span class="arrow">-></span></span> <span>int <a href="#type-iter">iter</a></span></span></code></div></div><div class="odoc-spec"><div class="spec value" id="val-of_iter" class="anchored"><a href="#val-of_iter" class="anchor"></a><code><span><span class="keyword">val</span> of_iter : <span><span>int <a href="#type-iter">iter</a></span> <span class="arrow">-></span></span> <a href="#type-t">t</a></span></code></div></div><div class="odoc-spec"><div class="spec value" id="val-pp" class="anchored"><a href="#val-pp" class="anchor"></a><code><span><span class="keyword">val</span> pp : <span><span class="xref-unresolved">Stdlib</span>.Format.formatter <span class="arrow">-></span></span> <span><a href="#type-t">t</a> <span class="arrow">-></span></span> unit</span></code></div><div class="spec-doc"><p>Print the bitvector as a string of bits.</p><ul class="at-tags"><li class="since"><span class="at-tag">since</span> 0.13</li></ul></div></div></div></body></html> |