Sophie

Sophie

distrib > Mandriva > 10.0-com > i586 > by-pkgid > af7a4b7f1ee5a4a084c41b9005da5527 > files > 303

libfox1.1_46-devel-1.1.46-1mdk.i586.rpm

<html>
<head>
<link rel="stylesheet" href="page.css" type="text/css">
<title>fox-toolkit.org - Documentation</title>
</head>
<body bgcolor=#ffffff link=#990033 vlink=#990033 alink=#990033 text=#000000>
<font face='verdana,sans-serif' size=2 >

<!---- TOPIC TITLE WITH LOGO--->
<table border=0 cellpadding= cellspacing=2 width=100% ><tr><td><a href='http://www.fox-toolkit.org/doc.html'><img src='../art/foxlogo_small.jpg' border=0></a></td><td width=100% valign=bottom><font face='verdana,sans-serif' size=2 ><b>
<a class="qindex" href="index.html">Main Page</a> &nbsp; <a class="qindex" href="hierarchy.html">Class Hierarchy</a> &nbsp; <a class="qindex" href="classes.html">Alphabetical List</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a>
<br><img src='../art/line.gif' width=100% height=1></b></font></td></tr></table>
<p>
<!--- TOPIC TITLE WITH LOGO --->
<!-- Generated by Doxygen 1.3.3 -->
<h1>FXArray.h</h1><div class="fragment"><pre>00001 <span class="comment">/********************************************************************************</span>
00002 <span class="comment">*                                                                               *</span>
00003 <span class="comment">*                          G e n e r i c   A r r a y                            *</span>
00004 <span class="comment">*                                                                               *</span>
00005 <span class="comment">*********************************************************************************</span>
00006 <span class="comment">* Copyright (C) 1997,2004 by Jeroen van der Zijp.   All Rights Reserved.        *</span>
00007 <span class="comment">*********************************************************************************</span>
00008 <span class="comment">* This library is free software; you can redistribute it and/or                 *</span>
00009 <span class="comment">* modify it under the terms of the GNU Lesser General Public                    *</span>
00010 <span class="comment">* License as published by the Free Software Foundation; either                  *</span>
00011 <span class="comment">* version 2.1 of the License, or (at your option) any later version.            *</span>
00012 <span class="comment">*                                                                               *</span>
00013 <span class="comment">* This library is distributed in the hope that it will be useful,               *</span>
00014 <span class="comment">* but WITHOUT ANY WARRANTY; without even the implied warranty of                *</span>
00015 <span class="comment">* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU             *</span>
00016 <span class="comment">* Lesser General Public License for more details.                               *</span>
00017 <span class="comment">*                                                                               *</span>
00018 <span class="comment">* You should have received a copy of the GNU Lesser General Public              *</span>
00019 <span class="comment">* License along with this library; if not, write to the Free Software           *</span>
00020 <span class="comment">* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.    *</span>
00021 <span class="comment">*********************************************************************************</span>
00022 <span class="comment">* $Id: FXArray.h,v 1.17 2004/02/08 17:17:33 fox Exp $                           *</span>
00023 <span class="comment">********************************************************************************/</span>
00024 <span class="preprocessor">#ifndef FXARRAY_H</span>
00025 <span class="preprocessor"></span><span class="preprocessor">#define FXARRAY_H</span>
00026 <span class="preprocessor"></span>
00027 <span class="preprocessor">#ifndef FXELEMENT_H</span>
00028 <span class="preprocessor"></span><span class="preprocessor">#include "FXElement.h"</span>
00029 <span class="preprocessor">#endif</span>
00030 <span class="preprocessor"></span>
00031 <span class="keyword">namespace </span>FX {
00032 
00033 
00034 <span class="comment">/*************************  D e f i n i t i o n  *******************************/</span>
00035 
00036 
00037 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00038 <span class="keyword">class </span>FXArray {
00039   TYPE   *list;                <span class="comment">// List of items</span>
00040   FXint   number;              <span class="comment">// Used slots</span>
00041   FXint   total;               <span class="comment">// Total slots</span>
00042   FXint   grow;                <span class="comment">// Grow amount</span>
00043 <span class="keyword">public</span>:
00044   FXArray();
00045   FXArray(<span class="keyword">const</span> FXArray&lt;TYPE&gt;&amp; orig);
00046   FXArray&lt;TYPE&gt;&amp; operator=(<span class="keyword">const</span> FXArray&lt;TYPE&gt; &amp;orig);
00047   <span class="keyword">inline</span> FXint no() <span class="keyword">const</span>;
00048   <span class="keyword">inline</span> TYPE* data() <span class="keyword">const</span>;
00049   <span class="keyword">inline</span> FXint size() <span class="keyword">const</span>;
00050   <span class="keywordtype">void</span> size(FXint n);
00051   FXint inc() <span class="keyword">const</span>;
00052   <span class="keywordtype">void</span> inc(FXint n);
00053   <span class="keyword">inline</span> <span class="keyword">const</span> TYPE&amp; operator [](FXint i) <span class="keyword">const</span>;
00054   <span class="keyword">inline</span> TYPE&amp; operator [](FXint i);
00055   <span class="keywordtype">void</span> insert(FXint pos,<span class="keyword">const</span> TYPE&amp; p);
00056   <span class="keywordtype">void</span> append(<span class="keyword">const</span> TYPE&amp; p);
00057   <span class="keywordtype">void</span> prepend(<span class="keyword">const</span> TYPE&amp; p);
00058   <span class="keywordtype">void</span> remove(FXint pos);
00059   <span class="keywordtype">void</span> extract(<span class="keyword">const</span> TYPE&amp; p);
00060   FXint find(<span class="keyword">const</span> TYPE&amp; p,FXint pos=0);
00061   FXint rfind(<span class="keyword">const</span> TYPE&amp; p,FXint pos=2147483647);
00062   <span class="keywordtype">void</span> trunc();
00063   <span class="keywordtype">void</span> clear();
00064   <span class="keywordtype">void</span> save(FXStream&amp; store) <span class="keyword">const</span>;
00065   <span class="keywordtype">void</span> load(FXStream&amp; store);
00066  ~FXArray();
00067   };
00068 
00069 
00070 <span class="comment">/**********************  I m p l e m e n t a t i o n  ************************/</span>
00071 
00072 
00073 <span class="comment">// Construct as empty</span>
00074 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00075 FXArray&lt;TYPE&gt;::FXArray(){
00076   list=NULL;
00077   number=0;
00078   total=0;
00079   grow=0;
00080   }
00081 
00082 
00083 <span class="comment">// Copy construct</span>
00084 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00085 FXArray&lt;TYPE&gt;::FXArray(<span class="keyword">const</span> FXArray&lt;TYPE&gt;&amp; orig){
00086   number=orig.number;
00087   total=orig.total;
00088   grow=orig.grow;
00089   allocElms(list,total);
00090   constructElms(list,number);
00091   copyElms(list,orig.list,number);
00092   }
00093 
00094 
00095 <span class="comment">// Return number of elements</span>
00096 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00097 FXint FXArray&lt;TYPE&gt;::no()<span class="keyword"> const </span>{
00098   <span class="keywordflow">return</span> number;
00099   }
00100 
00101 
00102 <span class="comment">// Return pointer to the list</span>
00103 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00104 TYPE* FXArray&lt;TYPE&gt;::data()<span class="keyword"> const </span>{
00105   <span class="keywordflow">return</span> list;
00106   }
00107 
00108 
00109 <span class="comment">// Return size of list</span>
00110 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00111 FXint FXArray&lt;TYPE&gt;::size()<span class="keyword"> const </span>{
00112   <span class="keywordflow">return</span> total;
00113   }
00114 
00115 
00116 <span class="comment">// Return grow delta</span>
00117 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00118 FXint FXArray&lt;TYPE&gt;::inc()<span class="keyword"> const </span>{
00119   <span class="keywordflow">return</span> grow;
00120   }
00121 
00122 
00123 <span class="comment">// Set grow delta</span>
00124 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00125 <span class="keywordtype">void</span> FXArray&lt;TYPE&gt;::inc(FXint g){
00126   FXASSERT(g&gt;=0);
00127   grow=g;
00128   }
00129 
00130 
00131 <span class="comment">// Return element rvalue</span>
00132 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00133 <span class="keyword">const</span> TYPE&amp; FXArray&lt;TYPE&gt;::operator[](FXint i)<span class="keyword"> const </span>{
00134   FXASSERT(0&lt;=i&amp;&amp;i&lt;number);
00135   <span class="keywordflow">return</span> list[i];
00136   }
00137 
00138 
00139 <span class="comment">// Return element lvalue</span>
00140 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00141 TYPE&amp; FXArray&lt;TYPE&gt;::operator[](FXint i){
00142   FXASSERT(0&lt;=i&amp;&amp;i&lt;number);
00143   <span class="keywordflow">return</span> list[i];
00144   }
00145 
00146 
00147 <span class="comment">// Assign an array</span>
00148 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00149 FXArray&lt;TYPE&gt;&amp; FXArray&lt;TYPE&gt;::operator=(<span class="keyword">const</span> FXArray&lt;TYPE&gt;&amp; orig){
00150   <span class="keywordflow">if</span>(<span class="keyword">this</span>!=&amp;orig){
00151     destructElms(list,number);
00152     freeElms(list);
00153     number=orig.number;
00154     total=orig.total;
00155     grow=orig.grow;
00156     allocElms(list,total);
00157     constructElms(list,number);
00158     copyElms(list,orig.list,number);
00159     }
00160   <span class="keywordflow">return</span> *<span class="keyword">this</span>;
00161   }
00162 
00163 
00164 <span class="comment">// Set new size</span>
00165 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00166 <span class="keywordtype">void</span> FXArray&lt;TYPE&gt;::size(FXint n){
00167   FXASSERT(n&gt;=0);
00168   <span class="keywordflow">if</span>(n!=number){
00169     <span class="keywordflow">if</span>(n&lt;number){
00170       destructElms(&amp;list[n],number-n);                <span class="comment">// Destruct old elements</span>
00171       <span class="keywordflow">if</span>(n==0){
00172         freeElms(list);
00173         total=0;
00174         }
00175       }
00176     <span class="keywordflow">else</span>{
00177       <span class="keywordflow">if</span>(n&gt;total){
00178         TYPE *ptr;
00179         FXint s=total+grow;
00180         <span class="keywordflow">if</span>(grow==0) s=total+total;
00181         <span class="keywordflow">if</span>(s&lt;n) s=n;
00182         allocElms(ptr,s);
00183         constructElms(ptr,n);                         <span class="comment">// Construct blank elements</span>
00184         copyElms(ptr,list,number);                    <span class="comment">// Uses assignment operator</span>
00185         destructElms(list,number);                    <span class="comment">// Destruct old ones</span>
00186         freeElms(list);
00187         list=ptr;
00188         total=s;
00189         }
00190       FXASSERT(n&lt;=total);
00191       constructElms(&amp;list[number],n-number);          <span class="comment">// Construct new elements</span>
00192       }
00193     number=n;
00194     }
00195   }
00196 
00197 
00198 <span class="comment">// Insert element anywhere</span>
00199 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00200 <span class="keywordtype">void</span> FXArray&lt;TYPE&gt;::insert(FXint pos,<span class="keyword">const</span> TYPE&amp; p){
00201   FXint s=number-pos;
00202   size(number+1);
00203   moveElms(&amp;list[pos+1],&amp;list[pos],s);
00204   list[pos]=p;
00205   }
00206 
00207 
00208 <span class="comment">// Append element at end</span>
00209 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00210 <span class="keywordtype">void</span> FXArray&lt;TYPE&gt;::append(<span class="keyword">const</span> TYPE&amp; p){
00211   FXint s=number;
00212   size(number+1);
00213   list[s]=p;
00214   }
00215 
00216 
00217 <span class="comment">// Prepend element at begin</span>
00218 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00219 <span class="keywordtype">void</span> FXArray&lt;TYPE&gt;::prepend(<span class="keyword">const</span> TYPE&amp; p){
00220   FXint s=number;
00221   size(number+1);
00222   moveElms(&amp;list[1],&amp;list[0],s);
00223   list[0]=p;
00224   }
00225 
00226 
00227 <span class="comment">// Remove element at pos</span>
00228 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00229 <span class="keywordtype">void</span> FXArray&lt;TYPE&gt;::remove(FXint pos){
00230   FXint s=number;
00231   moveElms(&amp;list[pos],&amp;list[pos+1],s-pos-1);          <span class="comment">// Uses assignment operator</span>
00232   size(s-1);
00233   }
00234 
00235 
00236 <span class="comment">// Find element, -1 if not found</span>
00237 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00238 FXint FXArray&lt;TYPE&gt;::find(<span class="keyword">const</span> TYPE&amp; p,FXint pos){
00239   <span class="keywordflow">if</span>(pos&lt;0) pos=0;
00240   <span class="keywordflow">while</span>(pos&lt;number){ <span class="keywordflow">if</span>(list[pos]==p){ <span class="keywordflow">return</span> pos; } ++pos; }
00241   <span class="keywordflow">return</span> -1;
00242   }
00243 
00244 
00245 <span class="comment">// Find element, -1 if not found</span>
00246 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00247 FXint FXArray&lt;TYPE&gt;::rfind(<span class="keyword">const</span> TYPE&amp; p,FXint pos){
00248   <span class="keywordflow">if</span>(pos&gt;=number) pos=number-1;
00249   <span class="keywordflow">while</span>(0&lt;=pos){ <span class="keywordflow">if</span>(list[pos]==p){ <span class="keywordflow">return</span> pos; } --pos; }
00250   <span class="keywordflow">return</span> -1;
00251   }
00252 
00253 
00254 <span class="comment">// Extract element</span>
00255 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00256 <span class="keywordtype">void</span> FXArray&lt;TYPE&gt;::extract(<span class="keyword">const</span> TYPE&amp; p){
00257   FXint s=number;
00258   <span class="keywordflow">while</span>(s-- != 0){
00259     <span class="keywordflow">if</span>(list[s]==p){
00260       moveElms(&amp;list[s],&amp;list[s+1],number-s);         <span class="comment">// Uses assignment operator</span>
00261       size(number-1);
00262       <span class="keywordflow">break</span>;
00263       }
00264     }
00265   }
00266 
00267 
00268 <span class="comment">// Trunc excess</span>
00269 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00270 <span class="keywordtype">void</span> FXArray&lt;TYPE&gt;::trunc(){
00271   size(number);
00272   }
00273 
00274 
00275 <span class="comment">// Clear the list</span>
00276 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00277 <span class="keywordtype">void</span> FXArray&lt;TYPE&gt;::clear(){
00278   size(0);
00279   }
00280 
00281 
00282 <span class="comment">// Save operator</span>
00283 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00284 <span class="keywordtype">void</span> FXArray&lt;TYPE&gt;::save(FXStream&amp; store)<span class="keyword"> const </span>{
00285   store &lt;&lt; number &lt;&lt; total &lt;&lt; grow;
00286   saveElms(store,list,number);                        <span class="comment">// Uses save operator</span>
00287   }
00288 
00289 
00290 <span class="comment">// Load operator</span>
00291 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00292 <span class="keywordtype">void</span> FXArray&lt;TYPE&gt;::load(FXStream&amp; store){
00293   destructElms(list,number);                          <span class="comment">// Destruct elements</span>
00294   freeElms(list);
00295   store &gt;&gt; number &gt;&gt; total &gt;&gt; grow;
00296   allocElms(list,total);
00297   constructElms(list,number);                         <span class="comment">// Fresh elements</span>
00298   loadElms(store,list,number);                        <span class="comment">// Uses load operator</span>
00299   }
00300 
00301 
00302 <span class="comment">// Destruct list</span>
00303 <span class="keyword">template</span>&lt;<span class="keyword">class</span> TYPE&gt;
00304 FXArray&lt;TYPE&gt;::~FXArray(){
00305   destructElms(list,number);
00306   freeElms(list);
00307   }
00308 
00309 }
00310 
00311 <span class="preprocessor">#endif</span>
</pre></div></font>

<!--- COPYRIGHT -->
<p>
<table width=100% cellpadding=0 cellspacing=0><tr><td width=100% valign=top id=HEADLINE align=right>
<img src='../art/line.gif' width=100% height=1><font size=-1>
Copyright &copy; 1997-2004 Jeroen van der Zijp</font>
</td></tr></table>
</p>
<!--- COPYRIGHT -->
</body>
</html>