Sophie

Sophie

distrib > Mandriva > 2010.2 > i586 > media > contrib-backports > by-pkgid > 4f5f2dc0f55b453456458df885792b0b > files > 497

ucommon-doc-5.0.4-1mdv2010.2.i586.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>ucommon: ucommon/memory.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.6.3 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li><a href="examples.html"><span>Examples</span></a></li>
    </ul>
  </div>
  <div class="tabs">
    <ul>
      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
      <li><a href="globals.html"><span>Globals</span></a></li>
    </ul>
  </div>
<h1>ucommon/memory.h</h1><a href="a00190.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// Copyright (C) 2006-2010 David Sugar, Tycho Softworks.</span>
<a name="l00002"></a>00002 <span class="comment">//</span>
<a name="l00003"></a>00003 <span class="comment">// This file is part of GNU uCommon C++.</span>
<a name="l00004"></a>00004 <span class="comment">//</span>
<a name="l00005"></a>00005 <span class="comment">// GNU uCommon C++ is free software: you can redistribute it and/or modify</span>
<a name="l00006"></a>00006 <span class="comment">// it under the terms of the GNU Lesser General Public License as published</span>
<a name="l00007"></a>00007 <span class="comment">// by the Free Software Foundation, either version 3 of the License, or</span>
<a name="l00008"></a>00008 <span class="comment">// (at your option) any later version.</span>
<a name="l00009"></a>00009 <span class="comment">//</span>
<a name="l00010"></a>00010 <span class="comment">// GNU uCommon C++ 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</span>
<a name="l00013"></a>00013 <span class="comment">// GNU Lesser 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 Lesser General Public License</span>
<a name="l00016"></a>00016 <span class="comment">// along with GNU uCommon C++.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</span>
<a name="l00017"></a>00017 
<a name="l00030"></a>00030 <span class="preprocessor">#ifndef _UCOMMON_MEMORY_H_</span>
<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor">#define _UCOMMON_MEMORY_H_</span>
<a name="l00032"></a>00032 <span class="preprocessor"></span>
<a name="l00033"></a>00033 <span class="preprocessor">#ifndef _UCOMMON_CONFIG_H_</span>
<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#include &lt;<a class="code" href="a00194.html" title="Various miscellaneous platform specific headers and defines.">ucommon/platform.h</a>&gt;</span>
<a name="l00035"></a>00035 <span class="preprocessor">#endif</span>
<a name="l00036"></a>00036 <span class="preprocessor"></span>
<a name="l00037"></a>00037 <span class="preprocessor">#ifndef _UCOMMON_PROTOCOLS_H_</span>
<a name="l00038"></a>00038 <span class="preprocessor"></span><span class="preprocessor">#include &lt;<a class="code" href="a00195.html" title="Abstract interfaces and support.">ucommon/protocols.h</a>&gt;</span>
<a name="l00039"></a>00039 <span class="preprocessor">#endif</span>
<a name="l00040"></a>00040 <span class="preprocessor"></span>
<a name="l00041"></a>00041 <span class="preprocessor">#ifndef  _UCOMMON_LINKED_H_</span>
<a name="l00042"></a>00042 <span class="preprocessor"></span><span class="preprocessor">#include &lt;<a class="code" href="a00188.html" title="Linked objects, lists, templates, and containers.">ucommon/linked.h</a>&gt;</span>
<a name="l00043"></a>00043 <span class="preprocessor">#endif</span>
<a name="l00044"></a>00044 <span class="preprocessor"></span>
<a name="l00045"></a>00045 NAMESPACE_UCOMMON
<a name="l00046"></a>00046 
<a name="l00047"></a>00047 <span class="keyword">class </span>PagerPool;
<a name="l00048"></a>00048 
<a name="l00056"></a><a class="code" href="a00079.html">00056</a> <span class="keyword">class </span>__EXPORT <a class="code" href="a00079.html" title="A memory protocol pager for private heap manager.">memalloc</a> : <span class="keyword">public</span> MemoryProtocol, <span class="keyword">protected</span> <a class="code" href="a00073.html" title="Common locking protocol.">LockingProtocol</a>
<a name="l00057"></a>00057 {
<a name="l00058"></a>00058 <span class="keyword">private</span>:
<a name="l00059"></a>00059     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00029.html" title="Buffered pager for storing paged strings for character protocol.">bufpager</a>;
<a name="l00060"></a>00060 
<a name="l00061"></a>00061     <span class="keywordtype">size_t</span> pagesize, align;
<a name="l00062"></a>00062     <span class="keywordtype">unsigned</span> count;
<a name="l00063"></a>00063 
<a name="l00064"></a>00064     <span class="keyword">typedef</span> <span class="keyword">struct </span>mempage {
<a name="l00065"></a>00065         <span class="keyword">struct </span>mempage *next;
<a name="l00066"></a>00066         <span class="keyword">union </span>{
<a name="l00067"></a>00067             <span class="keywordtype">void</span> *memalign;
<a name="l00068"></a>00068             <span class="keywordtype">unsigned</span> used;
<a name="l00069"></a>00069         };
<a name="l00070"></a>00070     }   page_t;
<a name="l00071"></a>00071 
<a name="l00072"></a>00072     page_t *page;
<a name="l00073"></a>00073 
<a name="l00074"></a>00074 <span class="keyword">protected</span>:
<a name="l00075"></a>00075     <span class="keywordtype">unsigned</span> limit;
<a name="l00076"></a>00076 
<a name="l00081"></a>00081     page_t *<a class="code" href="a00103.html" title="Mempager managed type factory for pager pool objects.">pager</a>(<span class="keywordtype">void</span>);
<a name="l00082"></a>00082 
<a name="l00083"></a>00083 <span class="keyword">public</span>:
<a name="l00088"></a>00088     <a class="code" href="a00079.html" title="A memory protocol pager for private heap manager.">memalloc</a>(<span class="keywordtype">size_t</span> page = 0);
<a name="l00089"></a>00089 
<a name="l00093"></a>00093     <span class="keyword">virtual</span> ~<a class="code" href="a00079.html" title="A memory protocol pager for private heap manager.">memalloc</a>();
<a name="l00094"></a>00094 
<a name="l00099"></a><a class="code" href="a00079.html#afc3defae0367c8c324a05f33cbfaad6d">00099</a>     <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> getPages(<span class="keywordtype">void</span>)
<a name="l00100"></a>00100         {<span class="keywordflow">return</span> count;};
<a name="l00101"></a>00101 
<a name="l00109"></a><a class="code" href="a00079.html#a97bd0bede3a00425e27ba3fcc6be0fcd">00109</a>     <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> getLimit(<span class="keywordtype">void</span>)
<a name="l00110"></a>00110         {<span class="keywordflow">return</span> limit;};
<a name="l00111"></a>00111 
<a name="l00116"></a><a class="code" href="a00079.html#a24d137604082b8abae766e914f45b059">00116</a>     <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> getAlloc(<span class="keywordtype">void</span>)
<a name="l00117"></a>00117         {<span class="keywordflow">return</span> pagesize;};
<a name="l00118"></a>00118 
<a name="l00129"></a>00129     <span class="keywordtype">unsigned</span> utilization(<span class="keywordtype">void</span>);
<a name="l00130"></a>00130 
<a name="l00134"></a>00134     <span class="keywordtype">void</span> purge(<span class="keywordtype">void</span>);
<a name="l00135"></a>00135 
<a name="l00143"></a>00143     <span class="keyword">virtual</span> <span class="keywordtype">void</span> *_alloc(<span class="keywordtype">size_t</span> size);
<a name="l00144"></a>00144 };
<a name="l00145"></a>00145 
<a name="l00166"></a><a class="code" href="a00081.html">00166</a> <span class="keyword">class </span>__EXPORT <a class="code" href="a00081.html" title="A managed private heap for small allocations.">mempager</a> : <span class="keyword">public</span> <a class="code" href="a00079.html" title="A memory protocol pager for private heap manager.">memalloc</a>
<a name="l00167"></a>00167 {
<a name="l00168"></a>00168 <span class="keyword">private</span>:
<a name="l00169"></a>00169     pthread_mutex_t mutex;
<a name="l00170"></a>00170 
<a name="l00171"></a>00171 <span class="keyword">protected</span>:
<a name="l00178"></a>00178     <span class="keyword">virtual</span> <span class="keywordtype">void</span> _lock(<span class="keywordtype">void</span>);
<a name="l00179"></a>00179 
<a name="l00183"></a>00183     <span class="keyword">virtual</span> <span class="keywordtype">void</span> _unlock(<span class="keywordtype">void</span>);
<a name="l00184"></a>00184 
<a name="l00185"></a>00185 <span class="keyword">public</span>:
<a name="l00190"></a>00190     <a class="code" href="a00081.html" title="A managed private heap for small allocations.">mempager</a>(<span class="keywordtype">size_t</span> page = 0);
<a name="l00191"></a>00191 
<a name="l00195"></a>00195     <span class="keyword">virtual</span> ~<a class="code" href="a00081.html" title="A managed private heap for small allocations.">mempager</a>();
<a name="l00196"></a>00196 
<a name="l00207"></a>00207     <span class="keywordtype">unsigned</span> <a class="code" href="a00079.html#afa53c73c1dacbc56fdf1c0373da6b983" title="Determine fragmentation level of acquired heap pages.">utilization</a>(<span class="keywordtype">void</span>);
<a name="l00208"></a>00208 
<a name="l00212"></a>00212     <span class="keywordtype">void</span> <a class="code" href="a00079.html#a28101c0ef241f902eaa3519d3ab7f0ea" title="Purge all allocated memory and heap pages immediately.">purge</a>(<span class="keywordtype">void</span>);
<a name="l00213"></a>00213 
<a name="l00221"></a>00221     <span class="keyword">virtual</span> <span class="keywordtype">void</span> dealloc(<span class="keywordtype">void</span> *memory);
<a name="l00222"></a>00222 
<a name="l00231"></a>00231     <span class="keyword">virtual</span> <span class="keywordtype">void</span> *<a class="code" href="a00079.html#ae9a8e8784c11ce95a0e4d88ca5ce992a" title="Allocate memory from the pager heap.">_alloc</a>(<span class="keywordtype">size_t</span> size);
<a name="l00232"></a>00232 };
<a name="l00233"></a>00233 
<a name="l00238"></a><a class="code" href="a00029.html">00238</a> <span class="keyword">class </span>__EXPORT <a class="code" href="a00029.html" title="Buffered pager for storing paged strings for character protocol.">bufpager</a> : <span class="keyword">public</span> <a class="code" href="a00079.html" title="A memory protocol pager for private heap manager.">memalloc</a>, <span class="keyword">public</span> <a class="code" href="a00030.html" title="Common character processing protocol.">CharacterProtocol</a>
<a name="l00239"></a>00239 {
<a name="l00240"></a>00240 <span class="keyword">private</span>:
<a name="l00241"></a>00241     <span class="keyword">typedef</span> <span class="keyword">struct </span>cpage {
<a name="l00242"></a>00242         <span class="keyword">struct </span>cpage *next;
<a name="l00243"></a>00243         <span class="keywordtype">char</span> *text;
<a name="l00244"></a>00244         <span class="keywordtype">unsigned</span> size, used;
<a name="l00245"></a>00245     } cpage_t;
<a name="l00246"></a>00246 
<a name="l00247"></a>00247     cpage_t *first, *last, *current, *freelist;
<a name="l00248"></a>00248     <span class="keywordtype">unsigned</span> cpos;
<a name="l00249"></a>00249     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> ccount;
<a name="l00250"></a>00250 
<a name="l00251"></a>00251     <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="a00030.html#af4c7630fd8ed62d09bb5df069c264a06" title="Get the next character.">_getch</a>(<span class="keywordtype">void</span>);
<a name="l00252"></a>00252     <span class="keyword">virtual</span> <span class="keywordtype">int</span> <a class="code" href="a00030.html#abc7a3a5f8cd7082fbcad88cbb8f64cc0" title="Put the next character.">_putch</a>(<span class="keywordtype">int</span> code);
<a name="l00253"></a>00253 
<a name="l00254"></a>00254 <span class="keyword">protected</span>:
<a name="l00255"></a>00255     <span class="keyword">virtual</span> <span class="keywordtype">void</span> *<a class="code" href="a00079.html#ae9a8e8784c11ce95a0e4d88ca5ce992a" title="Allocate memory from the pager heap.">_alloc</a>(<span class="keywordtype">size_t</span> size);
<a name="l00256"></a>00256 
<a name="l00257"></a>00257 <span class="keyword">public</span>:
<a name="l00261"></a>00261     <span class="keywordtype">void</span> reset(<span class="keywordtype">void</span>);
<a name="l00262"></a>00262 
<a name="l00266"></a>00266     <span class="keywordtype">void</span> rewind(<span class="keywordtype">void</span>);
<a name="l00267"></a>00267 
<a name="l00272"></a><a class="code" href="a00029.html#a1b143b529ab6e77c323781b8370704ce">00272</a>     <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> getUsed(<span class="keywordtype">void</span>)
<a name="l00273"></a>00273         {<span class="keywordflow">return</span> ccount;};
<a name="l00274"></a>00274 
<a name="l00275"></a>00275     <a class="code" href="a00029.html" title="Buffered pager for storing paged strings for character protocol.">bufpager</a>(<span class="keywordtype">size_t</span> page = 0);
<a name="l00276"></a>00276 };
<a name="l00277"></a>00277 
<a name="l00285"></a><a class="code" href="a00023.html">00285</a> <span class="keyword">class </span>__EXPORT <a class="code" href="a00023.html" title="Create a linked list of auto-releasable objects.">autorelease</a>
<a name="l00286"></a>00286 {
<a name="l00287"></a>00287 <span class="keyword">private</span>:
<a name="l00288"></a>00288     <a class="code" href="a00067.html" title="Common base class for all objects that can be formed into a linked list.">LinkedObject</a> *pool;
<a name="l00289"></a>00289 
<a name="l00290"></a>00290 <span class="keyword">public</span>:
<a name="l00294"></a>00294     <a class="code" href="a00023.html" title="Create a linked list of auto-releasable objects.">autorelease</a>();
<a name="l00295"></a>00295 
<a name="l00299"></a>00299     ~<a class="code" href="a00023.html" title="Create a linked list of auto-releasable objects.">autorelease</a>();
<a name="l00300"></a>00300 
<a name="l00306"></a>00306     <span class="keywordtype">void</span> <a class="code" href="a00208.html#a8df8e4b667d68be02961ff0d4cd84224" title="Convenience function to unlock shared object through it&amp;#39;s protocol.">release</a>(<span class="keywordtype">void</span>);
<a name="l00307"></a>00307 
<a name="l00312"></a>00312     <span class="keywordtype">void</span> operator+=(<a class="code" href="a00067.html" title="Common base class for all objects that can be formed into a linked list.">LinkedObject</a> *<span class="keywordtype">object</span>);
<a name="l00313"></a>00313 };
<a name="l00314"></a>00314 
<a name="l00325"></a><a class="code" href="a00104.html">00325</a> <span class="keyword">class </span>__EXPORT <a class="code" href="a00104.html" title="This is a base class for objects that may be created in pager pools.">PagerObject</a> : <span class="keyword">public</span> <a class="code" href="a00067.html" title="Common base class for all objects that can be formed into a linked list.">LinkedObject</a>, <span class="keyword">public</span> <a class="code" href="a00039.html" title="A base class for reference counted objects.">CountedObject</a>
<a name="l00326"></a>00326 {
<a name="l00327"></a>00327 <span class="keyword">protected</span>:
<a name="l00328"></a>00328     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="a00105.html" title="Pager pool base class for managed memory pools.">PagerPool</a>;
<a name="l00329"></a>00329 
<a name="l00330"></a>00330     <a class="code" href="a00105.html" title="Pager pool base class for managed memory pools.">PagerPool</a> *<a class="code" href="a00103.html" title="Mempager managed type factory for pager pool objects.">pager</a>;
<a name="l00331"></a>00331 
<a name="l00335"></a>00335     <a class="code" href="a00104.html" title="This is a base class for objects that may be created in pager pools.">PagerObject</a>();
<a name="l00336"></a>00336 
<a name="l00340"></a>00340     <span class="keywordtype">void</span> <a class="code" href="a00039.html#ade41cc17d81bd2de95e37f085a26175d" title="Decrease reference count when released.">release</a>(<span class="keywordtype">void</span>);
<a name="l00341"></a>00341 
<a name="l00345"></a>00345     <span class="keywordtype">void</span> <a class="code" href="a00039.html#a99ce9900fd6d279935e611c5c8bd8a10" title="Dealloc object no longer referenced.">dealloc</a>(<span class="keywordtype">void</span>);
<a name="l00346"></a>00346 };
<a name="l00347"></a>00347 
<a name="l00356"></a><a class="code" href="a00105.html">00356</a> <span class="keyword">class </span>__EXPORT <a class="code" href="a00105.html" title="Pager pool base class for managed memory pools.">PagerPool</a> : <span class="keyword">public</span> MemoryProtocol
<a name="l00357"></a>00357 {
<a name="l00358"></a>00358 <span class="keyword">private</span>:
<a name="l00359"></a>00359     <a class="code" href="a00067.html" title="Common base class for all objects that can be formed into a linked list.">LinkedObject</a> *freelist;
<a name="l00360"></a>00360     pthread_mutex_t mutex;
<a name="l00361"></a>00361 
<a name="l00362"></a>00362 <span class="keyword">protected</span>:
<a name="l00363"></a>00363     <a class="code" href="a00105.html" title="Pager pool base class for managed memory pools.">PagerPool</a>();
<a name="l00364"></a>00364     ~<a class="code" href="a00105.html" title="Pager pool base class for managed memory pools.">PagerPool</a>();
<a name="l00365"></a>00365 
<a name="l00366"></a>00366     <a class="code" href="a00104.html" title="This is a base class for objects that may be created in pager pools.">PagerObject</a> *<span class="keyword">get</span>(<span class="keywordtype">size_t</span> size);
<a name="l00367"></a>00367 
<a name="l00368"></a>00368 <span class="keyword">public</span>:
<a name="l00373"></a>00373     <span class="keywordtype">void</span> put(<a class="code" href="a00104.html" title="This is a base class for objects that may be created in pager pools.">PagerObject</a> *<span class="keywordtype">object</span>);
<a name="l00374"></a>00374 };
<a name="l00375"></a>00375 
<a name="l00376"></a>00376 <span class="keyword">class </span>__EXPORT charmem : <span class="keyword">public</span> <a class="code" href="a00030.html" title="Common character processing protocol.">CharacterProtocol</a>
<a name="l00377"></a>00377 {
<a name="l00378"></a>00378 <span class="keyword">protected</span>:
<a name="l00379"></a>00379     <span class="keywordtype">char</span> *buffer;
<a name="l00380"></a>00380     <span class="keywordtype">size_t</span> inp, out, size;
<a name="l00381"></a>00381     <span class="keywordtype">bool</span> dynamic;
<a name="l00382"></a>00382 
<a name="l00383"></a>00383     <span class="keywordtype">int</span> <a class="code" href="a00030.html#af4c7630fd8ed62d09bb5df069c264a06" title="Get the next character.">_getch</a>(<span class="keywordtype">void</span>);
<a name="l00384"></a>00384     <span class="keywordtype">int</span> <a class="code" href="a00030.html#abc7a3a5f8cd7082fbcad88cbb8f64cc0" title="Put the next character.">_putch</a>(<span class="keywordtype">int</span> code);
<a name="l00385"></a>00385 
<a name="l00386"></a>00386 <span class="keyword">public</span>:
<a name="l00387"></a>00387     charmem(<span class="keywordtype">char</span> *mem, <span class="keywordtype">size_t</span> size);
<a name="l00388"></a>00388     charmem(<span class="keywordtype">size_t</span> size);
<a name="l00389"></a>00389     charmem();
<a name="l00390"></a>00390     ~charmem();
<a name="l00391"></a>00391 
<a name="l00392"></a>00392     <span class="keywordtype">void</span> <a class="code" href="a00208.html#a8df8e4b667d68be02961ff0d4cd84224" title="Convenience function to unlock shared object through it&amp;#39;s protocol.">release</a>(<span class="keywordtype">void</span>);
<a name="l00393"></a>00393 
<a name="l00394"></a>00394     <span class="keywordtype">void</span> <span class="keyword">set</span>(<span class="keywordtype">char</span> *mem, <span class="keywordtype">size_t</span> size);
<a name="l00395"></a>00395 
<a name="l00396"></a>00396     <span class="keywordtype">void</span> <span class="keyword">set</span>(<span class="keywordtype">size_t</span> size);
<a name="l00397"></a>00397 
<a name="l00398"></a>00398     <span class="keyword">inline</span> <span class="keywordtype">void</span> reset(<span class="keywordtype">void</span>)
<a name="l00399"></a>00399         {inp = out = 0;}
<a name="l00400"></a>00400 
<a name="l00401"></a>00401     <span class="keyword">inline</span> <span class="keywordtype">void</span> rewind(<span class="keywordtype">void</span>)
<a name="l00402"></a>00402         {inp = 0;}
<a name="l00403"></a>00403 };
<a name="l00404"></a>00404 
<a name="l00405"></a>00405 <span class="keyword">class </span>__EXPORT chartext : <span class="keyword">public</span> CharacterProtocol
<a name="l00406"></a>00406 {
<a name="l00407"></a>00407 <span class="keyword">private</span>:
<a name="l00408"></a>00408     <span class="keywordtype">char</span> *pos;
<a name="l00409"></a>00409     <span class="keywordtype">size_t</span> <a class="code" href="a00208.html#a76c25a471c75550616662fab96eea86b" title="Convenience function to return max of two objects.">max</a>;
<a name="l00410"></a>00410 
<a name="l00411"></a>00411     <span class="keywordtype">int</span> _putch(<span class="keywordtype">int</span> code);
<a name="l00412"></a>00412     <span class="keywordtype">int</span> _getch(<span class="keywordtype">void</span>);
<a name="l00413"></a>00413 
<a name="l00414"></a>00414 <span class="keyword">public</span>:
<a name="l00415"></a>00415     chartext();
<a name="l00416"></a>00416     chartext(<span class="keywordtype">char</span> *buf);
<a name="l00417"></a>00417     chartext(<span class="keywordtype">char</span> *buf, <span class="keywordtype">size_t</span> size);
<a name="l00418"></a>00418 };
<a name="l00419"></a>00419 
<a name="l00431"></a><a class="code" href="a00054.html">00431</a> <span class="keyword">class </span>__EXPORT <a class="code" href="a00054.html" title="A class to hold memory pointers referenced by string names.">keyassoc</a> : <span class="keyword">protected</span> <a class="code" href="a00081.html" title="A managed private heap for small allocations.">mempager</a>
<a name="l00432"></a>00432 {
<a name="l00433"></a>00433 <span class="keyword">private</span>:
<a name="l00437"></a>00437     <span class="keyword">class </span>__LOCAL keydata : <span class="keyword">public</span> <a class="code" href="a00090.html" title="A linked object base class with members found by name.">NamedObject</a>
<a name="l00438"></a>00438     {
<a name="l00439"></a>00439     <span class="keyword">public</span>:
<a name="l00440"></a>00440         <span class="keywordtype">void</span> *data;
<a name="l00441"></a>00441         <span class="keywordtype">char</span> text[8];
<a name="l00442"></a>00442 
<a name="l00443"></a>00443         keydata(<a class="code" href="a00054.html" title="A class to hold memory pointers referenced by string names.">keyassoc</a> *assoc, <span class="keywordtype">char</span> *<span class="keywordtype">id</span>, <span class="keywordtype">unsigned</span> <a class="code" href="a00208.html#a76c25a471c75550616662fab96eea86b" title="Convenience function to return max of two objects.">max</a>, <span class="keywordtype">unsigned</span> bufsize);
<a name="l00444"></a>00444     };
<a name="l00445"></a>00445 
<a name="l00446"></a>00446     <span class="keyword">friend</span> <span class="keyword">class </span>keydata;
<a name="l00447"></a>00447 
<a name="l00448"></a>00448     <span class="keywordtype">unsigned</span> count;
<a name="l00449"></a>00449     <span class="keywordtype">unsigned</span> paths;
<a name="l00450"></a>00450     <span class="keywordtype">size_t</span> keysize;
<a name="l00451"></a>00451     <a class="code" href="a00090.html" title="A linked object base class with members found by name.">NamedObject</a> **root;
<a name="l00452"></a>00452     <a class="code" href="a00067.html" title="Common base class for all objects that can be formed into a linked list.">LinkedObject</a> **list;
<a name="l00453"></a>00453 
<a name="l00454"></a>00454 <span class="keyword">public</span>:
<a name="l00461"></a>00461     <a class="code" href="a00054.html" title="A class to hold memory pointers referenced by string names.">keyassoc</a>(<span class="keywordtype">unsigned</span> indexing = 177, <span class="keywordtype">size_t</span> <a class="code" href="a00208.html#a76c25a471c75550616662fab96eea86b" title="Convenience function to return max of two objects.">max</a> = 0, <span class="keywordtype">size_t</span> page = 0);
<a name="l00462"></a>00462 
<a name="l00466"></a>00466     ~<a class="code" href="a00054.html" title="A class to hold memory pointers referenced by string names.">keyassoc</a>();
<a name="l00467"></a>00467 
<a name="l00472"></a><a class="code" href="a00054.html#ae8284cc0e94e03f5fd335effd49cb3e0">00472</a>     <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> getCount(<span class="keywordtype">void</span>)
<a name="l00473"></a>00473         {<span class="keywordflow">return</span> count;};
<a name="l00474"></a>00474 
<a name="l00480"></a><a class="code" href="a00054.html#abf01feff7270f0e0c70341d53b1d47d2">00480</a>     <span class="keyword">inline</span> <span class="keywordtype">void</span> *operator()(<span class="keyword">const</span> <span class="keywordtype">char</span> *name)
<a name="l00481"></a>00481         {<span class="keywordflow">return</span> locate(name);};
<a name="l00482"></a>00482 
<a name="l00486"></a>00486     <span class="keywordtype">void</span> <a class="code" href="a00081.html#a750e34fde88b55db97ca039183afb147" title="Purge all allocated memory and heap pages immediately.">purge</a>(<span class="keywordtype">void</span>);
<a name="l00487"></a>00487 
<a name="l00493"></a>00493     <span class="keywordtype">void</span> *locate(<span class="keyword">const</span> <span class="keywordtype">char</span> *name);
<a name="l00494"></a>00494 
<a name="l00502"></a>00502     <span class="keywordtype">bool</span> assign(<span class="keywordtype">char</span> *name, <span class="keywordtype">void</span> *<a class="code" href="a00110.html" title="Generic smart pointer class.">pointer</a>);
<a name="l00503"></a>00503 
<a name="l00510"></a>00510     <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> *name, <span class="keywordtype">void</span> *<a class="code" href="a00110.html" title="Generic smart pointer class.">pointer</a>);
<a name="l00511"></a>00511 
<a name="l00518"></a>00518     <span class="keywordtype">void</span> *<span class="keyword">remove</span>(<span class="keyword">const</span> <span class="keywordtype">char</span> *name);
<a name="l00519"></a>00519 };
<a name="l00520"></a>00520 
<a name="l00528"></a>00528 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keywordtype">unsigned</span> I = 177, <span class="keywordtype">size_t</span> M = 0, <span class="keywordtype">size_t</span> P = 0&gt;
<a name="l00529"></a><a class="code" href="a00017.html">00529</a> <span class="keyword">class </span><a class="code" href="a00017.html" title="A typed template for using a key association with typed objects.">assoc_pointer</a> : <span class="keyword">private</span> <a class="code" href="a00054.html" title="A class to hold memory pointers referenced by string names.">keyassoc</a>
<a name="l00530"></a>00530 {
<a name="l00531"></a>00531 <span class="keyword">public</span>:
<a name="l00535"></a><a class="code" href="a00017.html#acdbb3201846e7922452b6c401f6fa461">00535</a>     <span class="keyword">inline</span> <a class="code" href="a00017.html#acdbb3201846e7922452b6c401f6fa461" title="Construct an associated pointer hash map based on the class template.">assoc_pointer</a>() : <a class="code" href="a00054.html" title="A class to hold memory pointers referenced by string names.">keyassoc</a>(I, M, P) {};
<a name="l00536"></a>00536 
<a name="l00541"></a><a class="code" href="a00017.html#a874044a9b22a39502954dd97f4fb242c">00541</a>     <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> getCount(<span class="keywordtype">void</span>)
<a name="l00542"></a>00542         {<span class="keywordflow">return</span> keyassoc::getCount();};
<a name="l00543"></a>00543 
<a name="l00547"></a><a class="code" href="a00017.html#abf45dec159d8d71f87a0b0330c50699f">00547</a>     <span class="keyword">inline</span> <span class="keywordtype">void</span> purge(<span class="keywordtype">void</span>)
<a name="l00548"></a>00548         {keyassoc::purge();};
<a name="l00549"></a>00549 
<a name="l00555"></a><a class="code" href="a00017.html#af52f39b4a9aae6bd46f5282e05963fa1">00555</a>     <span class="keyword">inline</span> T *locate(<span class="keyword">const</span> <span class="keywordtype">char</span> *name)
<a name="l00556"></a>00556         {<span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>T*<span class="keyword">&gt;</span>(keyassoc::locate(name));};
<a name="l00557"></a>00557 
<a name="l00563"></a><a class="code" href="a00017.html#a2ac22536d14c7c2c7366b603549fa6b0">00563</a>     <span class="keyword">inline</span> T *operator()(<span class="keyword">const</span> <span class="keywordtype">char</span> *name)
<a name="l00564"></a>00564         {<span class="keywordflow">return</span> locate(name);};
<a name="l00565"></a>00565 
<a name="l00573"></a><a class="code" href="a00017.html#a5b02d21159c55abb0c80739e67ed6d97">00573</a>     <span class="keyword">inline</span> <span class="keywordtype">bool</span> assign(<span class="keywordtype">char</span> *name, T *<a class="code" href="a00110.html" title="Generic smart pointer class.">pointer</a>)
<a name="l00574"></a>00574         {<span class="keywordflow">return</span> keyassoc::assign(name, pointer);};
<a name="l00575"></a>00575 
<a name="l00582"></a><a class="code" href="a00017.html#ac3bec8db4f5fc9607cfa4ce69db5ee42">00582</a>     <span class="keyword">inline</span> <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> *name, T *<a class="code" href="a00110.html" title="Generic smart pointer class.">pointer</a>)
<a name="l00583"></a>00583         {<span class="keywordflow">return</span> keyassoc::create(name, pointer);};
<a name="l00584"></a>00584 
<a name="l00590"></a><a class="code" href="a00017.html#a2670ce3db50719eca2df434a8ee5f9e3">00590</a>     <span class="keyword">inline</span> <span class="keywordtype">void</span> <span class="keyword">remove</span>(<span class="keywordtype">char</span> *name)
<a name="l00591"></a>00591         {<a class="code" href="a00208.html#affa5eb1d4a61e90fb1fc3c3a65a6d849" title="Convenience function to remove an object from a stack.">keyassoc::remove</a>(name);};
<a name="l00592"></a>00592 
<a name="l00598"></a><a class="code" href="a00017.html#a8417a60301a7edc65cea4a528959a77a">00598</a>     <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> utilization(<span class="keywordtype">void</span>)
<a name="l00599"></a>00599         {<span class="keywordflow">return</span> mempager::utilization();};
<a name="l00600"></a>00600 
<a name="l00607"></a><a class="code" href="a00017.html#a706f17536d7effc974ffbe27641b4024">00607</a>     <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> getPages(<span class="keywordtype">void</span>)
<a name="l00608"></a>00608         {<span class="keywordflow">return</span> mempager::getPages();};
<a name="l00609"></a>00609 };
<a name="l00610"></a>00610 
<a name="l00617"></a>00617 <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00618"></a><a class="code" href="a00103.html">00618</a> <span class="keyword">class </span><a class="code" href="a00103.html" title="Mempager managed type factory for pager pool objects.">pager</a> : <span class="keyword">private</span> <a class="code" href="a00080.html" title="A redirection base class for the memory protocol.">MemoryRedirect</a>, <span class="keyword">private</span> <a class="code" href="a00105.html" title="Pager pool base class for managed memory pools.">PagerPool</a>
<a name="l00619"></a>00619 {
<a name="l00620"></a>00620 <span class="keyword">public</span>:
<a name="l00625"></a><a class="code" href="a00103.html#a2b8a6bd496712bedc851d042424c1a30">00625</a>     <span class="keyword">inline</span> <a class="code" href="a00103.html#a2b8a6bd496712bedc851d042424c1a30" title="Construct a pager and optionally assign a private pager heap.">pager</a>(<a class="code" href="a00081.html" title="A managed private heap for small allocations.">mempager</a> *heap = NULL) : <a class="code" href="a00080.html" title="A redirection base class for the memory protocol.">MemoryRedirect</a>(heap), <a class="code" href="a00105.html" title="Pager pool base class for managed memory pools.">PagerPool</a>() {};
<a name="l00626"></a>00626 
<a name="l00630"></a><a class="code" href="a00103.html#a2b97dd1d39430b55a65c57fbf762654a">00630</a>     <span class="keyword">inline</span> ~<a class="code" href="a00103.html" title="Mempager managed type factory for pager pool objects.">pager</a>()
<a name="l00631"></a>00631         {mempager::purge();};
<a name="l00632"></a>00632 
<a name="l00637"></a><a class="code" href="a00103.html#a96dc1bdba7a2800bce3460f14327ec29">00637</a>     <span class="keyword">inline</span> T *operator()(<span class="keywordtype">void</span>)
<a name="l00638"></a>00638         {<span class="keywordflow">return</span> <span class="keyword">new</span>(<span class="keyword">get</span>(<span class="keyword">sizeof</span>(T))) T;};
<a name="l00639"></a>00639 
<a name="l00644"></a><a class="code" href="a00103.html#a6bde235b0b8cd43509afe306c8e93985">00644</a>     <span class="keyword">inline</span> T *operator*()
<a name="l00645"></a>00645         {<span class="keywordflow">return</span> <span class="keyword">new</span>(<span class="keyword">get</span>(<span class="keyword">sizeof</span>(T))) T;};
<a name="l00646"></a>00646 };
<a name="l00647"></a>00647 
<a name="l00653"></a>00653 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keywordtype">unsigned</span> M = 177&gt;
<a name="l00654"></a><a class="code" href="a00060.html">00654</a> <span class="keyword">class </span><a class="code" href="a00060.html" title="A template class for a hash pager.">keypager</a> : <span class="keyword">public</span> <a class="code" href="a00081.html" title="A managed private heap for small allocations.">mempager</a>
<a name="l00655"></a>00655 {
<a name="l00656"></a>00656 <span class="keyword">private</span>:
<a name="l00657"></a>00657     <a class="code" href="a00090.html" title="A linked object base class with members found by name.">NamedObject</a> *idx[M];
<a name="l00658"></a>00658 
<a name="l00659"></a>00659 <span class="keyword">public</span>:
<a name="l00664"></a><a class="code" href="a00060.html#a7adfca2387b671e51088d2185d0e0cc4">00664</a>     <span class="keyword">inline</span> <a class="code" href="a00060.html#a7adfca2387b671e51088d2185d0e0cc4" title="Create the object cache.">keypager</a>(<span class="keywordtype">size_t</span> size) : <a class="code" href="a00081.html" title="A managed private heap for small allocations.">mempager</a>(size) {};
<a name="l00665"></a>00665 
<a name="l00669"></a><a class="code" href="a00060.html#a8daddd9988be34e4f3e7a040836b605d">00669</a>     <span class="keyword">inline</span> ~<a class="code" href="a00060.html" title="A template class for a hash pager.">keypager</a>()
<a name="l00670"></a>00670         {NamedObject::purge(idx, M); mempager::purge();};
<a name="l00671"></a>00671 
<a name="l00678"></a><a class="code" href="a00060.html#afa7371d949a7d55978c42dccdcb3b6e6">00678</a>     <span class="keyword">inline</span> T *<span class="keyword">get</span>(<span class="keyword">const</span> <span class="keywordtype">char</span> *name) <span class="keyword">const</span> {
<a name="l00679"></a>00679         T *node = (<span class="keyword">static_cast&lt;</span>T*<span class="keyword">&gt;</span>(NamedObject::map(idx, name, M)));
<a name="l00680"></a>00680         <span class="keywordflow">if</span>(!node) {
<a name="l00681"></a>00681             node = init&lt;T&gt;(<span class="keyword">static_cast&lt;</span>T*<span class="keyword">&gt;</span>(mempager::_alloc(<span class="keyword">sizeof</span>(T))));
<a name="l00682"></a>00682             node-&gt;NamedObject::add(idx, name, M);
<a name="l00683"></a>00683         }
<a name="l00684"></a>00684         <span class="keywordflow">return</span> node;
<a name="l00685"></a>00685     }
<a name="l00686"></a>00686 
<a name="l00692"></a><a class="code" href="a00060.html#a9e8865d0f4cac732d2bb6a544746808e">00692</a>     <span class="keywordtype">bool</span> test(<span class="keyword">const</span> <span class="keywordtype">char</span> *name)<span class="keyword"> const</span>
<a name="l00693"></a>00693 <span class="keyword">        </span>{<span class="keywordflow">return</span> NamedObject::map(idx, name, M) != NULL;};
<a name="l00694"></a>00694 
<a name="l00701"></a><a class="code" href="a00060.html#a220a4206644809ffa4575a6b0fe1d5e7">00701</a>     <span class="keyword">inline</span> T *operator[](<span class="keyword">const</span> <span class="keywordtype">char</span> *name)<span class="keyword"> const</span>
<a name="l00702"></a>00702 <span class="keyword">        </span>{<span class="keywordflow">return</span> <span class="keyword">get</span>(name);};
<a name="l00703"></a>00703 
<a name="l00708"></a><a class="code" href="a00060.html#a8d84813fbb76f92abb00a2bad050c022">00708</a>     <span class="keyword">inline</span> T *begin(<span class="keywordtype">void</span>)<span class="keyword"> const</span>
<a name="l00709"></a>00709 <span class="keyword">        </span>{<span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>T*<span class="keyword">&gt;</span>(NamedObject::skip(idx, NULL, M));};
<a name="l00710"></a>00710 
<a name="l00716"></a><a class="code" href="a00060.html#a40e31c53d80b3899537ddc68f5c7891a">00716</a>     <span class="keyword">inline</span> T *next(T *current)<span class="keyword"> const</span>
<a name="l00717"></a>00717 <span class="keyword">        </span>{<span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>T*<span class="keyword">&gt;</span>(NamedObject::skip(idx, current, M));};
<a name="l00718"></a>00718 
<a name="l00723"></a><a class="code" href="a00060.html#a529a9dd6f41d61edf32038acb2ceada3">00723</a>     <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> count(<span class="keywordtype">void</span>)<span class="keyword"> const</span>
<a name="l00724"></a>00724 <span class="keyword">        </span>{<span class="keywordflow">return</span> NamedObject::count(idx, M);};
<a name="l00725"></a>00725 
<a name="l00732"></a><a class="code" href="a00060.html#ad79e7542482cc1e2bb0f6337918f02ae">00732</a>     <span class="keyword">inline</span> T **index(<span class="keywordtype">void</span>)<span class="keyword"> const</span>
<a name="l00733"></a>00733 <span class="keyword">        </span>{<span class="keywordflow">return</span> NamedObject::index(idx, M);};
<a name="l00734"></a>00734 
<a name="l00741"></a><a class="code" href="a00060.html#a5932254bfb4583a54cbec54e0d6a7bce">00741</a>     <span class="keyword">inline</span> T **sort(<span class="keywordtype">void</span>)<span class="keyword"> const</span>
<a name="l00742"></a>00742 <span class="keyword">        </span>{<span class="keywordflow">return</span> NamedObject::sort(NamedObject::index(idx, M));};
<a name="l00743"></a>00743 };
<a name="l00744"></a>00744 
<a name="l00745"></a>00745 END_NAMESPACE
<a name="l00746"></a>00746 
<a name="l00747"></a>00747 <span class="preprocessor">#endif</span>
</pre></div></div>
<hr class="footer"/><address style="text-align: right;"><small>Generated on Thu Jul 14 16:38:56 2011 for ucommon by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
</body>
</html>