| 0 | 1 <html> | 
|  | 2 <head> | 
|  | 3 <title>MayaChemTools:Code:PseudoHeap.pm</title> | 
|  | 4 <meta http-equiv="content-type" content="text/html;charset=utf-8"> | 
|  | 5 <link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css"> | 
|  | 6 </head> | 
|  | 7 <body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10"> | 
|  | 8 <br/> | 
|  | 9 <center> | 
|  | 10 <a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a> | 
|  | 11 </center> | 
|  | 12 <br/> | 
|  | 13 <pre> | 
|  | 14 <a name="package-PseudoHeap-"></a>   1 <span class="k">package </span><span class="i">PseudoHeap</span><span class="sc">;</span> | 
|  | 15    2 <span class="c">#</span> | 
|  | 16    3 <span class="c"># $RCSfile: PseudoHeap.pm,v $</span> | 
|  | 17    4 <span class="c"># $Date: 2015/02/28 20:47:18 $</span> | 
|  | 18    5 <span class="c"># $Revision: 1.10 $</span> | 
|  | 19    6 <span class="c">#</span> | 
|  | 20    7 <span class="c"># Author: Manish Sud <msud@san.rr.com></span> | 
|  | 21    8 <span class="c">#</span> | 
|  | 22    9 <span class="c"># Copyright (C) 2015 Manish Sud. All rights reserved.</span> | 
|  | 23   10 <span class="c">#</span> | 
|  | 24   11 <span class="c"># This file is part of MayaChemTools.</span> | 
|  | 25   12 <span class="c">#</span> | 
|  | 26   13 <span class="c"># MayaChemTools is free software; you can redistribute it and/or modify it under</span> | 
|  | 27   14 <span class="c"># the terms of the GNU Lesser General Public License as published by the Free</span> | 
|  | 28   15 <span class="c"># Software Foundation; either version 3 of the License, or (at your option) any</span> | 
|  | 29   16 <span class="c"># later version.</span> | 
|  | 30   17 <span class="c">#</span> | 
|  | 31   18 <span class="c"># MayaChemTools is distributed in the hope that it will be useful, but without</span> | 
|  | 32   19 <span class="c"># any warranty; without even the implied warranty of merchantability of fitness</span> | 
|  | 33   20 <span class="c"># for a particular purpose.  See the GNU Lesser General Public License for more</span> | 
|  | 34   21 <span class="c"># details.</span> | 
|  | 35   22 <span class="c">#</span> | 
|  | 36   23 <span class="c"># You should have received a copy of the GNU Lesser General Public License</span> | 
|  | 37   24 <span class="c"># along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or</span> | 
|  | 38   25 <span class="c"># write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,</span> | 
|  | 39   26 <span class="c"># Boston, MA, 02111-1307, USA.</span> | 
|  | 40   27 <span class="c">#</span> | 
|  | 41   28 | 
|  | 42   29 <span class="k">use</span> <span class="w">strict</span><span class="sc">;</span> | 
|  | 43   30 <span class="k">use</span> <span class="w">Carp</span><span class="sc">;</span> | 
|  | 44   31 <span class="k">use</span> <span class="w">Exporter</span><span class="sc">;</span> | 
|  | 45   32 <span class="k">use</span> <span class="w">TextUtil</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 46   33 | 
|  | 47   34 <span class="k">use</span> <span class="w">vars</span> <span class="q">qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS)</span><span class="sc">;</span> | 
|  | 48   35 | 
|  | 49   36 <span class="i">@ISA</span> = <span class="q">qw(Exporter)</span><span class="sc">;</span> | 
|  | 50   37 <span class="i">@EXPORT</span> = <span class="q">qw()</span><span class="sc">;</span> | 
|  | 51   38 <span class="i">@EXPORT_OK</span> = <span class="q">qw()</span><span class="sc">;</span> | 
|  | 52   39 | 
|  | 53   40 <span class="i">%EXPORT_TAGS</span> = <span class="s">(</span> | 
|  | 54   41                 <span class="w">all</span>  <span class="cm">=></span> <span class="s">[</span><span class="i">@EXPORT</span><span class="cm">,</span> <span class="i">@EXPORT_OK</span><span class="s">]</span> | 
|  | 55   42                <span class="s">)</span><span class="sc">;</span> | 
|  | 56   43 | 
|  | 57   44 <span class="c"># Setup class variables...</span> | 
|  | 58   45 <span class="k">my</span><span class="s">(</span><span class="i">$ClassName</span><span class="s">)</span><span class="sc">;</span> | 
|  | 59   46 <span class="i">_InitializeClass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 60   47 | 
|  | 61   48 <span class="k">use</span> <span class="w">overload</span> <span class="q">'""'</span> <span class="cm">=></span> <span class="q">'StringifyPseudoHeap'</span><span class="sc">;</span> | 
|  | 62   49 | 
|  | 63   50 <span class="c"># PseudoHeap is designed to support tracking of a specific number of largest or smallest key/value</span> | 
|  | 64   51 <span class="c"># pairs with numeric or alphanumeric keys along with corresponding scalar or reference values.</span> | 
|  | 65   52 <span class="c">#</span> | 
|  | 66   53 <span class="c"># Although PseudoHeap is similar to a heap, it lacks number of key properties of a traditional heap data</span> | 
|  | 67   54 <span class="c"># structure: no concept of root, parent and child nodes; no ordering of keys in any particular order; no</span> | 
|  | 68   55 <span class="c"># specific localtion greatest or smallest key.</span> | 
|  | 69   56 <span class="c">#</span> | 
|  | 70   57 <span class="c"># The keys are simply stored in a hash with each key poining to an array containing specified values.</span> | 
|  | 71   58 <span class="c"># The min/max keys are updated during addition and deletion of key/value pairs; these can be retrieved</span> | 
|  | 72   59 <span class="c"># by accessing corresponding hash.</span> | 
|  | 73   60 <span class="c">#</span> | 
|  | 74   61 <span class="c"># Addition and deletion of key/value is also straightforward using hashes. However, min/max keys</span> | 
|  | 75   62 <span class="c"># need to be identified which is done using Perl sort on the keys.</span> | 
|  | 76   63 <span class="c">#</span> | 
|  | 77   64 <span class="c">#</span> | 
|  | 78   65 <span class="c"># Class constructor...</span> | 
|  | 79   66 <span class="c">#</span> | 
|  | 80 <a name="new-"></a>  67 <span class="k">sub </span><span class="m">new</span> <span class="s">{</span> | 
|  | 81   68   <span class="k">my</span><span class="s">(</span><span class="i">$Class</span><span class="cm">,</span> <span class="i">%NamesAndValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 82   69 | 
|  | 83   70   <span class="c"># Initialize object...</span> | 
|  | 84   71   <span class="k">my</span> <span class="i">$This</span> = <span class="s">{</span><span class="s">}</span><span class="sc">;</span> | 
|  | 85   72   <span class="k">bless</span> <span class="i">$This</span><span class="cm">,</span> <span class="k">ref</span><span class="s">(</span><span class="i">$Class</span><span class="s">)</span> || <span class="i">$Class</span><span class="sc">;</span> | 
|  | 86   73   <span class="i">$This</span><span class="i">->_InitializePseudoHeap</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 87   74 | 
|  | 88   75   <span class="i">$This</span><span class="i">->_InitializePseudoHeapProperties</span><span class="s">(</span><span class="i">%NamesAndValues</span><span class="s">)</span><span class="sc">;</span> | 
|  | 89   76 | 
|  | 90   77   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 91   78 <span class="s">}</span> | 
|  | 92   79 | 
|  | 93   80 <span class="c"># Initialize object data...</span> | 
|  | 94   81 <span class="c">#</span> | 
|  | 95 <a name="_InitializePseudoHeap-"></a>  82 <span class="k">sub </span><span class="m">_InitializePseudoHeap</span> <span class="s">{</span> | 
|  | 96   83   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 97   84 | 
|  | 98   85   <span class="c"># Type of pseudo heap:</span> | 
|  | 99   86   <span class="c">#</span> | 
|  | 100   87   <span class="c"># KeepTopN - Keep track of a specified number largest of key/value pairs</span> | 
|  | 101   88   <span class="c"># KeepBottomN - Keep track of a specified number smallest of key/value pairs</span> | 
|  | 102   89   <span class="c">#</span> | 
|  | 103   90   <span class="i">$This</span>->{<span class="w">Type</span>} = <span class="k">undef</span><span class="sc">;</span> | 
|  | 104   91 | 
|  | 105   92   <span class="c"># Type of keys: Numeric or Alphanumeric</span> | 
|  | 106   93   <span class="c">#</span> | 
|  | 107   94   <span class="c"># The value of KeyType determines comparison function used to sort and</span> | 
|  | 108   95   <span class="c"># and compare keys for a specific heap type as shown below:</span> | 
|  | 109   96   <span class="c">#</span> | 
|  | 110   97   <span class="c"># Type             KeyType       Comp  Sorting</span> | 
|  | 111   98   <span class="c">#</span> | 
|  | 112   99   <span class="c"># KeepTopN      Numeric       <     Descending</span> | 
|  | 113  100   <span class="c"># KeepTopN      AlphaNumeric  lt    Descending</span> | 
|  | 114  101   <span class="c"># KeepBottomN  Numeric        >     Ascending</span> | 
|  | 115  102   <span class="c"># KeepBottomN  AlphaNumeric   gt    Ascending</span> | 
|  | 116  103   <span class="c">#</span> | 
|  | 117  104   <span class="i">$This</span>->{<span class="w">KeyType</span>} = <span class="k">undef</span><span class="sc">;</span> | 
|  | 118  105 | 
|  | 119  106   <span class="c"># Maximum number of largest or smallest key/value pairs to keep...</span> | 
|  | 120  107   <span class="c">#</span> | 
|  | 121  108   <span class="i">$This</span>->{<span class="w">MaxSize</span>} = <span class="n">10</span><span class="sc">;</span> | 
|  | 122  109 | 
|  | 123  110   <span class="c"># Keys and values associated with each key as an array...</span> | 
|  | 124  111   <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 125  112 | 
|  | 126  113   <span class="c"># Min and max keys...</span> | 
|  | 127  114   <span class="i">$This</span>->{<span class="w">MinKey</span>} = <span class="k">undef</span><span class="sc">;</span> | 
|  | 128  115   <span class="i">$This</span>->{<span class="w">MaxKey</span>} = <span class="k">undef</span><span class="sc">;</span> | 
|  | 129  116 | 
|  | 130  117   <span class="c"># Number of key/valur pairs currently present...</span> | 
|  | 131  118   <span class="i">$This</span>->{<span class="w">CurrentSize</span>} = <span class="n">0</span><span class="sc">;</span> | 
|  | 132  119 | 
|  | 133  120   <span class="c"># Number of keys currently present where each key correspond to multiple values...</span> | 
|  | 134  121   <span class="i">$This</span>->{<span class="w">KeysCount</span>} = <span class="n">0</span><span class="sc">;</span> | 
|  | 135  122 <span class="s">}</span> | 
|  | 136  123 | 
|  | 137  124 <span class="c"># Initialize class ...</span> | 
|  | 138 <a name="_InitializeClass-"></a> 125 <span class="k">sub </span><span class="m">_InitializeClass</span> <span class="s">{</span> | 
|  | 139  126   <span class="c">#Class name...</span> | 
|  | 140  127   <span class="i">$ClassName</span> = <span class="w">__PACKAGE__</span><span class="sc">;</span> | 
|  | 141  128 | 
|  | 142  129 <span class="s">}</span> | 
|  | 143  130 | 
|  | 144  131 <span class="c"># Initialize object properties....</span> | 
|  | 145  132 <span class="c">#</span> | 
|  | 146 <a name="_InitializePseudoHeapProperties-"></a> 133 <span class="k">sub </span><span class="m">_InitializePseudoHeapProperties</span> <span class="s">{</span> | 
|  | 147  134   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">%NamesAndValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 148  135   <span class="k">my</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$MethodName</span><span class="s">)</span><span class="sc">;</span> | 
|  | 149  136 | 
|  | 150  137   <span class="k">while</span> <span class="s">(</span><span class="s">(</span><span class="i">$Name</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="k">each</span>  <span class="i">%NamesAndValues</span><span class="s">)</span> <span class="s">{</span> | 
|  | 151  138     <span class="i">$MethodName</span> = <span class="q">"Set${Name}"</span><span class="sc">;</span> | 
|  | 152  139     <span class="i">$This</span><span class="i">->$MethodName</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 153  140   <span class="s">}</span> | 
|  | 154  141 | 
|  | 155  142   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$NamesAndValues</span>{<span class="w">Type</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 156  143     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->New: Object can't be instantiated without specifying Type..."</span><span class="sc">;</span> | 
|  | 157  144   <span class="s">}</span> | 
|  | 158  145 | 
|  | 159  146   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$NamesAndValues</span>{<span class="w">KeyType</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 160  147     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->New: Object can't be instantiated without specifying KeyType..."</span><span class="sc">;</span> | 
|  | 161  148   <span class="s">}</span> | 
|  | 162  149 <span class="s">}</span> | 
|  | 163  150 | 
|  | 164  151 <span class="c"># Set heap type...</span> | 
|  | 165  152 <span class="c">#</span> | 
|  | 166 <a name="SetType-"></a> 153 <span class="k">sub </span><span class="m">SetType</span> <span class="s">{</span> | 
|  | 167  154   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Type</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 168  155 | 
|  | 169  156   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$This</span>->{<span class="w">Type</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 170  157     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetType: Can't change Type..."</span><span class="sc">;</span> | 
|  | 171  158   <span class="s">}</span> | 
|  | 172  159 | 
|  | 173  160   <span class="k">if</span> <span class="s">(</span><span class="i">$Type</span> !~ <span class="q">/^(KeepTopN|KeepBottomN)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 174  161     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetType: Unknown PseudoHeap type: $Type; Supported types: KeepTopN or KeepBottomN..."</span><span class="sc">;</span> | 
|  | 175  162   <span class="s">}</span> | 
|  | 176  163   <span class="i">$This</span>->{<span class="w">Type</span>} = <span class="i">$Type</span><span class="sc">;</span> | 
|  | 177  164 | 
|  | 178  165   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 179  166 <span class="s">}</span> | 
|  | 180  167 | 
|  | 181  168 <span class="c"># Get heap type..</span> | 
|  | 182  169 <span class="c">#</span> | 
|  | 183 <a name="GetType-"></a> 170 <span class="k">sub </span><span class="m">GetType</span> <span class="s">{</span> | 
|  | 184  171   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 185  172 | 
|  | 186  173   <span class="k">return</span> <span class="k">defined</span> <span class="i">$This</span>->{<span class="w">Type</span>} ? <span class="i">$This</span>->{<span class="w">Type</span>} <span class="co">:</span> <span class="q">'None'</span><span class="sc">;</span> | 
|  | 187  174 <span class="s">}</span> | 
|  | 188  175 | 
|  | 189  176 <span class="c"># Set key type...</span> | 
|  | 190  177 <span class="c">#</span> | 
|  | 191 <a name="SetKeyType-"></a> 178 <span class="k">sub </span><span class="m">SetKeyType</span> <span class="s">{</span> | 
|  | 192  179   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$KeyType</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 193  180 | 
|  | 194  181   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$This</span>->{<span class="w">KeyType</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 195  182     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetType: Can't change KeyType..."</span><span class="sc">;</span> | 
|  | 196  183   <span class="s">}</span> | 
|  | 197  184 | 
|  | 198  185   <span class="k">if</span> <span class="s">(</span><span class="i">$KeyType</span> !~ <span class="q">/^(Numeric|Alphanumeric)$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 199  186     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetType: Unknown PseudoHeap key type: $KeyType; Supported key types: Numeric or Alphanumeric..."</span><span class="sc">;</span> | 
|  | 200  187   <span class="s">}</span> | 
|  | 201  188   <span class="i">$This</span>->{<span class="w">KeyType</span>} = <span class="i">$KeyType</span><span class="sc">;</span> | 
|  | 202  189 | 
|  | 203  190   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 204  191 <span class="s">}</span> | 
|  | 205  192 | 
|  | 206  193 <span class="c"># Get key type..</span> | 
|  | 207  194 <span class="c">#</span> | 
|  | 208 <a name="GetKeyType-"></a> 195 <span class="k">sub </span><span class="m">GetKeyType</span> <span class="s">{</span> | 
|  | 209  196   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 210  197 | 
|  | 211  198   <span class="k">return</span> <span class="k">defined</span> <span class="i">$This</span>->{<span class="w">KeyType</span>} ? <span class="i">$This</span>->{<span class="w">KeyType</span>} <span class="co">:</span> <span class="q">'None'</span><span class="sc">;</span> | 
|  | 212  199 <span class="s">}</span> | 
|  | 213  200 | 
|  | 214  201 <span class="c"># Add a key/value pair...</span> | 
|  | 215  202 <span class="c">#</span> | 
|  | 216 <a name="AddKeyValuePair-"></a> 203 <span class="k">sub </span><span class="m">AddKeyValuePair</span> <span class="s">{</span> | 
|  | 217  204   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 218  205 | 
|  | 219  206   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Key</span><span class="s">)</span> && <span class="k">defined</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 220  207     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddKeyValuePair: No key added: Both key and value must be defined..."</span><span class="sc">;</span> | 
|  | 221  208     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 222  209   <span class="s">}</span> | 
|  | 223  210 | 
|  | 224  211   <span class="i">$This</span><span class="i">->_AddKeyValuePair</span><span class="s">(</span><span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 225  212 | 
|  | 226  213   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 227  214 <span class="s">}</span> | 
|  | 228  215 | 
|  | 229  216 <span class="c"># Add multiple key/value pairs...</span> | 
|  | 230  217 <span class="c">#</span> | 
|  | 231 <a name="AddKeyValuePairs-"></a> 218 <span class="k">sub </span><span class="m">AddKeyValuePairs</span> <span class="s">{</span> | 
|  | 232  219   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@KeyValuePairs</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 233  220 | 
|  | 234  221   <span class="k">if</span> <span class="s">(</span>!<span class="i">@KeyValuePairs</span><span class="s">)</span> <span class="s">{</span> | 
|  | 235  222     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddKeyValuePairs: No keys added: Key/Value pairs list is empty..."</span><span class="sc">;</span> | 
|  | 236  223     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 237  224   <span class="s">}</span> | 
|  | 238  225   <span class="k">if</span> <span class="s">(</span><span class="i">@KeyValuePairs</span> % <span class="n">2</span><span class="s">)</span> <span class="s">{</span> | 
|  | 239  226     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->AddKeyValuePairs: No keys pairs added: Invalid key/value pairs data: Input list must contain even number of values..."</span><span class="sc">;</span> | 
|  | 240  227     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 241  228   <span class="s">}</span> | 
|  | 242  229 | 
|  | 243  230   <span class="k">my</span><span class="s">(</span><span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span> | 
|  | 244  231   <span class="k">for</span> <span class="s">(</span><span class="i">$Index</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$Index</span> < <span class="i">$#KeyValuePairs</span><span class="sc">;</span> <span class="i">$Index</span> += <span class="n">2</span><span class="s">)</span> <span class="s">{</span> | 
|  | 245  232     <span class="i">$Key</span> = <span class="i">$KeyValuePairs</span>[<span class="i">$Index</span>]<span class="sc">;</span> <span class="i">$Value</span> = <span class="i">$KeyValuePairs</span>[<span class="i">$Index</span> + <span class="n">1</span>]<span class="sc">;</span> | 
|  | 246  233     <span class="i">$This</span><span class="i">->AddKeyValuePair</span><span class="s">(</span><span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 247  234   <span class="s">}</span> | 
|  | 248  235 | 
|  | 249  236   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 250  237 <span class="s">}</span> | 
|  | 251  238 | 
|  | 252  239 <span class="c"># Delete specified keys along with all associated values for each key...</span> | 
|  | 253  240 <span class="c">#</span> | 
|  | 254 <a name="DeleteKeys-"></a> 241 <span class="k">sub </span><span class="m">DeleteKeys</span> <span class="s">{</span> | 
|  | 255  242   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Keys</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 256  243 | 
|  | 257  244   <span class="k">if</span> <span class="s">(</span>!<span class="i">@Keys</span><span class="s">)</span> <span class="s">{</span> | 
|  | 258  245     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteKeys: No keys deleted: Keys list is empty..."</span><span class="sc">;</span> | 
|  | 259  246     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 260  247   <span class="s">}</span> | 
|  | 261  248   <span class="k">my</span><span class="s">(</span><span class="i">$Key</span><span class="s">)</span><span class="sc">;</span> | 
|  | 262  249   <span class="k">for</span> <span class="i">$Key</span> <span class="s">(</span><span class="i">@Keys</span><span class="s">)</span> <span class="s">{</span> | 
|  | 263  250     <span class="i">$This</span><span class="i">->DeleteKey</span><span class="s">(</span><span class="i">$Key</span><span class="s">)</span><span class="sc">;</span> | 
|  | 264  251   <span class="s">}</span> | 
|  | 265  252 | 
|  | 266  253   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 267  254 <span class="s">}</span> | 
|  | 268  255 | 
|  | 269  256 <span class="c"># Delete a sepcified key along with all of its associated values...</span> | 
|  | 270  257 <span class="c">#</span> | 
|  | 271 <a name="DeleteKey-"></a> 258 <span class="k">sub </span><span class="m">DeleteKey</span> <span class="s">{</span> | 
|  | 272  259   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Key</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 273  260 | 
|  | 274  261   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$Key</span> <span class="s">)</span> <span class="s">{</span> | 
|  | 275  262     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->DeleteKey: No key deleted: Key must be specified..."</span><span class="sc">;</span> | 
|  | 276  263     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 277  264   <span class="s">}</span> | 
|  | 278  265 | 
|  | 279  266   <span class="k">return</span> <span class="i">$This</span><span class="i">->_DeleteKey</span><span class="s">(</span><span class="i">$Key</span><span class="s">)</span><span class="sc">;</span> | 
|  | 280  267 <span class="s">}</span> | 
|  | 281  268 | 
|  | 282  269 <span class="c"># Delete min key along with all of its associated values...</span> | 
|  | 283  270 <span class="c">#</span> | 
|  | 284 <a name="DeleteMinKey-"></a> 271 <span class="k">sub </span><span class="m">DeleteMinKey</span> <span class="s">{</span> | 
|  | 285  272   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 286  273 | 
|  | 287  274   <span class="k">return</span> <span class="i">$This</span><span class="i">->DeleteKey</span><span class="s">(</span><span class="i">$This</span>->{<span class="w">MinKey</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 288  275 <span class="s">}</span> | 
|  | 289  276 | 
|  | 290  277 <span class="c"># Delete max key along with all of its associated values...</span> | 
|  | 291  278 <span class="c">#</span> | 
|  | 292 <a name="DeleteMaxKey-"></a> 279 <span class="k">sub </span><span class="m">DeleteMaxKey</span> <span class="s">{</span> | 
|  | 293  280   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 294  281 | 
|  | 295  282   <span class="k">return</span> <span class="i">$This</span><span class="i">->DeleteKey</span><span class="s">(</span><span class="i">$This</span>->{<span class="w">MaxKey</span>}<span class="s">)</span><span class="sc">;</span> | 
|  | 296  283 <span class="s">}</span> | 
|  | 297  284 | 
|  | 298  285 <span class="c"># Set max size...</span> | 
|  | 299  286 <span class="c">#</span> | 
|  | 300 <a name="SetMaxSize-"></a> 287 <span class="k">sub </span><span class="m">SetMaxSize</span> <span class="s">{</span> | 
|  | 301  288   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Size</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 302  289 | 
|  | 303  290   <span class="k">if</span> <span class="s">(</span>!<span class="i">TextUtil::IsPositiveInteger</span><span class="s">(</span><span class="i">$Size</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 304  291     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetMaxSize: Max size value, $Size, is not valid: It must be a positive  integer..."</span><span class="sc">;</span> | 
|  | 305  292   <span class="s">}</span> | 
|  | 306  293 | 
|  | 307  294   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$This</span>->{<span class="w">MinKey</span>}<span class="s">)</span> || <span class="k">defined</span><span class="s">(</span><span class="i">$This</span>->{<span class="w">MaxKey</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 308  295     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetMaxSize: Can't change max size: Keys are already present..."</span><span class="sc">;</span> | 
|  | 309  296   <span class="s">}</span> | 
|  | 310  297 | 
|  | 311  298   <span class="i">$This</span>->{<span class="w">MaxSize</span>} = <span class="i">$Size</span><span class="sc">;</span> | 
|  | 312  299 | 
|  | 313  300   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 314  301 <span class="s">}</span> | 
|  | 315  302 | 
|  | 316  303 <span class="c"># Get max size...</span> | 
|  | 317  304 <span class="c">#</span> | 
|  | 318 <a name="GetMaxSize-"></a> 305 <span class="k">sub </span><span class="m">GetMaxSize</span> <span class="s">{</span> | 
|  | 319  306   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 320  307 | 
|  | 321  308   <span class="k">return</span> <span class="i">$This</span>->{<span class="w">MaxMaxSize</span>}<span class="sc">;</span> | 
|  | 322  309 <span class="s">}</span> | 
|  | 323  310 | 
|  | 324  311 <span class="c"># Get current size...</span> | 
|  | 325  312 <span class="c">#</span> | 
|  | 326 <a name="GetCurrentSize-"></a> 313 <span class="k">sub </span><span class="m">GetCurrentSize</span> <span class="s">{</span> | 
|  | 327  314   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 328  315 | 
|  | 329  316   <span class="k">return</span> <span class="i">$This</span>->{<span class="w">CurrentSize</span>}<span class="sc">;</span> | 
|  | 330  317 <span class="s">}</span> | 
|  | 331  318 | 
|  | 332  319 <span class="c"># Get min key...</span> | 
|  | 333  320 <span class="c">#</span> | 
|  | 334 <a name="GetMinKey-"></a> 321 <span class="k">sub </span><span class="m">GetMinKey</span> <span class="s">{</span> | 
|  | 335  322   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 336  323 | 
|  | 337  324   <span class="k">return</span> <span class="k">defined</span> <span class="i">$This</span>->{<span class="w">MinKey</span>} ? <span class="i">$This</span>->{<span class="w">MinKey</span>} <span class="co">:</span> <span class="q">'None'</span><span class="sc">;</span> | 
|  | 338  325 <span class="s">}</span> | 
|  | 339  326 | 
|  | 340  327 <span class="c"># Get max key...</span> | 
|  | 341  328 <span class="c">#</span> | 
|  | 342 <a name="GetMaxKey-"></a> 329 <span class="k">sub </span><span class="m">GetMaxKey</span> <span class="s">{</span> | 
|  | 343  330   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 344  331 | 
|  | 345  332   <span class="k">return</span> <span class="k">defined</span> <span class="i">$This</span>->{<span class="w">MaxKey</span>} ? <span class="i">$This</span>->{<span class="w">MaxKey</span>} <span class="co">:</span> <span class="q">'None'</span><span class="sc">;</span> | 
|  | 346  333 <span class="s">}</span> | 
|  | 347  334 | 
|  | 348  335 <span class="c"># Get keys...</span> | 
|  | 349  336 <span class="c">#</span> | 
|  | 350 <a name="GetKeys-"></a> 337 <span class="k">sub </span><span class="m">GetKeys</span> <span class="s">{</span> | 
|  | 351  338   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 352  339 | 
|  | 353  340   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}} <span class="co">:</span> <span class="k">scalar</span> <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}}<span class="sc">;</span> | 
|  | 354  341 <span class="s">}</span> | 
|  | 355  342 | 
|  | 356  343 <span class="c"># Get sorted keys...</span> | 
|  | 357  344 <span class="c">#</span> | 
|  | 358 <a name="GetSortedKeys-"></a> 345 <span class="k">sub </span><span class="m">GetSortedKeys</span> <span class="s">{</span> | 
|  | 359  346   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 360  347   <span class="k">my</span><span class="s">(</span><span class="i">@SortedKeys</span><span class="s">)</span><span class="sc">;</span> | 
|  | 361  348 | 
|  | 362  349   <span class="i">@SortedKeys</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 363  350   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Type</span>} =~ <span class="q">/^KeepTopN$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 364  351     <span class="i">@SortedKeys</span> = <span class="s">(</span><span class="i">$This</span>->{<span class="w">KeyType</span>} =~ <span class="q">/^Numeric$/i</span><span class="s">)</span> ? <span class="s">(</span><span class="k">sort</span> <span class="s">{</span> <span class="i">$b</span> <=> <span class="i">$a</span> <span class="s">}</span> <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}}<span class="s">)</span> <span class="co">:</span> <span class="s">(</span><span class="k">sort</span> <span class="s">{</span> <span class="i">$b</span> <span class="k">cmp</span> <span class="i">$a</span> <span class="s">}</span> <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}}<span class="s">)</span><span class="sc">;</span> | 
|  | 365  352   <span class="s">}</span> | 
|  | 366  353   <span class="k">elsif</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Type</span>} =~ <span class="q">/^KeepBottomN$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 367  354     <span class="i">@SortedKeys</span> = <span class="s">(</span><span class="i">$This</span>->{<span class="w">KeyType</span>} =~ <span class="q">/^Numeric$/i</span><span class="s">)</span> ? <span class="s">(</span><span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span> <=> <span class="i">$b</span> <span class="s">}</span> <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}}<span class="s">)</span> <span class="co">:</span> <span class="s">(</span><span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span> <span class="k">cmp</span> <span class="i">$b</span> <span class="s">}</span> <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}}<span class="s">)</span><span class="sc">;</span> | 
|  | 368  355   <span class="s">}</span> | 
|  | 369  356 | 
|  | 370  357   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@SortedKeys</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@SortedKeys</span><span class="sc">;</span> | 
|  | 371  358 <span class="s">}</span> | 
|  | 372  359 | 
|  | 373  360 <span class="c"># Get values associated with a specified key...</span> | 
|  | 374 <a name="GetKeyValues-"></a> 361 <span class="k">sub </span><span class="m">GetKeyValues</span> <span class="s">{</span> | 
|  | 375  362   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Key</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 376  363   <span class="k">my</span><span class="s">(</span><span class="i">@KeyValues</span><span class="s">)</span><span class="sc">;</span> | 
|  | 377  364 | 
|  | 378  365   <span class="i">@KeyValues</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 379  366   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Key</span><span class="s">)</span> && <span class="k">exists</span><span class="s">(</span><span class="i">$This</span>->{<span class="w">Keys</span>}{<span class="i">$Key</span>}<span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 380  367     <span class="i">@KeyValues</span> = <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}{<span class="i">$Key</span>}}<span class="sc">;</span> | 
|  | 381  368   <span class="s">}</span> | 
|  | 382  369   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@KeyValues</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@KeyValues</span><span class="sc">;</span> | 
|  | 383  370 <span class="s">}</span> | 
|  | 384  371 | 
|  | 385  372 <span class="c">#  Add key/value pair...</span> | 
|  | 386  373 <span class="c">#</span> | 
|  | 387 <a name="_AddKeyValuePair-"></a> 374 <span class="k">sub </span><span class="m">_AddKeyValuePair</span><span class="s">{</span> | 
|  | 388  375   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 389  376 | 
|  | 390  377   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">CurrentSize</span>} < <span class="i">$This</span>->{<span class="w">MaxSize</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 391  378     <span class="k">return</span> <span class="i">$This</span><span class="i">->_AppendKeyValuePair</span><span class="s">(</span><span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 392  379   <span class="s">}</span> | 
|  | 393  380   <span class="k">else</span> <span class="s">{</span> | 
|  | 394  381     <span class="k">return</span> <span class="i">$This</span><span class="i">->_InsertKeyValuePair</span><span class="s">(</span><span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 395  382   <span class="s">}</span> | 
|  | 396  383 <span class="s">}</span> | 
|  | 397  384 | 
|  | 398  385 <span class="c"># Append key/value pair...</span> | 
|  | 399  386 <span class="c">#</span> | 
|  | 400 <a name="_AppendKeyValuePair-"></a> 387 <span class="k">sub </span><span class="m">_AppendKeyValuePair</span> <span class="s">{</span> | 
|  | 401  388   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 402  389 | 
|  | 403  390   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Keys</span>}{<span class="i">$Key</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 404  391     <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}{<span class="i">$Key</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 405  392     <span class="i">$This</span>->{<span class="w">KeysCount</span>} += <span class="n">1</span><span class="sc">;</span> | 
|  | 406  393 | 
|  | 407  394     <span class="i">$This</span><span class="i">->_CompareAndSetMinKey</span><span class="s">(</span><span class="i">$Key</span><span class="s">)</span><span class="sc">;</span> | 
|  | 408  395     <span class="i">$This</span><span class="i">->_CompareAndSetMaxKey</span><span class="s">(</span><span class="i">$Key</span><span class="s">)</span><span class="sc">;</span> | 
|  | 409  396   <span class="s">}</span> | 
|  | 410  397 | 
|  | 411  398   <span class="k">push</span> <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}{<span class="i">$Key</span>}}<span class="cm">,</span> <span class="i">$Value</span><span class="sc">;</span> | 
|  | 412  399   <span class="i">$This</span>->{<span class="w">CurrentSize</span>} += <span class="n">1</span><span class="sc">;</span> | 
|  | 413  400 | 
|  | 414  401   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 415  402 <span class="s">}</span> | 
|  | 416  403 | 
|  | 417  404 <span class="c"># Insert key/value pair...</span> | 
|  | 418  405 <span class="c">#</span> | 
|  | 419 <a name="_InsertKeyValuePair-"></a> 406 <span class="k">sub </span><span class="m">_InsertKeyValuePair</span> <span class="s">{</span> | 
|  | 420  407   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 421  408 | 
|  | 422  409   <span class="c"># Is this key need to be inserted?</span> | 
|  | 423  410   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->_IsKeyNeedToBeInserted</span><span class="s">(</span><span class="i">$Key</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 424  411     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 425  412   <span class="s">}</span> | 
|  | 426  413 | 
|  | 427  414   <span class="c"># Insert key/value pair...</span> | 
|  | 428  415   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Keys</span>}{<span class="i">$Key</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 429  416     <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}{<span class="i">$Key</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 430  417     <span class="i">$This</span>->{<span class="w">KeysCount</span>} += <span class="n">1</span><span class="sc">;</span> | 
|  | 431  418   <span class="s">}</span> | 
|  | 432  419   <span class="k">push</span> <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}{<span class="i">$Key</span>}}<span class="cm">,</span> <span class="i">$Value</span><span class="sc">;</span> | 
|  | 433  420   <span class="i">$This</span>->{<span class="w">CurrentSize</span>} += <span class="n">1</span><span class="sc">;</span> | 
|  | 434  421 | 
|  | 435  422   <span class="c"># Remove min or max key/value pair along with its update...</span> | 
|  | 436  423   <span class="k">my</span><span class="s">(</span><span class="i">$KeyToDetele</span><span class="s">)</span><span class="sc">;</span> | 
|  | 437  424 | 
|  | 438  425   <span class="i">$KeyToDetele</span> = <span class="s">(</span><span class="i">$This</span>->{<span class="w">Type</span>} =~ <span class="q">/^KeepTopN$/i</span><span class="s">)</span> ? <span class="i">$This</span>->{<span class="w">MinKey</span>} <span class="co">:</span> <span class="i">$This</span>->{<span class="w">MaxKey</span>}<span class="sc">;</span> | 
|  | 439  426   <span class="i">$This</span><span class="i">->_DeleteKeyValuePair</span><span class="s">(</span><span class="i">$KeyToDetele</span><span class="s">)</span><span class="sc">;</span> | 
|  | 440  427 | 
|  | 441  428   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 442  429 <span class="s">}</span> | 
|  | 443  430 | 
|  | 444  431 <span class="c"># Check whether it makes sense to insert specified key...</span> | 
|  | 445  432 <span class="c">#</span> | 
|  | 446 <a name="_IsKeyNeedToBeInserted-"></a> 433 <span class="k">sub </span><span class="m">_IsKeyNeedToBeInserted</span> <span class="s">{</span> | 
|  | 447  434   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Key</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 448  435 | 
|  | 449  436   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Type</span>} =~ <span class="q">/^KeepTopN$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 450  437     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">KeyType</span>} =~ <span class="q">/^Numeric$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 451  438       <span class="k">return</span> <span class="s">(</span><span class="i">$Key</span> < <span class="i">$This</span>->{<span class="w">MinKey</span>}<span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="s">(</span><span class="s">(</span><span class="s">(</span><span class="i">$This</span>->{<span class="w">KeysCount</span>} == <span class="n">1</span><span class="s">)</span> && <span class="s">(</span><span class="i">$This</span>->{<span class="w">MinKey</span>} == <span class="i">$Key</span><span class="s">)</span><span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 452  439     <span class="s">}</span> | 
|  | 453  440     <span class="k">else</span> <span class="s">{</span> | 
|  | 454  441       <span class="k">return</span> <span class="s">(</span><span class="i">$Key</span> <span class="k">lt</span> <span class="i">$This</span>->{<span class="w">MinKey</span>}<span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="s">(</span><span class="s">(</span><span class="s">(</span><span class="i">$This</span>->{<span class="w">KeysCount</span>} == <span class="n">1</span><span class="s">)</span> && <span class="s">(</span><span class="i">$This</span>->{<span class="w">MinKey</span>} <span class="k">eq</span> <span class="i">$Key</span><span class="s">)</span><span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 455  442     <span class="s">}</span> | 
|  | 456  443   <span class="s">}</span> | 
|  | 457  444   <span class="k">elsif</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Type</span>} =~ <span class="q">/^KeepBottomN$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 458  445     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">KeyType</span>} =~ <span class="q">/^Numeric$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 459  446       <span class="k">return</span> <span class="s">(</span><span class="i">$Key</span> > <span class="i">$This</span>->{<span class="w">MaxKey</span>}<span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="s">(</span><span class="s">(</span><span class="s">(</span><span class="i">$This</span>->{<span class="w">KeysCount</span>} == <span class="n">1</span><span class="s">)</span> && <span class="s">(</span><span class="i">$This</span>->{<span class="w">MaxKey</span>} == <span class="i">$Key</span><span class="s">)</span><span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 460  447     <span class="s">}</span> | 
|  | 461  448     <span class="k">else</span> <span class="s">{</span> | 
|  | 462  449       <span class="k">return</span> <span class="s">(</span><span class="i">$Key</span> <span class="k">gt</span> <span class="i">$This</span>->{<span class="w">MaxKey</span>}<span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="s">(</span><span class="s">(</span><span class="s">(</span><span class="i">$This</span>->{<span class="w">KeysCount</span>} == <span class="n">1</span><span class="s">)</span> && <span class="s">(</span><span class="i">$This</span>->{<span class="w">MaxKey</span>} <span class="k">eq</span> <span class="i">$Key</span><span class="s">)</span><span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span> | 
|  | 463  450     <span class="s">}</span> | 
|  | 464  451   <span class="s">}</span> | 
|  | 465  452 | 
|  | 466  453   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 467  454 <span class="s">}</span> | 
|  | 468  455 | 
|  | 469  456 <span class="c"># Set min key...</span> | 
|  | 470  457 <span class="c">#</span> | 
|  | 471 <a name="_CompareAndSetMinKey-"></a> 458 <span class="k">sub </span><span class="m">_CompareAndSetMinKey</span> <span class="s">{</span> | 
|  | 472  459   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Key</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 473  460 | 
|  | 474  461   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$This</span>->{<span class="w">MinKey</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 475  462     <span class="i">$This</span>->{<span class="w">MinKey</span>} = <span class="i">$Key</span><span class="sc">;</span> | 
|  | 476  463     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 477  464   <span class="s">}</span> | 
|  | 478  465 | 
|  | 479  466   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">KeyType</span>} =~ <span class="q">/^Numeric$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 480  467     <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> < <span class="i">$This</span>->{<span class="w">MinKey</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 481  468       <span class="i">$This</span>->{<span class="w">MinKey</span>} = <span class="i">$Key</span><span class="sc">;</span> | 
|  | 482  469     <span class="s">}</span> | 
|  | 483  470   <span class="s">}</span> | 
|  | 484  471   <span class="k">else</span> <span class="s">{</span> | 
|  | 485  472     <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> <span class="k">lt</span> <span class="i">$This</span>->{<span class="w">MinKey</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 486  473       <span class="i">$This</span>->{<span class="w">MinKey</span>} = <span class="i">$Key</span><span class="sc">;</span> | 
|  | 487  474     <span class="s">}</span> | 
|  | 488  475   <span class="s">}</span> | 
|  | 489  476 | 
|  | 490  477   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 491  478 <span class="s">}</span> | 
|  | 492  479 | 
|  | 493  480 <span class="c"># Set max key...</span> | 
|  | 494  481 <span class="c">#</span> | 
|  | 495 <a name="_CompareAndSetMaxKey-"></a> 482 <span class="k">sub </span><span class="m">_CompareAndSetMaxKey</span> <span class="s">{</span> | 
|  | 496  483   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Key</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 497  484 | 
|  | 498  485   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$This</span>->{<span class="w">MaxKey</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 499  486     <span class="i">$This</span>->{<span class="w">MaxKey</span>} = <span class="i">$Key</span><span class="sc">;</span> | 
|  | 500  487     <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 501  488   <span class="s">}</span> | 
|  | 502  489 | 
|  | 503  490   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">KeyType</span>} =~ <span class="q">/^Numeric$/i</span><span class="s">)</span> <span class="s">{</span> | 
|  | 504  491     <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> > <span class="i">$This</span>->{<span class="w">MaxKey</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 505  492       <span class="i">$This</span>->{<span class="w">MaxKey</span>} = <span class="i">$Key</span><span class="sc">;</span> | 
|  | 506  493     <span class="s">}</span> | 
|  | 507  494   <span class="s">}</span> | 
|  | 508  495   <span class="k">else</span> <span class="s">{</span> | 
|  | 509  496     <span class="k">if</span> <span class="s">(</span><span class="i">$Key</span> <span class="k">gt</span> <span class="i">$This</span>->{<span class="w">MaxKey</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 510  497       <span class="i">$This</span>->{<span class="w">MaxKey</span>} = <span class="i">$Key</span><span class="sc">;</span> | 
|  | 511  498     <span class="s">}</span> | 
|  | 512  499   <span class="s">}</span> | 
|  | 513  500 | 
|  | 514  501   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 515  502 <span class="s">}</span> | 
|  | 516  503 | 
|  | 517  504 <span class="c"># Delete a sepcified key along with all of its values added to the list...</span> | 
|  | 518  505 <span class="c">#</span> | 
|  | 519 <a name="_DeleteKey-"></a> 506 <span class="k">sub </span><span class="m">_DeleteKey</span> <span class="s">{</span> | 
|  | 520  507   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Key</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 521  508   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfValues</span><span class="s">)</span><span class="sc">;</span> | 
|  | 522  509 | 
|  | 523  510   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Keys</span>}{<span class="i">$Key</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 524  511     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 525  512   <span class="s">}</span> | 
|  | 526  513 | 
|  | 527  514   <span class="c"># Delete all key values...</span> | 
|  | 528  515   <span class="i">$NumOfValues</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}{<span class="i">$Key</span>}}<span class="sc">;</span> | 
|  | 529  516   <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}{<span class="i">$Key</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 530  517   <span class="i">$This</span>->{<span class="w">CurrentSize</span>} -= <span class="i">$NumOfValues</span><span class="sc">;</span> | 
|  | 531  518 | 
|  | 532  519   <span class="c"># Delete key...</span> | 
|  | 533  520   <span class="k">delete</span> <span class="i">$This</span>->{<span class="w">Keys</span>}{<span class="i">$Key</span>}<span class="sc">;</span> | 
|  | 534  521   <span class="i">$This</span>->{<span class="w">KeysCount</span>} -= <span class="n">1</span><span class="sc">;</span> | 
|  | 535  522 | 
|  | 536  523   <span class="c"># Set min and max keys...</span> | 
|  | 537  524   <span class="i">$This</span><span class="i">->_FindAndSetMinAndMaxKeys</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 538  525 | 
|  | 539  526   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 540  527 <span class="s">}</span> | 
|  | 541  528 | 
|  | 542  529 <span class="c"># Delete a sepcified key along with its most recent value added to the list...</span> | 
|  | 543  530 <span class="c">#</span> | 
|  | 544 <a name="_DeleteKeyValuePair-"></a> 531 <span class="k">sub </span><span class="m">_DeleteKeyValuePair</span> <span class="s">{</span> | 
|  | 545  532   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Key</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 546  533 | 
|  | 547  534   <span class="k">if</span> <span class="s">(</span>!<span class="k">exists</span> <span class="i">$This</span>->{<span class="w">Keys</span>}{<span class="i">$Key</span>}<span class="s">)</span> <span class="s">{</span> | 
|  | 548  535     <span class="k">return</span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 549  536   <span class="s">}</span> | 
|  | 550  537 | 
|  | 551  538   <span class="c"># Delete value...</span> | 
|  | 552  539   <span class="k">pop</span> <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}{<span class="i">$Key</span>}}<span class="sc">;</span> | 
|  | 553  540   <span class="i">$This</span>->{<span class="w">CurrentSize</span>} -= <span class="n">1</span><span class="sc">;</span> | 
|  | 554  541 | 
|  | 555  542   <span class="c"># Delete key...</span> | 
|  | 556  543   <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}{<span class="i">$Key</span>}}<span class="s">)</span> <span class="s">{</span> | 
|  | 557  544     <span class="k">delete</span> <span class="i">$This</span>->{<span class="w">Keys</span>}{<span class="i">$Key</span>}<span class="sc">;</span> | 
|  | 558  545     <span class="i">$This</span>->{<span class="w">KeysCount</span>} -= <span class="n">1</span><span class="sc">;</span> | 
|  | 559  546   <span class="s">}</span> | 
|  | 560  547 | 
|  | 561  548   <span class="c"># Set min and max keys...</span> | 
|  | 562  549   <span class="i">$This</span><span class="i">->_FindAndSetMinAndMaxKeys</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 563  550 | 
|  | 564  551   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 565  552 <span class="s">}</span> | 
|  | 566  553 | 
|  | 567  554 <span class="c"># Set min and max key...</span> | 
|  | 568  555 <span class="c">#</span> | 
|  | 569 <a name="_FindAndSetMinAndMaxKeys-"></a> 556 <span class="k">sub </span><span class="m">_FindAndSetMinAndMaxKeys</span> <span class="s">{</span> | 
|  | 570  557   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 571  558   <span class="k">my</span><span class="s">(</span><span class="i">@SortedKeys</span><span class="s">)</span><span class="sc">;</span> | 
|  | 572  559 | 
|  | 573  560   <span class="i">@SortedKeys</span> = <span class="s">(</span><span class="i">$This</span>->{<span class="w">KeyType</span>} =~ <span class="q">/^Numeric$/i</span><span class="s">)</span> ? <span class="s">(</span><span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span> <=> <span class="i">$b</span> <span class="s">}</span> <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}}<span class="s">)</span> <span class="co">:</span> <span class="s">(</span><span class="k">sort</span> <span class="s">{</span> <span class="i">$a</span> <span class="k">cmp</span> <span class="i">$b</span> <span class="s">}</span> <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">Keys</span>}}<span class="s">)</span><span class="sc">;</span> | 
|  | 574  561 | 
|  | 575  562   <span class="k">if</span> <span class="s">(</span><span class="i">@SortedKeys</span><span class="s">)</span> <span class="s">{</span> | 
|  | 576  563     <span class="i">$This</span>->{<span class="w">MinKey</span>} = <span class="i">$SortedKeys</span>[<span class="n">0</span>]<span class="sc">;</span> | 
|  | 577  564     <span class="i">$This</span>->{<span class="w">MaxKey</span>} = <span class="i">$SortedKeys</span>[<span class="i">$#SortedKeys</span>]<span class="sc">;</span> | 
|  | 578  565   <span class="s">}</span> | 
|  | 579  566   <span class="k">else</span> <span class="s">{</span> | 
|  | 580  567     <span class="i">$This</span>->{<span class="w">MinKey</span>} = <span class="k">undef</span><span class="sc">;</span> | 
|  | 581  568     <span class="i">$This</span>->{<span class="w">MaxKey</span>} = <span class="k">undef</span><span class="sc">;</span> | 
|  | 582  569   <span class="s">}</span> | 
|  | 583  570 | 
|  | 584  571   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 585  572 <span class="s">}</span> | 
|  | 586  573 | 
|  | 587  574 <span class="c"># Return a string containing vector values...</span> | 
|  | 588 <a name="StringifyPseudoHeap-"></a> 575 <span class="k">sub </span><span class="m">StringifyPseudoHeap</span> <span class="s">{</span> | 
|  | 589  576   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> | 
|  | 590  577   <span class="k">my</span><span class="s">(</span><span class="i">$PseudoHeapString</span><span class="cm">,</span> <span class="i">$Key</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$KeyValuesString</span><span class="cm">,</span> <span class="i">@KeysAndValues</span><span class="s">)</span><span class="sc">;</span> | 
|  | 591  578 | 
|  | 592  579   <span class="i">$PseudoHeapString</span> = <span class="q">"PseudoHeap: Type: "</span> . <span class="i">$This</span><span class="i">->GetType</span><span class="s">(</span><span class="s">)</span> . <span class="q">"; KeyType: "</span> . <span class="i">$This</span><span class="i">->GetKeyType</span><span class="s">(</span><span class="s">)</span> . <span class="q">"; MaxSize: $This->{MaxSize}; CurrentSize: $This->{CurrentSize}; MinKey: "</span> . <span class="i">$This</span><span class="i">->GetMinKey</span><span class="s">(</span><span class="s">)</span> .  <span class="q">"; MaxKey: "</span> . <span class="i">$This</span><span class="i">->GetMaxKey</span><span class="s">(</span><span class="s">)</span> . <span class="q">"; NumOfUniqueKeys: $This->{KeysCount}"</span><span class="sc">;</span> | 
|  | 593  580 | 
|  | 594  581   <span class="i">@KeysAndValues</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 595  582   <span class="k">for</span> <span class="i">$Key</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetSortedKeys</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 596  583     <span class="k">for</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetKeyValues</span><span class="s">(</span><span class="i">$Key</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 597  584       <span class="k">push</span> <span class="i">@KeysAndValues</span><span class="cm">,</span> <span class="q">"$Key - $Value"</span><span class="sc">;</span> | 
|  | 598  585     <span class="s">}</span> | 
|  | 599  586   <span class="s">}</span> | 
|  | 600  587   <span class="k">if</span> <span class="s">(</span><span class="i">@KeysAndValues</span><span class="s">)</span> <span class="s">{</span> | 
|  | 601  588     <span class="i">$KeyValuesString</span> = <span class="i">TextUtil::JoinWords</span><span class="s">(</span>\<span class="i">@KeysAndValues</span><span class="cm">,</span> <span class="q">"; "</span><span class="cm">,</span> <span class="n">0</span><span class="s">)</span><span class="sc">;</span> | 
|  | 602  589   <span class="s">}</span> | 
|  | 603  590   <span class="k">else</span> <span class="s">{</span> | 
|  | 604  591     <span class="i">$KeyValuesString</span> = <span class="q">"None"</span><span class="sc">;</span> | 
|  | 605  592   <span class="s">}</span> | 
|  | 606  593 | 
|  | 607  594   <span class="i">$PseudoHeapString</span> .= <span class="q">"; Sorted Key - Value pairs: [$KeyValuesString]"</span><span class="sc">;</span> | 
|  | 608  595 | 
|  | 609  596   <span class="k">return</span> <span class="i">$PseudoHeapString</span><span class="sc">;</span> | 
|  | 610  597 <span class="s">}</span> | 
|  | 611  598 | 
|  | 612 <a name="EOF-"></a></pre> | 
|  | 613 <p> </p> | 
|  | 614 <br /> | 
|  | 615 <center> | 
|  | 616 <img src="../../../images/h2o2.png"> | 
|  | 617 </center> | 
|  | 618 </body> | 
|  | 619 </html> |