Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > media > contrib-release > by-pkgid > bad97183153701b09df5fae1052b1c30 > files > 2189

crystalspace-doc-1.2.1-5mdv2010.0.i586.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>Crystal Space 1.2.1: csutil/radixsort.h Source File (Crystal Space 1.2.1 Public API Reference)</title>
<link href="tabs.css" rel="stylesheet" type="text/css">
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<table border="0" cellpadding="0" cellspacing="0" width="100%" class="head">
 <tr height="59">
  <td class="head" width="202" valign="bottom" style="padding-left:0;"><a href="http://www.crystalspace3d.org/"><img src="csblur.png" width="236" height="59" alt="CrystalSpace" border="0"></a></td>
  <td class="head"><h2>Public API Reference</h2></td>
 </tr>
 <tr height="11">
  <td colspan="2" class="headshadow" valign="top" style="padding-left:0;"><img src="csblurb.png" width="236" height="11" alt="" border="0"></td>
 </tr>
</table>
<div class="content">
<!-- Generated by Doxygen 1.5.3 -->
<div class="tabs">
  <ul>
    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
    <li><a href="modules.html"><span>Modules</span></a></li>
    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
    <li><a href="classes.html"><span>Classes</span></a></li>
    <li class="current"><a href="files.html"><span>Files</span></a></li>
    <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
  </ul>
</div>
<h1>csutil/radixsort.h</h1><a href="radixsort_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment">  Crystal Space Radix Sort</span>
<a name="l00003"></a>00003 <span class="comment">  Copyright (C) 2006 by Marten Svanfeldt</span>
<a name="l00004"></a>00004 <span class="comment"></span>
<a name="l00005"></a>00005 <span class="comment">  This library is free software; you can redistribute it and/or</span>
<a name="l00006"></a>00006 <span class="comment">  modify it under the terms of the GNU Library General Public</span>
<a name="l00007"></a>00007 <span class="comment">  License as published by the Free Software Foundation; either</span>
<a name="l00008"></a>00008 <span class="comment">  version 2 of the License, or (at your option) any later version.</span>
<a name="l00009"></a>00009 <span class="comment"></span>
<a name="l00010"></a>00010 <span class="comment">  This library is distributed in the hope that it will be useful,</span>
<a name="l00011"></a>00011 <span class="comment">  but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00012"></a>00012 <span class="comment">  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span>
<a name="l00013"></a>00013 <span class="comment">  Library General Public License for more details.</span>
<a name="l00014"></a>00014 <span class="comment"></span>
<a name="l00015"></a>00015 <span class="comment">  You should have received a copy of the GNU Library General Public</span>
<a name="l00016"></a>00016 <span class="comment">  License along with this library; if not, write to the Free</span>
<a name="l00017"></a>00017 <span class="comment">  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.</span>
<a name="l00018"></a>00018 <span class="comment">*/</span>
<a name="l00019"></a>00019 
<a name="l00020"></a>00020 <span class="preprocessor">#ifndef __CSUTIL_RADIX_SORT_H__</span>
<a name="l00021"></a>00021 <span class="preprocessor"></span><span class="preprocessor">#define __CSUTIL_RADIX_SORT_H__</span>
<a name="l00022"></a>00022 <span class="preprocessor"></span>
<a name="l00027"></a>00027 <span class="preprocessor">#include "csextern.h"</span>
<a name="l00028"></a>00028 
<a name="l00029"></a>00029 <span class="comment">// Hack: Work around problems caused by #defining 'new'.</span>
<a name="l00030"></a>00030 <span class="preprocessor">#if defined(CS_EXTENSIVE_MEMDEBUG) || defined(CS_MEMORY_TRACKER)</span>
<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor"># undef new</span>
<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00033"></a>00033 <span class="preprocessor"></span><span class="preprocessor">#include &lt;new&gt;</span>
<a name="l00034"></a>00034 
<a name="l00040"></a><a class="code" href="classcsRadixSorter.html">00040</a> <span class="keyword">class </span>CS_CRYSTALSPACE_EXPORT <a class="code" href="classcsRadixSorter.html" title="A radix-sorter for signed and unsigned integers as well as floats.">csRadixSorter</a>
<a name="l00041"></a>00041 {
<a name="l00042"></a>00042 <span class="keyword">public</span>:
<a name="l00043"></a>00043   <a class="code" href="classcsRadixSorter.html" title="A radix-sorter for signed and unsigned integers as well as floats.">csRadixSorter</a>();
<a name="l00044"></a>00044   ~<a class="code" href="classcsRadixSorter.html" title="A radix-sorter for signed and unsigned integers as well as floats.">csRadixSorter</a>();
<a name="l00045"></a>00045 
<a name="l00051"></a>00051   <span class="keywordtype">void</span> Sort(<a class="code" href="group__util.html#g1134b580f8da4de94ca6b1de4d37975e" title="unsigned 32-bit integer (0..4 294 967 295)">uint32</a>* array, <span class="keywordtype">size_t</span> size);
<a name="l00052"></a>00052 
<a name="l00058"></a>00058   <span class="keywordtype">void</span> Sort(<a class="code" href="group__util.html#g56f1a81c92849566ae864511088eb7e8" title="signed 32-bit integer (-2 147 483 648..2 147 483 647)">int32</a>* array, <span class="keywordtype">size_t</span> size);
<a name="l00059"></a>00059 
<a name="l00065"></a>00065   <span class="keywordtype">void</span> Sort(<span class="keywordtype">float</span>* array, <span class="keywordtype">size_t</span> size);
<a name="l00066"></a>00066 
<a name="l00070"></a><a class="code" href="classcsRadixSorter.html#0572d1f4de8c085d114eeabd228e86f6">00070</a>   <span class="keyword">inline</span> <span class="keywordtype">size_t</span>* GetRanks()<span class="keyword"> const</span>
<a name="l00071"></a>00071 <span class="keyword">  </span>{
<a name="l00072"></a>00072     <span class="keywordflow">return</span> ranks1;
<a name="l00073"></a>00073   }
<a name="l00074"></a>00074 
<a name="l00078"></a>00078   <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;
<a name="l00079"></a><a class="code" href="classcsRadixSorter.html#5e50b8e5270a603bc2820cc3bde0741c">00079</a>   <span class="keywordtype">void</span> ReorderInplace (T* source, <span class="keywordtype">size_t</span> size)
<a name="l00080"></a>00080   {
<a name="l00081"></a>00081     <span class="keywordflow">if</span>(size*<span class="keyword">sizeof</span>(T) &lt; 0x4000) <span class="comment">//Max out to 16kb</span>
<a name="l00082"></a>00082     {
<a name="l00083"></a>00083       <span class="comment">//Stack-allocated temp-array</span>
<a name="l00084"></a>00084       <a class="code" href="cssysdef_8h.html#8185c7b21a22716685e7608a1f31a27f" title="Dynamic stack memory allocation.">CS_ALLOC_STACK_ARRAY</a>(<a class="code" href="group__util.html#gdde6aaee8457bee49c2a92621fe22b79" title="unsigned 8-bit integer (0..255)">uint8</a>, tmpStorage, size*<span class="keyword">sizeof</span>(T));
<a name="l00085"></a>00085       T* dest = (T*)tmpStorage;
<a name="l00086"></a>00086       <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; size; i++)
<a name="l00087"></a>00087       {
<a name="l00088"></a>00088         <span class="keyword">new</span> (&amp;dest[i]) T(source[ranks1[i]]); <span class="comment">//to make sure it is initialized</span>
<a name="l00089"></a>00089       }
<a name="l00090"></a>00090       <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; size; i++)
<a name="l00091"></a>00091       {
<a name="l00092"></a>00092         source[i] = dest[i];
<a name="l00093"></a>00093         dest[i].~T();
<a name="l00094"></a>00094       }
<a name="l00095"></a>00095     }
<a name="l00096"></a>00096     <span class="keywordflow">else</span>
<a name="l00097"></a>00097     {
<a name="l00098"></a>00098       <span class="comment">//Heap-allocated</span>
<a name="l00099"></a>00099       <a class="code" href="group__util.html#gdde6aaee8457bee49c2a92621fe22b79" title="unsigned 8-bit integer (0..255)">uint8</a>* tmpStorage = (<a class="code" href="group__util.html#gdde6aaee8457bee49c2a92621fe22b79" title="unsigned 8-bit integer (0..255)">uint8</a>*)<a class="code" href="cssysdef_8h.html#bcc451ff5f6451f8b8bcbe91c762bcf0">cs_malloc</a>(size*<span class="keyword">sizeof</span>(T));
<a name="l00100"></a>00100       T* dest = (T*)tmpStorage;
<a name="l00101"></a>00101       <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; size; i++)
<a name="l00102"></a>00102       {
<a name="l00103"></a>00103         <span class="keyword">new</span> (&amp;dest[i]) T(source[ranks1[i]]); <span class="comment">//to make sure it is initialized</span>
<a name="l00104"></a>00104       }
<a name="l00105"></a>00105       <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; size; i++)
<a name="l00106"></a>00106       {
<a name="l00107"></a>00107         source[i] = dest[i];
<a name="l00108"></a>00108         dest[i].~T();
<a name="l00109"></a>00109       }
<a name="l00110"></a>00110       <a class="code" href="cssysdef_8h.html#7af27c7b7c38c438787a3d2f4e5079c4">cs_free</a>(tmpStorage);
<a name="l00111"></a>00111     }
<a name="l00112"></a>00112   }
<a name="l00113"></a>00113 
<a name="l00118"></a>00118   <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;
<a name="l00119"></a><a class="code" href="classcsRadixSorter.html#7b19c79eae0e9e69a214ea262d8e9628">00119</a>   <span class="keywordtype">bool</span> Reorder(<span class="keyword">const</span> T* source, T* dest, <span class="keywordtype">size_t</span> size)
<a name="l00120"></a>00120   {
<a name="l00121"></a>00121     <span class="comment">//make sure ranges don't overlap</span>
<a name="l00122"></a>00122 <span class="preprocessor">#ifdef _DEBUG</span>
<a name="l00123"></a>00123 <span class="preprocessor"></span>    <span class="keywordflow">if</span>((source + size - dest &gt; 0 &amp;&amp; dest - source &lt; size) ||
<a name="l00124"></a>00124        (dest + size - source &gt; 0 &amp;&amp; source - dest &lt; size))
<a name="l00125"></a>00125        <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00126"></a>00126 <span class="preprocessor">#endif</span>
<a name="l00127"></a>00127 <span class="preprocessor"></span>
<a name="l00128"></a>00128     <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> i = 0; i &lt; size; i++)
<a name="l00129"></a>00129     {
<a name="l00130"></a>00130       dest[i] = source[ranks1[i]];
<a name="l00131"></a>00131     }
<a name="l00132"></a>00132     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00133"></a>00133   }
<a name="l00134"></a>00134 
<a name="l00135"></a>00135 <span class="keyword">private</span>:
<a name="l00136"></a>00136   <span class="comment">// Resize the rank arrays</span>
<a name="l00137"></a>00137   <span class="keywordtype">void</span> Resize(<span class="keywordtype">size_t</span> size);
<a name="l00138"></a>00138 
<a name="l00139"></a>00139   <span class="comment">//Helper-function to create histograms. Returns true if values are already sorted</span>
<a name="l00140"></a>00140   <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;
<a name="l00141"></a>00141   <span class="keywordtype">bool</span> CreateHistogram(T* data, <span class="keywordtype">size_t</span> size, <a class="code" href="group__util.html#g1134b580f8da4de94ca6b1de4d37975e" title="unsigned 32-bit integer (0..4 294 967 295)">uint32</a>* histogram);
<a name="l00142"></a>00142 
<a name="l00143"></a>00143   <span class="comment">// Check if pass should be performed</span>
<a name="l00144"></a>00144   <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;
<a name="l00145"></a>00145   <span class="keywordtype">bool</span> DoPass(<span class="keywordtype">size_t</span> pass, T* data, <span class="keywordtype">size_t</span> size, <a class="code" href="group__util.html#g1134b580f8da4de94ca6b1de4d37975e" title="unsigned 32-bit integer (0..4 294 967 295)">uint32</a>* histogram);
<a name="l00146"></a>00146 
<a name="l00147"></a>00147   <span class="keywordtype">size_t</span> currentSize;
<a name="l00148"></a>00148   <span class="keywordtype">size_t</span>* ranks1;
<a name="l00149"></a>00149   <span class="keywordtype">size_t</span>* ranks2;
<a name="l00150"></a>00150 
<a name="l00151"></a>00151   <span class="keywordtype">bool</span> ranksValid;
<a name="l00152"></a>00152 };
<a name="l00153"></a>00153 
<a name="l00154"></a>00154 <span class="preprocessor">#if defined(CS_EXTENSIVE_MEMDEBUG) || defined(CS_MEMORY_TRACKER)</span>
<a name="l00155"></a>00155 <span class="preprocessor"></span><span class="preprocessor"># define new CS_EXTENSIVE_MEMDEBUG_NEW</span>
<a name="l00156"></a>00156 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00157"></a>00157 <span class="preprocessor"></span>
<a name="l00158"></a>00158 <span class="preprocessor">#endif</span>
</pre></div><hr size="1"><address><small>Generated for Crystal Space 1.2.1 by 
<a href="http://www.doxygen.org/index.html">doxygen</a> 1.5.3 
</small></address> </div></body> </html>