| 
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>
 |