UNPKG

avalon2

Version:

an elegant efficient express mvvm framework

396 lines (394 loc) 12.2 kB
<!doctype html> <html lang="en"> <head> <title>Code coverage report for seed/cache.js</title> <meta charset="utf-8" /> <link rel="stylesheet" href="../prettify.css" /> <link rel="stylesheet" href="../base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <style type='text/css'> .coverage-summary .sorter { background-image: url(../sort-arrow-sprite.png); } </style> </head> <body> <div class='wrapper'> <div class='pad1'> <h1> <a href="../index.html">all files</a> / <a href="index.html">seed/</a> cache.js </h1> <div class='clearfix'> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Statements</span> <span class='fraction'>40/40</span> </div> <div class='fl pad1y space-right2'> <span class="strong">83.33% </span> <span class="quiet">Branches</span> <span class='fraction'>15/18</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Functions</span> <span class='fraction'>4/4</span> </div> <div class='fl pad1y space-right2'> <span class="strong">100% </span> <span class="quiet">Lines</span> <span class='fraction'>40/40</span> </div> </div> </div> <div class='status-line high'></div> <pre><table class="coverage"> <tr><td class="line-count quiet">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111</td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">339×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">339×</span> <span class="cline-any cline-yes">339×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">335×</span> <span class="cline-any cline-yes">335×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">339×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">339×</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">333×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">339×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">878×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">878×</span> <span class="cline-any cline-yes">335×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">543×</span> <span class="cline-any cline-yes">147×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">396×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">396×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes"></span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">396×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">396×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">395×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">396×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">396×</span> <span class="cline-any cline-yes">396×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">396×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">396×</span> <span class="cline-any cline-yes">396×</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/* https://github.com/rsms/js-lru entry entry entry entry ______ ______ ______ ______ | head |.newer =&gt; | |.newer =&gt; | |.newer =&gt; | tail | | A | | B | | C | | D | |______| &lt;= older.|______| &lt;= older.|______| &lt;= older.|______| removed &lt;-- &lt;-- &lt;-- &lt;-- &lt;-- &lt;-- &lt;-- &lt;-- &lt;-- &lt;-- &lt;-- added */ export function Cache(maxLength) { // 标识当前缓存数组的大小 this.size = 0 // 标识缓存数组能达到的最大长度 this.limit = maxLength // head(最不常用的项),tail(最常用的项)全部初始化为undefined &nbsp; this.head = this.tail = void 0 this._keymap = {} } &nbsp; Cache.prototype = { &nbsp; put(key, value) { var entry = { key: key, value: value } this._keymap[key] = entry if (this.tail) { // 如果存在tail(缓存数组的长度不为0),将tail指向新的 entry this.tail.newer = entry entry.older = this.tail } else { // 如果缓存数组的长度为0,将head指向新的entry this.head = entry } this.tail = entry // 如果缓存数组达到上限,则先删除 head 指向的缓存对象 /* istanbul ignore if */ if (this.size === this.limit) { this.shift() } else { this.size++ } return value }, &nbsp; shift() { /* istanbul ignore next */ var entry = this.head /* istanbul ignore if */ <span class="missing-if-branch" title="else path not taken" >E</span>if (entry) { // 删除 head ,并改变指向 this.head = this.head.newer // 同步更新 _keymap 里面的属性值 this.head.older = entry.newer = entry.older = this._keymap[entry.key] = void 0 delete this._keymap[entry.key] //#1029 // 同步更新 缓存数组的长度 this.size-- } }, &nbsp; get(key) { var entry = this._keymap[key] // 如果查找不到含有`key`这个属性的缓存对象 if (entry === void 0) return // 如果查找到的缓存对象已经是 tail (最近使用过的) /* istanbul ignore if */ if (entry === this.tail) { return entry.value } // HEAD--------------TAIL // &lt;.older .newer&gt; // &lt;--- add direction -- // A B C &lt;D&gt; E <span class="missing-if-branch" title="else path not taken" >E</span>if (entry.newer) { // 处理 newer 指向 if (entry === this.head) { // 如果查找到的缓存对象是 head (最近最少使用过的) // 则将 head 指向原 head 的 newer 所指向的缓存对象 this.head = entry.newer } // 将所查找的缓存对象的下一级的 older 指向所查找的缓存对象的older所指向的值 // 例如:A B C D E // 如果查找到的是D,那么将E指向C,不再指向D entry.newer.older = entry.older // C &lt;-- E. } if (entry.older) { // 处理 older 指向 // 如果查找到的是D,那么C指向E,不再指向D entry.older.newer = entry.newer // C. --&gt; E } // 处理所查找到的对象的 newer 以及 older 指向 entry.newer = void 0 // D --x // older指向之前使用过的变量,即D指向E entry.older = this.tail // D. --&gt; E <span class="missing-if-branch" title="else path not taken" >E</span>if (this.tail) { // 将E的newer指向D this.tail.newer = entry // E. &lt;-- D } // 改变 tail 为D this.tail = entry return entry.value } }</pre></td></tr> </table></pre> <div class='push'></div><!-- for sticky footer --> </div><!-- /wrapper --> <div class='footer quiet pad2 space-top1 center small'> Code coverage generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Tue Dec 13 2016 18:10:11 GMT+0800 (CST) </div> </div> <script src="../prettify.js"></script> <script> window.onload = function () { if (typeof prettyPrint === 'function') { prettyPrint(); } }; </script> <script src="../sorter.js"></script> </body> </html>