516 lines
No EOL
146 KiB
HTML
516 lines
No EOL
146 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<title>CLiki: B-Tries</title>
|
|
<link rel="alternate" type="application/atom+xml" title="ATOM feed of edits to current article"
|
|
href="https://www.cliki.net/site/feed/article.atom?title=B-Tries">
|
|
<link rel="stylesheet" href="static/css/style.css">
|
|
<link rel="stylesheet" href="static/css/colorize.css">
|
|
</head>
|
|
|
|
<body>
|
|
<span class="hidden">CLiki - B-Tries</span>
|
|
<div id="content"><div id="content-area"><div id="article-title">B-Tries</div><div id="article">An implementation of the <a href="data structure.html" class="category">data structure</a> described in the paper "B-tries for disk-based <a href="string.html" class="category">string</a> management" (<a href="https://people.eng.unimelb.edu.au/jzobel/fulltext/vldbj09.pdf">PDF</a>). The authors present B-tries as a possible alternative to <a href="cl-btree.html" class="internal">B-trees</a>, the variants of which are used in <a href="database.html" class="internal">database</a> systems, most commonly <a href="http://www.cburch.com/cs/340/reading/btree/index.html">B+ trees</a> (also seen in <a href="http://tomoyo.osdn.jp/cgi-bin/lxr/source/fs/ntfs/dir.c">NTFS</a>); Oracle is said to use <a href="http://nnpnahar.blogspot.com/2015/03/how-b-tree-index-works-in-oracle.html">B* trees</a>. This B-trie implementation, while far from being an <a href="https://franz.com/products/allegro-common-lisp/acl_btrees.lhtml">Allegro Btrees</a> killer, makes a decent starting point. In the interest of generality, both keys and values are <tt>(unsigned-byte 8)</tt> vectors rather than strings.<p><h2>The code</h2><p>Written by <a href="David Mullen.html" class="internal">David Mullen</a> and licensed under <a href="Apache 2.html" class="category">Apache 2</a>.<p><div class="code"><span class="nonparen"><span class="comment">;;; 8 KB blocks, four-byte pointers.
|
|
</span><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defconstant.html" class="symbol"><i><span class="symbol">defconstant</span></i></a> +block-size+ 8192</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defconstant.html" class="symbol"><i><span class="symbol">defconstant</span></i></a> +pointer-size+ 4</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defconstant.html" class="symbol"><i><span class="symbol">defconstant</span></i></a> +header-size+ 8</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defconstant.html" class="symbol"><i><span class="symbol">defconstant</span></i></a> +trie-tag+ 78</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defconstant.html" class="symbol"><i><span class="symbol">defconstant</span></i></a> +bucket-tag+ 66</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defconstant.html" class="symbol"><i><span class="symbol">defconstant</span></i></a> +trie-size+ 2048</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defconstant.html" class="symbol"><i><span class="symbol">defconstant</span></i></a> +split-factor+ 3/4</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defconstant.html" class="symbol"><i><span class="symbol">defconstant</span></i></a> +cache-size+ 128</span>)</span>
|
|
|
|
<span class="comment">;;; The B-trie STREAM/ARRAY-ELEMENT-TYPE.
|
|
</span><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_deftype.html" class="symbol"><i><span class="symbol">deftype</span></i></a> octet <span class="paren2">(<span class="nonparen"></span>)</span> '<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/typ_unsigned-byte.html" class="symbol">unsigned-byte</a> 8</span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defstruct.html" class="symbol"><i><span class="symbol">defstruct</span></i></a> bt
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span>
|
|
<span class="paren2">(<span class="nonparen">blocks <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_print-object.html" class="symbol">print-object</a> <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">bt bt</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_cond.html" class="symbol"><i><span class="symbol">cond</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_eq.html" class="symbol">eq</a> <span class="paren5">(<span class="nonparen">bt-stream bt</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/locfun_call-next-method.html" class="symbol">call-next-method</a></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let*</span></i></a> <span class="paren5">(<span class="nonparen"><span class="paren6">(<span class="nonparen">bt-name <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_namestrin_h-namestring.html" class="symbol">namestring</a> <span class="paren2">(<span class="nonparen">bt-stream bt</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_file-length.html" class="symbol">file-length</a> <span class="paren2">(<span class="nonparen">bt-stream bt</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen">block-count <span class="paren1">(<span class="nonparen">/ <a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> +block-size+</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_print-unr_dable-object.html" class="symbol">print-unreadable-object</a> <span class="paren6">(<span class="nonparen">bt <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> <span class="keyword">:type</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a> <span class="keyword">:identity</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_format.html" class="symbol">format</a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> <span class="string">"~S (~D block~:P)"</span> bt-name block-count</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> %open-bt <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pathname.html" class="symbol">pathname</a></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_open.html" class="symbol">open</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_pathname.html" class="symbol">pathname</a> <span class="keyword">:direction</span> <span class="keyword">:io</span>
|
|
<span class="keyword">:if-does-not-exist</span> <span class="keyword">:create</span>
|
|
<span class="keyword">:if-exists</span> <span class="keyword">:overwrite</span>
|
|
<span class="keyword">:element-type</span> 'octet</span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> open-bt <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pathname.html" class="symbol">pathname</a></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let*</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">bt <span class="paren5">(<span class="nonparen">make-bt <span class="keyword">:stream</span> <span class="paren6">(<span class="nonparen">%open-bt <a href="https://www.cliki.net/site/HyperSpec/Body/any_pathname.html" class="symbol">pathname</a></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_file-length.html" class="symbol">file-length</a> <span class="paren6">(<span class="nonparen">bt-stream bt</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_zerop.html" class="symbol">zerop</a> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a></span>)</span> <span class="paren4">(<span class="nonparen">allocate-block bt +trie-tag+ +trie-size+</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_assert.html" class="symbol">assert</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_zerop.html" class="symbol">zerop</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_mod.html" class="symbol">mod</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_file-length.html" class="symbol">file-length</a> <span class="paren1">(<span class="nonparen">bt-stream bt</span>)</span></span>)</span> +block-size+</span>)</span></span>)</span></span>)</span>
|
|
bt</span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> close-bt <span class="paren2">(<span class="nonparen">bt</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren3">(<span class="nonparen">bt-blocks bt</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">unless</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_eq.html" class="symbol">eq</a> <span class="paren4">(<span class="nonparen">bt-stream bt</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_with-accessors.html" class="symbol"><i><span class="symbol">with-accessors</span></i></a> <span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> bt-stream</span>)</span></span>)</span> bt
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_prog1cm_prog2.html" class="symbol">prog1</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_close.html" class="symbol">close</a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmacro.html" class="symbol"><i><span class="symbol">defmacro</span></i></a> %prune-cache <span class="paren2">(<span class="nonparen">cache</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">tail-pos <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_1plcm_1-.html" class="symbol">1-</a> +cache-size+</span>)</span></span>)</span></span>)</span>
|
|
`<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren4">(<span class="nonparen">> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_list-length.html" class="symbol">list-length</a> ,cache</span>)</span> +cache-size+</span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_rplacacm_rplacd.html" class="symbol">rplacd</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_nthcdr.html" class="symbol">nthcdr</a> ,tail-pos ,cache</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> get-block <span class="paren2">(<span class="nonparen">bt <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_number.html" class="symbol">number</a></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">entry <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_assoccm_a_assoc-if-not.html" class="symbol">assoc</a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_number.html" class="symbol">number</a> <span class="paren6">(<span class="nonparen">bt-blocks bt</span>)</span></span>)</span></span>)</span> entry-tail</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_cond.html" class="symbol"><i><span class="symbol">cond</span></i></a> <span class="paren4">(<span class="nonparen">entry <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_with-accessors.html" class="symbol"><i><span class="symbol">with-accessors</span></i></a> <span class="paren6">(<span class="nonparen"><span class="paren1">(<span class="nonparen">cache bt-blocks</span>)</span></span>)</span> bt
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">unless</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_eq.html" class="symbol">eq</a> entry <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">car</a> cache</span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> for tail on cache
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_eq.html" class="symbol">eq</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">cadr</a> tail</span>)</span> entry</span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a> entry-tail <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">cdr</a> tail</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">cdr</a> tail</span>)</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">cddr</a> tail</span>)</span></span>)</span></span>)</span>
|
|
<span class="comment">;; Move to front of cache.
|
|
</span> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_rplacacm_rplacd.html" class="symbol">rplacd</a> entry-tail cache</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a> cache entry-tail</span>)</span>
|
|
<span class="paren1">(<span class="nonparen">%prune-cache cache</span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">cdr</a> entry</span>)</span></span>)</span></span>)</span>
|
|
<span class="comment">;; Not in cache, read from file.
|
|
</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_file-position.html" class="symbol">file-position</a> <span class="paren6">(<span class="nonparen">bt-stream bt</span>)</span> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_st.html" class="symbol">*</a> +block-size+ <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_number.html" class="symbol">number</a></span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren6">(<span class="nonparen"><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_make-array.html" class="symbol">make-array</a> +block-size+ <span class="keyword">:element-type</span> 'octet</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_assert.html" class="symbol">assert</a> <span class="paren1">(<span class="nonparen">= <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_read-sequence.html" class="symbol">read-sequence</a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> <span class="paren3">(<span class="nonparen">bt-stream bt</span>)</span></span>)</span> +block-size+</span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_push.html" class="symbol">push</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_cons.html" class="symbol">cons</a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_number.html" class="symbol">number</a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span> <span class="paren2">(<span class="nonparen">bt-blocks bt</span>)</span></span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> get-block-number <span class="paren2">(<span class="nonparen">bt <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_or.html" class="symbol">or</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">car</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_rassoccm__assoc-if-not.html" class="symbol">rassoc</a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> <span class="paren5">(<span class="nonparen">bt-blocks bt</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_error.html" class="symbol">error</a> <span class="string">"No block found: ~S."</span> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> sync-block <span class="paren2">(<span class="nonparen">bt <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> &optional <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_number.html" class="symbol">number</a></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/syscla_number.html" class="symbol">number</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_or.html" class="symbol">or</a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_number.html" class="symbol">number</a> <span class="paren6">(<span class="nonparen">get-block-number bt <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_file-position.html" class="symbol">file-position</a> <span class="paren4">(<span class="nonparen">bt-stream bt</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_st.html" class="symbol">*</a> +block-size+ <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_number.html" class="symbol">number</a></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_write-sequence.html" class="symbol">write-sequence</a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> <span class="paren5">(<span class="nonparen">bt-stream bt</span>)</span></span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_number.html" class="symbol">number</a></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> make-cell-pointer <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> offset</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_check-type.html" class="symbol">check-type</a> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/typ_unsigned-byte.html" class="symbol">unsigned-byte</a> 16</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_check-type.html" class="symbol">check-type</a> offset <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/typ_unsigned-byte.html" class="symbol">unsigned-byte</a> 16</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_logandcm__rc2cm_logxor.html" class="symbol">logior</a> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_ash.html" class="symbol">ash</a> offset 16</span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> read-u32 <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> offset</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_logandcm__rc2cm_logxor.html" class="symbol">logior</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> offset</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_ash.html" class="symbol">ash</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> offset 1</span>)</span></span>)</span> 8</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_ash.html" class="symbol">ash</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> offset 2</span>)</span></span>)</span> 16</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_ash.html" class="symbol">ash</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> offset 3</span>)</span></span>)</span> 24</span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> read-u32</span>)</span> <span class="paren2">(<span class="nonparen">new-value <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> offset</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> for <a href="https://www.cliki.net/site/HyperSpec/Body/fun_bytecm_by_yte-position.html" class="symbol">byte-position</a> <a href="https://www.cliki.net/site/HyperSpec/Body/typ_fixnum.html" class="symbol">fixnum</a> from 0 below 32 by 8
|
|
for octet = <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_ldb.html" class="symbol">ldb</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_bytecm_by_yte-position.html" class="symbol">byte</a> 8 <a href="https://www.cliki.net/site/HyperSpec/Body/fun_bytecm_by_yte-position.html" class="symbol">byte-position</a></span>)</span> new-value</span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> offset</span>)</span> octet</span>)</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_incfcm_decf.html" class="symbol">incf</a> offset</span>)</span>
|
|
finally <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> new-value</span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> free-space <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">free-pointer <span class="paren5">(<span class="nonparen">read-u32 <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> 4</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_ldb.html" class="symbol">ldb</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_bytecm_by_yte-position.html" class="symbol">byte</a> 16 0</span>)</span> free-pointer</span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_ldb.html" class="symbol">ldb</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_bytecm_by_yte-position.html" class="symbol">byte</a> 16 16</span>)</span> free-pointer</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defsetf.html" class="symbol"><i><span class="symbol">defsetf</span></i></a> free-space <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span> <span class="paren2">(<span class="nonparen">free-space free-offset</span>)</span>
|
|
`<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_multip_-value-prog1.html" class="symbol"><i><span class="symbol">multiple-value-prog1</span></i></a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a> ,free-space ,free-offset</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen">pointer <span class="paren6">(<span class="nonparen">make-cell-pointer ,free-space ,free-offset</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren5">(<span class="nonparen">read-u32 ,<a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> +pointer-size+</span>)</span> pointer</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> allocate-block <span class="paren2">(<span class="nonparen">bt tag &optional <span class="paren3">(<span class="nonparen">overhead 0</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let*</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">word-count <span class="paren5">(<span class="nonparen">/ +block-size+ +pointer-size+</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen">free-offset <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> +header-size+ overhead</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen">free-space <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_-.html" class="symbol">-</a> +block-size+ free-offset</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> <span class="paren5">(<span class="nonparen">bt-stream bt</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_file-length.html" class="symbol">file-length</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_file-length.html" class="symbol">file-length</a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/syscla_number.html" class="symbol">number</a> <span class="paren5">(<span class="nonparen">/ <a href="https://www.cliki.net/site/HyperSpec/Body/fun_file-length.html" class="symbol">file-length</a> +block-size+</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_file-position.html" class="symbol">file-position</a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_st.html" class="symbol">*</a> +block-size+ <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_number.html" class="symbol">number</a></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_write-sequence.html" class="symbol">write-sequence</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_vector.html" class="symbol">vector</a> 84 tag 0 0</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_write-byte.html" class="symbol">write-byte</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_ldb.html" class="symbol">ldb</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_bytecm_by_yte-position.html" class="symbol">byte</a> 8 0</span>)</span> free-space</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_write-byte.html" class="symbol">write-byte</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_ldb.html" class="symbol">ldb</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_bytecm_by_yte-position.html" class="symbol">byte</a> 8 8</span>)</span> free-space</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_write-byte.html" class="symbol">write-byte</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_ldb.html" class="symbol">ldb</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_bytecm_by_yte-position.html" class="symbol">byte</a> 8 0</span>)</span> free-offset</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_write-byte.html" class="symbol">write-byte</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_ldb.html" class="symbol">ldb</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_bytecm_by_yte-position.html" class="symbol">byte</a> 8 8</span>)</span> free-offset</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_write-sequence.html" class="symbol">write-sequence</a> #<span class="paren5">(<span class="nonparen">0 0 0 0</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span>
|
|
repeat <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_-.html" class="symbol">-</a> word-count <span class="paren5">(<span class="nonparen">/ +header-size+ +pointer-size+</span>)</span></span>)</span>
|
|
finally <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a> <span class="paren6">(<span class="nonparen">get-block bt <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_number.html" class="symbol">number</a></span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_number.html" class="symbol">number</a></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> allocate-cell <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_vector.html" class="symbol">vector</a> &optional <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_vector.html" class="symbol">vector</a></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_multiple-value-bind.html" class="symbol">multiple-value-bind</a> <span class="paren3">(<span class="nonparen">free-space free-offset</span>)</span> <span class="paren3">(<span class="nonparen">free-space <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">type</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/typ_unsigned-byte.html" class="symbol">unsigned-byte</a> 16</span>)</span> free-space free-offset</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_assert.html" class="symbol">assert</a> <span class="paren4">(<span class="nonparen">>= free-space <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> +pointer-size+</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let*</span></i></a> <span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen">datum-end <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> free-offset free-space</span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen">datum-start <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_-.html" class="symbol">-</a> datum-end <a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">type</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/typ_unsigned-byte.html" class="symbol">unsigned-byte</a> 16</span>)</span> datum-start datum-end</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_incfcm_decf.html" class="symbol">decf</a> free-space <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_the.html" class="symbol"><i><span class="symbol">the</span></i></a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/typ_unsigned-byte.html" class="symbol">unsigned-byte</a> 16</span>)</span> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> +pointer-size+</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_vector.html" class="symbol">vector</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_subseq.html" class="symbol">subseq</a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> datum-start datum-end</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_vector.html" class="symbol">vector</a></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren5">(<span class="nonparen"><span class="paren6">(<span class="nonparen">datum-pointer <span class="paren1">(<span class="nonparen">make-cell-pointer <a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> datum-start</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren6">(<span class="nonparen">read-u32 <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> free-offset</span>)</span> datum-pointer</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_incfcm_decf.html" class="symbol">incf</a> free-offset +pointer-size+</span>)</span> <span class="comment">; The cell is now "used."
|
|
</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren6">(<span class="nonparen"><span class="paren1">(<span class="nonparen">free-pointer <span class="paren2">(<span class="nonparen">make-cell-pointer free-space free-offset</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren1">(<span class="nonparen">read-u32 <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> +pointer-size+</span>)</span> free-pointer</span>)</span> datum-pointer</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> trie-node-lookup <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> key key-start</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let*</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">key-index <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> key key-start</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen">offset <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> +header-size+ <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_st.html" class="symbol">*</a> 2 +pointer-size+ key-index</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen">exhaust-pointer-p <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_eql.html" class="symbol">eql</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_1plcm_1-.html" class="symbol">1+</a> key-start</span>)</span> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> key</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">type</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/typ_unsigned-byte.html" class="symbol">unsigned-byte</a> 16</span>)</span> key-index offset</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> exhaust-pointer-p <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_incfcm_decf.html" class="symbol">incf</a> offset +pointer-size+</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a> <span class="paren4">(<span class="nonparen">read-u32 <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> offset</span>)</span> key-index exhaust-pointer-p</span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> get-datum <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> cell-pointer</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_zerop.html" class="symbol">zerop</a> cell-pointer</span>)</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_return-from.html" class="symbol"><i><span class="symbol">return-from</span></i></a> get-datum <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_make-array.html" class="symbol">make-array</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_ldb.html" class="symbol">ldb</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_bytecm_by_yte-position.html" class="symbol">byte</a> 16 0</span>)</span> cell-pointer</span>)</span> <span class="keyword">:element-type</span> 'octet
|
|
<span class="keyword">:displaced-index-offset</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_ldb.html" class="symbol">ldb</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_bytecm_by_yte-position.html" class="symbol">byte</a> 16 16</span>)</span> cell-pointer</span>)</span>
|
|
<span class="keyword">:displaced-to</span> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> bucket-cell-count <span class="paren2">(<span class="nonparen">bucket</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let*</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">free-offset <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_nth-value.html" class="symbol">nth-value</a> 1 <span class="paren6">(<span class="nonparen">free-space bucket</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen">cell-count-in-bytes <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_-.html" class="symbol">-</a> free-offset +header-size+</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen">cell-count <span class="paren5">(<span class="nonparen">/ cell-count-in-bytes +pointer-size+</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">type</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/typ_unsigned-byte.html" class="symbol">unsigned-byte</a> 16</span>)</span> free-offset cell-count-in-bytes</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_assert.html" class="symbol">assert</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_evenpcm_oddp.html" class="symbol">evenp</a> cell-count</span>)</span></span>)</span> cell-count</span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> get-bucket-cell <span class="paren2">(<span class="nonparen">bucket cell-number</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">offset-from-header <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_st.html" class="symbol">*</a> +pointer-size+ cell-number</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen">get-datum bucket <span class="paren4">(<span class="nonparen">read-u32 bucket <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> +header-size+
|
|
offset-from-header</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> block-type <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> &optional <span class="paren3">(<span class="nonparen">tag <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> 1</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">known-tag-p <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_or.html" class="symbol">or</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_eql.html" class="symbol">eql</a> tag +trie-tag+</span>)</span> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_eql.html" class="symbol">eql</a> tag +bucket-tag+</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_assert.html" class="symbol">assert</a> known-tag-p <span class="paren5">(<span class="nonparen"></span>)</span> <span class="string">"Invalid type tag: ~D."</span> tag</span>)</span> tag</span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> key-range <span class="paren2">(<span class="nonparen">bucket</span>)</span>
|
|
<span class="string">"Get key range (values: low, high)."</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">lo-key-byte <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> bucket 2</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen">hi-key-byte <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> bucket 3</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_check-type.html" class="symbol">check-type</a> lo-key-byte octet</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_check-type.html" class="symbol">check-type</a> hi-key-byte octet</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_assert.html" class="symbol">assert</a> <span class="paren4">(<span class="nonparen"><= lo-key-byte hi-key-byte</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a> lo-key-byte hi-key-byte</span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defsetf.html" class="symbol"><i><span class="symbol">defsetf</span></i></a> key-range <span class="paren2">(<span class="nonparen">bucket</span>)</span> <span class="paren2">(<span class="nonparen">lo-key-byte hi-key-byte</span>)</span>
|
|
`<span class="paren2">(<span class="nonparen">set-key-range ,bucket ,lo-key-byte ,hi-key-byte</span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> set-key-range <span class="paren2">(<span class="nonparen">bucket lo-key-byte hi-key-byte</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_multip_-value-prog1.html" class="symbol"><i><span class="symbol">multiple-value-prog1</span></i></a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a> lo-key-byte hi-key-byte</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_assert.html" class="symbol">assert</a> <span class="paren4">(<span class="nonparen"><= 0 lo-key-byte hi-key-byte 255</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen">was-hybrid-p <span class="paren6">(<span class="nonparen">hybrid-bucket-p bucket</span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen">now-pure-p <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_eql.html" class="symbol">eql</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> bucket 2</span>)</span> lo-key-byte</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> bucket 3</span>)</span> hi-key-byte</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="comment">;; Going hybrid->pure consumes keys.
|
|
</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_and.html" class="symbol">and</a> was-hybrid-p now-pure-p</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> with pure-bucket-key-index of-type octet = lo-key-byte
|
|
with cell-count of-type <a href="https://www.cliki.net/site/HyperSpec/Body/typ_fixnum.html" class="symbol">fixnum</a> = <span class="paren6">(<span class="nonparen">bucket-cell-count bucket</span>)</span>
|
|
for cell-number of-type <a href="https://www.cliki.net/site/HyperSpec/Body/typ_fixnum.html" class="symbol">fixnum</a> from 0 below cell-count by 2
|
|
for offset <a href="https://www.cliki.net/site/HyperSpec/Body/typ_fixnum.html" class="symbol">fixnum</a> = <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> +header-size+ <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_st.html" class="symbol">*</a> +pointer-size+ cell-number</span>)</span></span>)</span>
|
|
for pointer of-type <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/typ_unsigned-byte.html" class="symbol">unsigned-byte</a> 32</span>)</span> = <span class="paren6">(<span class="nonparen">read-u32 bucket offset</span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_symbol-macrolet.html" class="symbol"><i><span class="symbol">symbol-macrolet</span></i></a> <span class="paren1">(<span class="nonparen"><span class="paren2">(<span class="nonparen">pointer-offset <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_ldb.html" class="symbol">ldb</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_bytecm_by_yte-position.html" class="symbol">byte</a> 16 16</span>)</span> pointer</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_assert.html" class="symbol">assert</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_eql.html" class="symbol">eql</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> bucket pointer-offset</span>)</span> pure-bucket-key-index</span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_incfcm_decf.html" class="symbol">incf</a> pointer-offset</span>)</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_incfcm_decf.html" class="symbol">decf</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_ldb.html" class="symbol">ldb</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_bytecm_by_yte-position.html" class="symbol">byte</a> 16 0</span>)</span> pointer</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren2">(<span class="nonparen">read-u32 bucket offset</span>)</span> pointer</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> find-in-bucket <span class="paren2">(<span class="nonparen">bucket key &optional <span class="paren3">(<span class="nonparen">key-start 0</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren3">(<span class="nonparen">pure-bucket-p bucket</span>)</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a> key-start <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_1plcm_1-.html" class="symbol">1+</a> key-start</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> with cell-count <a href="https://www.cliki.net/site/HyperSpec/Body/typ_fixnum.html" class="symbol">fixnum</a> = <span class="paren3">(<span class="nonparen">bucket-cell-count bucket</span>)</span>
|
|
for cell-number <a href="https://www.cliki.net/site/HyperSpec/Body/typ_fixnum.html" class="symbol">fixnum</a> from 0 below cell-count by 2
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen">key-in-bucket <span class="paren6">(<span class="nonparen">get-bucket-cell bucket cell-number</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_not.html" class="symbol">not</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_mismatch.html" class="symbol">mismatch</a> key-in-bucket key <span class="keyword">:start2</span> key-start</span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> <span class="paren6">(<span class="nonparen">get-bucket-cell bucket <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_1plcm_1-.html" class="symbol">1+</a> cell-number</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> trie-node-p <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_eql.html" class="symbol">eql</a> <span class="paren3">(<span class="nonparen">block-type <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span>
|
|
+trie-tag+</span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> pure-bucket-p <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_symbol-macrolet.html" class="symbol"><i><span class="symbol">symbol-macrolet</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">key-range <span class="paren5">(<span class="nonparen">key-range <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_eql.html" class="symbol">eql</a> <span class="paren5">(<span class="nonparen">block-type <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span> +bucket-tag+</span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_multiple-value-call.html" class="symbol"><i><span class="symbol">multiple-value-call</span></i></a> #'= key-range</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> hybrid-bucket-p <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_symbol-macrolet.html" class="symbol"><i><span class="symbol">symbol-macrolet</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">key-range <span class="paren5">(<span class="nonparen">key-range <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_eql.html" class="symbol">eql</a> <span class="paren5">(<span class="nonparen">block-type <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span> +bucket-tag+</span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_multiple-value-call.html" class="symbol"><i><span class="symbol">multiple-value-call</span></i></a> #'< key-range</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> cell-space <span class="paren2">(<span class="nonparen">&rest vectors</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> for <a href="https://www.cliki.net/site/HyperSpec/Body/any_vector.html" class="symbol">vector</a> in vectors
|
|
sum <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_vector.html" class="symbol">vector</a></span>)</span>
|
|
sum +pointer-size+</span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> bucket-key-distribution <span class="paren2">(<span class="nonparen">bucket</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> with counts = <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_make-array.html" class="symbol">make-array</a> 256 <span class="keyword">:initial-element</span> 0</span>)</span>
|
|
with cell-count <a href="https://www.cliki.net/site/HyperSpec/Body/typ_fixnum.html" class="symbol">fixnum</a> = <span class="paren3">(<span class="nonparen">bucket-cell-count bucket</span>)</span>
|
|
for cell-number <a href="https://www.cliki.net/site/HyperSpec/Body/typ_fixnum.html" class="symbol">fixnum</a> from 0 below cell-count by 2
|
|
for key-in-bucket = <span class="paren3">(<span class="nonparen">get-bucket-cell bucket cell-number</span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_incfcm_decf.html" class="symbol">incf</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_svref.html" class="symbol">svref</a> counts <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> key-in-bucket 0</span>)</span></span>)</span></span>)</span>
|
|
finally <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> counts</span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> find-split-point <span class="paren2">(<span class="nonparen">bucket</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_multiple-value-bind.html" class="symbol">multiple-value-bind</a> <span class="paren3">(<span class="nonparen">lo hi</span>)</span> <span class="paren3">(<span class="nonparen">key-range bucket</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> with best-split-point of-type octet = hi
|
|
with key-distribution = <span class="paren4">(<span class="nonparen">bucket-key-distribution bucket</span>)</span>
|
|
with distincts <a href="https://www.cliki.net/site/HyperSpec/Body/typ_fixnum.html" class="symbol">fixnum</a> = <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_countcm_c_count-if-not.html" class="symbol">count-if</a> #'<a href="https://www.cliki.net/site/HyperSpec/Body/fun_minuspcm_plusp.html" class="symbol">plusp</a> key-distribution</span>)</span>
|
|
with best-split-margin of-type <a href="https://www.cliki.net/site/HyperSpec/Body/typ_fixnum.html" class="symbol">fixnum</a> = <a href="https://www.cliki.net/site/HyperSpec/Body/convar_most-p_ative-fixnum.html" class="symbol">most-positive-fixnum</a>
|
|
initially <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_eql.html" class="symbol">eql</a> distincts 1</span>)</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> key-distribution</span>)</span></span>)</span>
|
|
for split-point of-type octet from lo to hi
|
|
for left-count = <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_reduce.html" class="symbol">reduce</a> #'<a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> key-distribution <span class="keyword">:end</span> split-point</span>)</span>
|
|
for right-count = <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_reduce.html" class="symbol">reduce</a> #'<a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> key-distribution <span class="keyword">:start</span> split-point</span>)</span>
|
|
for <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_ratio.html" class="symbol">ratio</a> = <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_minuspcm_plusp.html" class="symbol">plusp</a> left-count</span>)</span> <span class="paren5">(<span class="nonparen">/ right-count left-count</span>)</span></span>)</span>
|
|
for split-margin = <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_ratio.html" class="symbol">ratio</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_abs.html" class="symbol">abs</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_-.html" class="symbol">-</a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_ratio.html" class="symbol">ratio</a> +split-factor+</span>)</span></span>)</span></span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_and.html" class="symbol">and</a> split-margin <span class="paren5">(<span class="nonparen">> right-count 0</span>)</span> <span class="paren5">(<span class="nonparen">< split-margin best-split-margin</span>)</span></span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a> best-split-margin split-margin best-split-point split-point</span>)</span>
|
|
finally <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> best-split-point</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> move-bucket-cells <span class="paren2">(<span class="nonparen">old-bucket new-bucket split-point</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_assert.html" class="symbol">assert</a> <span class="paren3">(<span class="nonparen">< 0 split-point 256</span>)</span> <span class="paren3">(<span class="nonparen">split-point</span>)</span> <span class="string">"Bad SPLIT-POINT."</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_symbol-macrolet.html" class="symbol"><i><span class="symbol">symbol-macrolet</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">free-space <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_-.html" class="symbol">-</a> +block-size+ +header-size+</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> with cell-count of-type <a href="https://www.cliki.net/site/HyperSpec/Body/typ_fixnum.html" class="symbol">fixnum</a> = <span class="paren4">(<span class="nonparen">bucket-cell-count old-bucket</span>)</span>
|
|
for cell-number of-type <a href="https://www.cliki.net/site/HyperSpec/Body/typ_fixnum.html" class="symbol">fixnum</a> from 0 below cell-count by 2
|
|
for key = <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_copy-seq.html" class="symbol">copy-seq</a> <span class="paren5">(<span class="nonparen">get-bucket-cell old-bucket cell-number</span>)</span></span>)</span>
|
|
for value = <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_copy-seq.html" class="symbol">copy-seq</a> <span class="paren5">(<span class="nonparen">get-bucket-cell old-bucket <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_1plcm_1-.html" class="symbol">1+</a> cell-number</span>)</span></span>)</span></span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a> <span class="paren4">(<span class="nonparen">< <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> key 0</span>)</span> split-point</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_append.html" class="symbol">append</a> `<span class="paren4">(<span class="nonparen">,key ,value</span>)</span> into retained-cells
|
|
else <a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren4">(<span class="nonparen">allocate-cell new-bucket key</span>)</span> <span class="paren4">(<span class="nonparen">allocate-cell new-bucket value</span>)</span>
|
|
finally <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren5">(<span class="nonparen">free-space old-bucket</span>)</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a> free-space +header-size+</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_dolist.html" class="symbol">dolist</a> <span class="paren5">(<span class="nonparen">datum retained-cells</span>)</span> <span class="paren5">(<span class="nonparen">allocate-cell old-bucket datum</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_multiple-value-bind.html" class="symbol">multiple-value-bind</a> <span class="paren5">(<span class="nonparen">old-lo old-hi</span>)</span> <span class="paren5">(<span class="nonparen">key-range old-bucket</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren6">(<span class="nonparen">key-range new-bucket</span>)</span> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a> split-point old-hi</span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren6">(<span class="nonparen">key-range old-bucket</span>)</span> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a> old-lo <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_1plcm_1-.html" class="symbol">1-</a> split-point</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> split-point</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> purify-bucket <span class="paren2">(<span class="nonparen">bt bucket trie-node key-distribution</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">key-leader <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_positionc_ition-if-not.html" class="symbol">position-if</a> #'<a href="https://www.cliki.net/site/HyperSpec/Body/fun_minuspcm_plusp.html" class="symbol">plusp</a> key-distribution</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> for bucket-number = <span class="paren4">(<span class="nonparen">get-block-number bt bucket</span>)</span>
|
|
for i of-type octet from 0 to 255
|
|
<span class="comment">;; We have to undo the work that was done by ENGULF-POINTERS.
|
|
</span> <a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_symbol-macrolet.html" class="symbol"><i><span class="symbol">symbol-macrolet</span></i></a> <span class="paren5">(<span class="nonparen"><span class="paren6">(<span class="nonparen">pointer <span class="paren1">(<span class="nonparen">trie-pointer trie-node i</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_and.html" class="symbol">and</a> <span class="paren1">(<span class="nonparen">/= i key-leader</span>)</span> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_eql.html" class="symbol">eql</a> pointer bucket-number</span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a> pointer 0</span>)</span></span>)</span></span>)</span>
|
|
<span class="comment">;; Now there is only one pointer to this bucket.
|
|
</span> finally <span class="paren4">(<span class="nonparen">set-key-range bucket key-leader key-leader</span>)</span>
|
|
<span class="paren4">(<span class="nonparen">sync-block bt bucket</span>)</span> <span class="paren4">(<span class="nonparen">sync-block bt trie-node</span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> <span class="paren5">(<span class="nonparen">split-pure-bucket bt bucket trie-node</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> split-hybrid-bucket <span class="paren2">(<span class="nonparen">bt bucket trie-node</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">bucket-split-point <span class="paren5">(<span class="nonparen">find-split-point bucket</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_cond.html" class="symbol"><i><span class="symbol">cond</span></i></a> <span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_typep.html" class="symbol">typep</a> bucket-split-point '<a href="https://www.cliki.net/site/HyperSpec/Body/typ_simple-vector.html" class="symbol">simple-vector</a></span>)</span>
|
|
<span class="paren5">(<span class="nonparen">purify-bucket bt bucket trie-node bucket-split-point</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_multiple-value-bind.html" class="symbol">multiple-value-bind</a> <span class="paren6">(<span class="nonparen">new-bucket new-bucket-number</span>)</span>
|
|
<span class="paren6">(<span class="nonparen">allocate-block bt +bucket-tag+</span>)</span>
|
|
<span class="paren6">(<span class="nonparen">move-bucket-cells bucket new-bucket bucket-split-point</span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_multiple-value-bind.html" class="symbol">multiple-value-bind</a> <span class="paren1">(<span class="nonparen">new-lo new-hi</span>)</span> <span class="paren1">(<span class="nonparen">key-range new-bucket</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> for i of-type octet from new-lo to new-hi
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren3">(<span class="nonparen">trie-pointer trie-node i</span>)</span> new-bucket-number</span>)</span>
|
|
finally <span class="paren2">(<span class="nonparen">sync-block bt bucket</span>)</span> <span class="paren2">(<span class="nonparen">sync-block bt new-bucket</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> delete-bucket-cell <span class="paren2">(<span class="nonparen">bucket cell-number</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_multiple-value-bind.html" class="symbol">multiple-value-bind</a> <span class="paren3">(<span class="nonparen">free-space free-offset</span>)</span> <span class="paren3">(<span class="nonparen">free-space bucket</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen">cell-offset <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> +header-size+ <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_st.html" class="symbol">*</a> +pointer-size+ cell-number</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_replace.html" class="symbol">replace</a> bucket bucket
|
|
<span class="keyword">:start1</span> cell-offset <span class="keyword">:end1</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_-.html" class="symbol">-</a> free-offset +pointer-size+</span>)</span>
|
|
<span class="keyword">:start2</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> cell-offset +pointer-size+</span>)</span> <span class="keyword">:end2</span> free-offset</span>)</span>
|
|
<span class="comment">;; Free the space that was occupied by the pointer.
|
|
</span> <span class="comment">;; The actual data may remain until there's a split.
|
|
</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren5">(<span class="nonparen">free-space bucket</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> free-space +pointer-size+</span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_-.html" class="symbol">-</a> free-offset +pointer-size+</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> trie-pointer <span class="paren2">(<span class="nonparen">trie-node key-index</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">offset-from-header <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_st.html" class="symbol">*</a> 8 key-index</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen">read-u32 trie-node <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> +header-size+
|
|
offset-from-header</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> trie-pointer</span>)</span> <span class="paren2">(<span class="nonparen">trie-pointer trie-node key-index</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren3">(<span class="nonparen">read-u32 trie-node <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> +header-size+ <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_st.html" class="symbol">*</a> 8 key-index</span>)</span></span>)</span></span>)</span>
|
|
trie-pointer</span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> exhaust-pointer <span class="paren2">(<span class="nonparen">trie-node key-index</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">base <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> +header-size+ <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_st.html" class="symbol">*</a> 8 key-index</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen">read-u32 trie-node <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> base +pointer-size+</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> exhaust-pointer</span>)</span> <span class="paren2">(<span class="nonparen">exhaust-pointer trie-node key-index</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">offset <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_pl.html" class="symbol">+</a> +header-size+ <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_st.html" class="symbol">*</a> 8 key-index</span>)</span> +pointer-size+</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren4">(<span class="nonparen">read-u32 trie-node offset</span>)</span> exhaust-pointer</span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> hoist-exhaustible-keys <span class="paren2">(<span class="nonparen">bucket trie-node</span>)</span>
|
|
<span class="string">"Transfer one-byte keys from BUCKET to the parent TRIE-NODE."</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> with cell-count <a href="https://www.cliki.net/site/HyperSpec/Body/typ_fixnum.html" class="symbol">fixnum</a> = <span class="paren3">(<span class="nonparen">bucket-cell-count bucket</span>)</span>
|
|
with cell-number of-type <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/typ_unsigned-byte.html" class="symbol">unsigned-byte</a> 16</span>)</span> = 0
|
|
while <span class="paren3">(<span class="nonparen">< cell-number cell-count</span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let*</span></i></a> <span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen">key-in-bucket <span class="paren6">(<span class="nonparen">get-bucket-cell bucket cell-number</span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen">exhaustible-key-p <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_eql.html" class="symbol">eql</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> key-in-bucket</span>)</span> 1</span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen">leading-key-byte <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> key-in-bucket 0</span>)</span></span>)</span></span>)</span>
|
|
<span class="comment">;; If it's a multi-byte key then skip over the pair.
|
|
</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_cond.html" class="symbol"><i><span class="symbol">cond</span></i></a> <span class="paren5">(<span class="nonparen"><span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_not.html" class="symbol">not</a> exhaustible-key-p</span>)</span> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_incfcm_decf.html" class="symbol">incf</a> cell-number 2</span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren1">(<span class="nonparen"><span class="paren2">(<span class="nonparen">value <span class="paren3">(<span class="nonparen">get-bucket-cell bucket <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_1plcm_1-.html" class="symbol">1+</a> cell-number</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren2">(<span class="nonparen">exhaust-pointer trie-node leading-key-byte</span>)</span>
|
|
<span class="paren2">(<span class="nonparen">allocate-cell trie-node value</span>)</span></span>)</span>
|
|
<span class="comment">;; After deleting the key, the
|
|
</span> <span class="comment">;; value has the same CELL-NUMBER.
|
|
</span> <span class="paren1">(<span class="nonparen">delete-bucket-cell bucket cell-number</span>)</span>
|
|
<span class="paren1">(<span class="nonparen">delete-bucket-cell bucket cell-number</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_incfcm_decf.html" class="symbol">decf</a> cell-count 2</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> hybridize-bucket <span class="paren2">(<span class="nonparen">bt bucket</span>)</span>
|
|
<span class="string">"BUCKET will cover the full range of keys under a new TRIE-NODE."</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> with trie-node = <span class="paren3">(<span class="nonparen">allocate-block bt +trie-tag+ +trie-size+</span>)</span>
|
|
with bucket-number = <span class="paren3">(<span class="nonparen">get-block-number bt bucket</span>)</span>
|
|
with pure-bucket-key-index = <span class="paren3">(<span class="nonparen">key-range bucket</span>)</span>
|
|
for i of-type octet from 0 to 255
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren4">(<span class="nonparen">trie-pointer trie-node i</span>)</span> bucket-number</span>)</span>
|
|
finally <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren4">(<span class="nonparen">key-range bucket</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a> 0 255</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen">hoist-exhaustible-keys bucket trie-node</span>)</span>
|
|
<span class="paren3">(<span class="nonparen">sync-block bt bucket bucket-number</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a> <span class="paren5">(<span class="nonparen">sync-block bt trie-node</span>)</span>
|
|
pure-bucket-key-index</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> split-pure-bucket <span class="paren2">(<span class="nonparen">bt bucket parent-node</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_multiple-value-bind.html" class="symbol">multiple-value-bind</a> <span class="paren3">(<span class="nonparen">child-node key-index</span>)</span> <span class="paren3">(<span class="nonparen">hybridize-bucket bt bucket</span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a> <span class="paren4">(<span class="nonparen">split-hybrid-bucket bt bucket child-node</span>)</span> <span class="paren4">(<span class="nonparen">sync-block bt child-node</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren4">(<span class="nonparen">trie-pointer parent-node key-index</span>)</span> <span class="paren4">(<span class="nonparen">get-block-number bt child-node</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> engulf-pointers <span class="paren2">(<span class="nonparen">trie-node block-pointer key-index</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren3">(<span class="nonparen">trie-pointer trie-node key-index</span>)</span> block-pointer</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">lo-key-index key-index</span>)</span> <span class="paren4">(<span class="nonparen">hi-key-index key-index</span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_type.html" class="symbol">type</a> octet lo-key-index hi-key-index</span>)</span></span>)</span>
|
|
<span class="comment">;; Set adjacent null pointers (to the right).
|
|
</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> while <span class="paren4">(<span class="nonparen">< hi-key-index 255</span>)</span>
|
|
while <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_zerop.html" class="symbol">zerop</a> <span class="paren5">(<span class="nonparen">trie-pointer trie-node <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_1plcm_1-.html" class="symbol">1+</a> hi-key-index</span>)</span></span>)</span></span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren5">(<span class="nonparen">trie-pointer trie-node <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_incfcm_decf.html" class="symbol">incf</a> hi-key-index</span>)</span></span>)</span>
|
|
block-pointer</span>)</span></span>)</span>
|
|
<span class="comment">;; Same thing, but to the left.
|
|
</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> while <span class="paren4">(<span class="nonparen">> lo-key-index 0</span>)</span>
|
|
finally <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_values.html" class="symbol">values</a> lo-key-index hi-key-index</span>)</span></span>)</span>
|
|
while <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_zerop.html" class="symbol">zerop</a> <span class="paren5">(<span class="nonparen">trie-pointer trie-node <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_1plcm_1-.html" class="symbol">1-</a> lo-key-index</span>)</span></span>)</span></span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren5">(<span class="nonparen">trie-pointer trie-node <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_incfcm_decf.html" class="symbol">decf</a> lo-key-index</span>)</span></span>)</span>
|
|
block-pointer</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> make-bucket <span class="paren2">(<span class="nonparen">bt parent-node key-index</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let*</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">bucket <span class="paren5">(<span class="nonparen">allocate-block bt +bucket-tag+</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/syscla_number.html" class="symbol">number</a> <span class="paren5">(<span class="nonparen">get-block-number bt bucket</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_multiple-value-bind.html" class="symbol">multiple-value-bind</a> <span class="paren4">(<span class="nonparen">lo-key-index hi-key-index</span>)</span>
|
|
<span class="paren4">(<span class="nonparen">engulf-pointers parent-node <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_number.html" class="symbol">number</a> key-index</span>)</span>
|
|
<span class="paren4">(<span class="nonparen">set-key-range bucket lo-key-index hi-key-index</span>)</span>
|
|
<span class="paren4">(<span class="nonparen">sync-block bt parent-node</span>)</span>
|
|
<span class="paren4">(<span class="nonparen">sync-block bt bucket</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmacro.html" class="symbol"><i><span class="symbol">defmacro</span></i></a> %add-to-bucket <span class="paren2">(<span class="nonparen">key value split-function-name</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">total-required-space `<span class="paren5">(<span class="nonparen">cell-space ,key ,value</span>)</span></span>)</span></span>)</span>
|
|
`<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_cond.html" class="symbol"><i><span class="symbol">cond</span></i></a> <span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen">> ,total-required-space <span class="paren6">(<span class="nonparen">free-space next-block</span>)</span></span>)</span>
|
|
<span class="comment">;; Split the bucket and retry the insertion.
|
|
</span> <span class="paren5">(<span class="nonparen">,split-function-name bt next-block <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span>
|
|
<span class="comment">;; Update trie node.
|
|
</span> <span class="paren5">(<span class="nonparen">sync-block bt <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span></span>)</span>
|
|
<span class="comment">;; There's space for KEY and VALUE.
|
|
</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a> <span class="paren5">(<span class="nonparen">allocate-cell next-block ,key</span>)</span>
|
|
<span class="paren5">(<span class="nonparen">allocate-cell next-block ,value</span>)</span>
|
|
<span class="paren5">(<span class="nonparen">sync-block bt next-block</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> next-block</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> add-to-trie <span class="paren2">(<span class="nonparen">bt <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> key value &optional <span class="paren3">(<span class="nonparen">key-start 0</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_multiple-value-bind.html" class="symbol">multiple-value-bind</a> <span class="paren4">(<span class="nonparen">pointer key-index exhaust-pointer-p</span>)</span>
|
|
<span class="paren4">(<span class="nonparen">trie-node-lookup <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> key key-start</span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren5">(<span class="nonparen">next-block</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_cond.html" class="symbol"><i><span class="symbol">cond</span></i></a> <span class="paren6">(<span class="nonparen">exhaust-pointer-p
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">cell-pointer <span class="paren4">(<span class="nonparen">allocate-cell <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> value</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren3">(<span class="nonparen">exhaust-pointer <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> key-index</span>)</span> cell-pointer</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> <span class="paren3">(<span class="nonparen">sync-block bt <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_zerop.html" class="symbol">zerop</a> pointer</span>)</span> <span class="paren1">(<span class="nonparen">make-bucket bt <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> key-index</span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><span class="paren1">(<span class="nonparen">pure-bucket-p <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a> next-block <span class="paren3">(<span class="nonparen">get-block bt pointer</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">partially-consumed-key <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_subseq.html" class="symbol">subseq</a> key <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_1plcm_1-.html" class="symbol">1+</a> key-start</span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen">%add-to-bucket partially-consumed-key value split-pure-bucket</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><span class="paren1">(<span class="nonparen">hybrid-bucket-p next-block</span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">partially-consumed-key <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_subseq.html" class="symbol">subseq</a> key key-start</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen">%add-to-bucket partially-consumed-key value split-hybrid-bucket</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><span class="paren1">(<span class="nonparen">trie-node-p next-block</span>)</span> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> next-block</span>)</span> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_incfcm_decf.html" class="symbol">incf</a> key-start</span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_error.html" class="symbol">error</a> <span class="string">"Failed to acquire bucket: ~S, ~S in ~S."</span> key value bt</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> fetch <span class="paren2">(<span class="nonparen">key bt</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">root <span class="paren5">(<span class="nonparen">get-block bt 0</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen">find-in-trie bt root key</span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> find-in-trie <span class="paren2">(<span class="nonparen">bt <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> key &optional <span class="paren3">(<span class="nonparen">key-start 0</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_multiple-value-bind.html" class="symbol">multiple-value-bind</a> <span class="paren4">(<span class="nonparen">pointer key-index exhaust-pointer-p</span>)</span>
|
|
<span class="paren4">(<span class="nonparen">trie-node-lookup <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> key key-start</span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_ignorecm_ignorable.html" class="symbol">ignore</a> key-index</span>)</span></span>)</span>
|
|
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren5">(<span class="nonparen">next-block</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_cond.html" class="symbol"><i><span class="symbol">cond</span></i></a> <span class="paren6">(<span class="nonparen"><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_zerop.html" class="symbol">zerop</a> pointer</span>)</span> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen">exhaust-pointer-p <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> <span class="paren2">(<span class="nonparen">get-datum <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> pointer</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><span class="paren1">(<span class="nonparen">trie-node-p <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a> next-block <span class="paren3">(<span class="nonparen">get-block bt pointer</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/speope_block.html" class="symbol"><i><span class="symbol">block</span></i></a> next-block key-start <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_1plcm_1-.html" class="symbol">1+</a> key-start</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> <span class="paren2">(<span class="nonparen">find-in-bucket next-block key key-start</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> fetch</span>)</span> <span class="paren2">(<span class="nonparen">value key bt</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_symbol-macrolet.html" class="symbol"><i><span class="symbol">symbol-macrolet</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">root <span class="paren5">(<span class="nonparen">get-block bt 0</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen">add-to-trie bt root key value</span>)</span> value</span>)</span></span>)</span></span></div><p><h2>The strategy</h2><p><ul>
|
|
<li>The paper has tagged pointers, but this implementation only has a type code in the block itself. There are two kinds of blocks: trie nodes (that is, inner nodes) and buckets (i.e. leaf nodes). Buckets are further classed as pure or hybrid. Much of the complexity is in the transition between hybrid and pure (see the <tt>hybridize-bucket</tt> and <tt>purify-bucket</tt> functions). Buckets are split when they're full, which is conceptually parallel to B+ trees. But in a B+ tree, any block (including the root) may split, whereas in a B-trie, the root node is a trie node, and trie nodes don't split—only buckets do.
|
|
</li>
|
|
<li>There are two kinds of pointers used in the B-trie: block pointers and cell pointers. Both kinds are 32 bits. A cell pointer is a length/offset pair (with the length being the low 16 bits, and the offset within the block as the high 16 bits). They're comparable to <a href="http://www.interdb.jp/pg/pgsql01.html#_1.3.">line pointers in PostgreSQL</a>. A block pointer is just the number of the block (with the root node being zero).
|
|
</li>
|
|
</ul>
|
|
<h2>Quick demo</h2><p>A B-trie file, <tt>words.bt</tt>, has been created from a <a href="Linux.html" class="internal">Linux</a> <a href="https://en.wikipedia.org/wiki/Words_%28Unix%29">words</a> file, which contains 45,402 words (in S-expression format: see <a href="https://cl-pdx.com/static/words.sxp">words.sxp</a>). The B-trie maps each lower- and mixed-case word to its uppercase equivalent (by <a href="https://www.cliki.net/site/HyperSpec/Body/fun_string-up_g-capitalize.html" class="hyperspec">string-upcase</a>). It's a silly test, but an easy one to run, since we can verify that each key/value pair is correctly stored in the B-trie.<p><div class="code"><span class="nonparen">? <span class="paren1">(<span class="nonparen">open-bt <span class="string">"words.bt"</span></span>)</span>
|
|
#<BT "words.bt" <span class="paren1">(<span class="nonparen">267 blocks</span>)</span> #x21005BB92D>
|
|
? <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defparametercm_defvar.html" class="symbol"><i><span class="symbol">defvar</span></i></a> <span class="special">*words*</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_st.html" class="symbol">*</a></span>)</span>
|
|
*WORDS*</span></div><p>This B-trie is 267 blocks—or 2.08 MB, about half of which is free space. To consult the dictionary we'll need a pair of functions to convert between octet vectors and ASCII strings:<p><div class="code"><span class="nonparen"><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> ascii-octets <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> initially <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">unless</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span></span>)</span>
|
|
with <a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> <a href="https://www.cliki.net/site/HyperSpec/Body/typ_fixnum.html" class="symbol">fixnum</a> = <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a></span>)</span>
|
|
with <a href="https://www.cliki.net/site/HyperSpec/Body/any_vector.html" class="symbol">vector</a> = <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_make-array.html" class="symbol">make-array</a> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> <span class="keyword">:element-type</span> 'octet</span>)</span>
|
|
for i <a href="https://www.cliki.net/site/HyperSpec/Body/typ_fixnum.html" class="symbol">fixnum</a> below <a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> for <a href="https://www.cliki.net/site/HyperSpec/Body/acc_charcm_schar.html" class="symbol">char</a> of-type <a href="https://www.cliki.net/site/HyperSpec/Body/any_character.html" class="symbol">character</a> = <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_charcm_schar.html" class="symbol">char</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a> i</span>)</span>
|
|
for <a href="https://www.cliki.net/site/HyperSpec/Body/fun_char-code.html" class="symbol">char-code</a> of-type <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/syscla_integer.html" class="symbol">integer</a> 0 <span class="paren4">(<span class="nonparen">#.char-code-limit</span>)</span></span>)</span> = <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_char-code.html" class="symbol">char-code</a> <a href="https://www.cliki.net/site/HyperSpec/Body/acc_charcm_schar.html" class="symbol">char</a></span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">unless</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_typep.html" class="symbol">typep</a> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_char-code.html" class="symbol">char-code</a> 'octet</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_error.html" class="symbol">error</a> <span class="string">"~S isn't 8-bit ASCII."</span> <a href="https://www.cliki.net/site/HyperSpec/Body/acc_charcm_schar.html" class="symbol">char</a></span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_vector.html" class="symbol">vector</a> i</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_char-code.html" class="symbol">char-code</a></span>)</span> finally <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_vector.html" class="symbol">vector</a></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> octets-ascii <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_vector.html" class="symbol">vector</a></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> initially <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">unless</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_vector.html" class="symbol">vector</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span></span>)</span>
|
|
with <a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> <a href="https://www.cliki.net/site/HyperSpec/Body/typ_fixnum.html" class="symbol">fixnum</a> = <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_vector.html" class="symbol">vector</a></span>)</span>
|
|
with <a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a> = <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_make-string.html" class="symbol">make-string</a> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a></span>)</span>
|
|
for i <a href="https://www.cliki.net/site/HyperSpec/Body/typ_fixnum.html" class="symbol">fixnum</a> from 0 below <a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a>
|
|
for <a href="https://www.cliki.net/site/HyperSpec/Body/fun_char-code.html" class="symbol">char-code</a> = <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_vector.html" class="symbol">vector</a> i</span>)</span>
|
|
for <a href="https://www.cliki.net/site/HyperSpec/Body/acc_charcm_schar.html" class="symbol">char</a> = <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_code-char.html" class="symbol">code-char</a> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_char-code.html" class="symbol">char-code</a></span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_charcm_schar.html" class="symbol">char</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a> i</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/acc_charcm_schar.html" class="symbol">char</a></span>)</span>
|
|
finally <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a></span>)</span></span>)</span></span>)</span></span></div><p>Then we can see that <tt>silverware</tt> is correctly mapped to <tt>SILVERWARE</tt>:<p><div class="code"><span class="nonparen">? <span class="paren1">(<span class="nonparen">fetch <span class="paren2">(<span class="nonparen">ascii-octets <span class="string">"silverware"</span></span>)</span> <span class="special">*words*</span></span>)</span>
|
|
#<span class="paren1">(<span class="nonparen">83 73 76 86 69 82 87 65 82 69</span>)</span>
|
|
? <span class="paren1">(<span class="nonparen">octets-ascii <a href="https://www.cliki.net/site/HyperSpec/Body/any_st.html" class="symbol">*</a></span>)</span>
|
|
"SILVERWARE"</span></div><p><h2>Ideas for expansion</h2><p><ul>
|
|
<li>Compare B-tries with disk-based hashing techniques, such as <a href="https://en.wikipedia.org/wiki/Extendible_hashing">extendible hashing</a>, or <a href="https://github.com/kraison/vivace-graph-v3">VivaceGraph</a>'s linear hashing scheme (<a href="https://github.com/kraison/vivace-graph-v3/blob/master/linear-hash.lisp">linear-hash.lisp</a>).
|
|
</li>
|
|
<li>Experiment with B-tries as <a href="manardb.html" class="internal">memory-mapped files</a>, as are used by <a href="https://github.com/yahoo/mdbm">MDBM</a> and <a href="https://en.wikipedia.org/wiki/Lightning_Memory-Mapped_Database">LMDB</a>. (This is, of course, beyond <a href="ANSI.html" class="internal">ANSI</a> Common Lisp.)
|
|
</li>
|
|
<li>Consider how to make B-tries transactional and/or enable <a href="concurrency.html" class="internal">concurrent</a> access. Logging, <a href="https://en.wikipedia.org/wiki/Architecture_of_Btrieve#Pre-image_paging_vs_Shadow_paging">shadow paging</a>, or copy-on-write may be applicable.
|
|
</li>
|
|
</ul>
|
|
<hr>
|
|
<a href="persistence.html" class="category">persistence</a></div></div>
|
|
<div id="footer" class="buttonbar"><ul><li><a href="B-Tries.html">Current version</a></li>
|
|
<li><a href="https://www.cliki.net/site/history?article=B-Tries">History</a></li>
|
|
<li><a href="https://www.cliki.net/site/backlinks?article=B-Tries">Backlinks</a></li><li><a href="https://www.cliki.net/site/edit-article?title=B-Tries&from-revision=3811122260">Edit</a></li><li><a href="https://www.cliki.net/site/edit-article?create=t">Create</a></li></ul></div>
|
|
</div>
|
|
<div id="header-buttons" class="buttonbar">
|
|
<ul>
|
|
<li><a href="https://www.cliki.net/">Home</a></li>
|
|
<li><a href="https://www.cliki.net/site/recent-changes">Recent Changes</a></li>
|
|
<li><a href="CLiki.html">About</a></li>
|
|
<li><a href="Text Formatting.html">Text Formatting</a></li>
|
|
<li><a href="https://www.cliki.net/site/tools">Tools</a></li>
|
|
</ul>
|
|
<div id="search">
|
|
<form action="https://www.cliki.net/site/search">
|
|
<label for="search_query" class="hidden">Search CLiki</label>
|
|
<input type="text" name="query" id="search_query" value="" />
|
|
<input type="submit" value="search" />
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<div id="pageheader">
|
|
<div id="header">
|
|
<span id="logo">CLiki</span>
|
|
<span id="slogan">the common lisp wiki</span>
|
|
<div id="login"><form method="post" action="https://www.cliki.net/site/login">
|
|
<label for="login_name" class="hidden">Account name</label>
|
|
<input type="text" name="name" id="login_name" class="login_input" />
|
|
<label for= "login_password" class="hidden">Password</label>
|
|
<input type="password" name="password" id="login_password" class="login_input" />
|
|
<input type="submit" name="login" value="login" id="login_submit" /><br />
|
|
<div id="register"><a href="https://www.cliki.net/site/register">register</a></div>
|
|
<input type="submit" name="reset-pw" value="reset password" id="reset_pw" />
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body></html> |