<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
Syntax highlighting generated by Web C Plus Plus software v0.8.4
Webcpp Copyright (C)2001-2004 Jeffrey Bakker under the GNU GPL
Get webcpp at http://webcpp.sf.net
-->
<html>
<head>
<title>ptypes.h</title>
<style type="text/css">
/*
Webcpp v0.8.1 compatible StyleSheet
http://webcpp.sf.net
Theme: ide-msvcpp
*/
body
{
background-color: #ffffff
}
.webcpp a:link {color:#000000}
.webcpp a:visited {color:#008000}
.webcpp a:active {color:#0000ff}
.webcpp a:hover {color:#0000ff}
.webcpp pre
{
color: #000000
}
.webcpp font
{
font-size:100%
}
.webcpp .symbols
{
color: #000000
}
.webcpp .preproc
{
color: #0000ff
}
.webcpp .integer
{
color: #000000
}
.webcpp .floatpt
{
color: #000000
}
.webcpp .dblquot
{
color: #000000
}
.webcpp .sinquot
{
color: #000000
}
.webcpp .keyword
{
color: #0000ff;
}
.webcpp .keytype
{
color: #0000ff;
}
.webcpp .comment
{
color: #008000;
}
</style>
</head>
<body bgcolor="#FFFFFF" leftmargin="40" marginwidth="40"> <p><a href="../htsrc.html">Index</a><hr noshade></p>
<div class="webcpp">
<pre>
<font CLASS=preproc>#ifndef</font> __PTYPES_H__
<font CLASS=preproc>#define</font> __PTYPES_H__
<font CLASS=preproc>#ifndef</font> __PPORT_H__
<font CLASS=preproc>#include</font> <font CLASS=dblquot>"pport.h"</font>
<font CLASS=preproc>#endif</font>
<font CLASS=preproc>#include</font> <string.h>
PTYPES_BEGIN
<font CLASS=preproc>#ifdef</font> _MSC_VER
<font CLASS=preproc>#pragma</font> pack(push, <font CLASS=integer>4</font>)
<font CLASS=comment>// disable "non dll-interface class '...' used as base for dll-interface class '...'" warning</font>
<font CLASS=preproc>#pragma</font> warning(disable : <font CLASS=integer>4275</font>)
<font CLASS=comment>// disable "conditional expression constant" warning</font>
<font CLASS=preproc>#pragma</font> warning(push)
<font CLASS=preproc>#pragma</font> warning(disable : <font CLASS=integer>4127</font>)
<font CLASS=preproc>#endif</font>
<font CLASS=keytype>int</font> __PFASTCALL pincrement(<font CLASS=keytype>int</font>* target);
<font CLASS=keytype>int</font> __PFASTCALL pdecrement(<font CLASS=keytype>int</font>* target);
<font CLASS=keytype>int</font> __PFASTCALL pexchange(<font CLASS=keytype>int</font>* target, <font CLASS=keytype>int</font> value);
<font CLASS=keytype>void</font>* __PFASTCALL pexchange(<font CLASS=keytype>void</font>** target, <font CLASS=keytype>void</font>* value);
<font CLASS=keyword>template</font> <<font CLASS=keyword>class</font> T> <font CLASS=keyword>inline</font> T* tpexchange(T** target, T* value)
{ <font CLASS=keyword>return</font> (T*)pexchange((<font CLASS=keytype>void</font>**)target, (<font CLASS=keytype>void</font>*)value); }
<font CLASS=preproc>#if</font> ((__GNUC__ <font CLASS=symbols>==</font> <font CLASS=integer>3</font>) && (__GNUC_MINOR__ ><font CLASS=symbols>=</font> <font CLASS=integer>3</font>)) || (__GNUC__ == <font CLASS=integer>4</font>) || defined(__hpux)
<font CLASS=preproc>#</font> define VARIANT_TYPECAST_HACK
<font CLASS=preproc>#endif</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// --- string class --------------------------------------------------- //</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// dynamic string class with thread-safe ref-counted buffer</font>
<font CLASS=keyword>struct</font> _strrec
{
<font CLASS=keytype>int</font> refcount;
<font CLASS=keytype>int</font> length;
};
<font CLASS=keyword>typedef</font> _strrec* _pstrrec;
<font CLASS=preproc>#define</font> STR_BASE(x) (_pstrrec(x)<font CLASS=symbols>-</font><font CLASS=integer>1</font>)
<font CLASS=preproc>#define</font> STR_REFCOUNT(x) (STR_BASE(x)<font CLASS=symbols>-</font>>refcount)
<font CLASS=preproc>#define</font> STR_LENGTH(x) (STR_BASE(x)<font CLASS=symbols>-</font>>length)
<font CLASS=preproc>#define</font> PTR_TO_PSTRING(p) (pstring(&(p)))
<font CLASS=preproc>#define</font> PTR_TO_STRING(p) (*PTR_TO_PSTRING(p))
<font CLASS=keyword>extern</font> <font CLASS=keytype>char</font>* emptystr;
<font CLASS=keyword>class</font> variant;
<font CLASS=keyword>class</font> string
{
<font CLASS=keyword>friend</font> <font CLASS=keyword>class</font> variant;
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
<font CLASS=keytype>char</font>* data;
<font CLASS=keytype>static</font> <font CLASS=keytype>void</font> idxerror();
<font CLASS=keytype>void</font> _alloc(<font CLASS=keytype>int</font>);
<font CLASS=keytype>void</font> _realloc(<font CLASS=keytype>int</font>);
<font CLASS=keytype>void</font> _free();
<font CLASS=keytype>void</font> initialize() { data <font CLASS=symbols>=</font> emptystr; }
<font CLASS=keytype>void</font> initialize(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>*, <font CLASS=keytype>int</font>);
<font CLASS=keytype>void</font> initialize(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>*);
<font CLASS=keytype>void</font> initialize(<font CLASS=keytype>char</font>);
<font CLASS=keytype>void</font> initialize(<font CLASS=keyword>const</font> string& s);
<font CLASS=keytype>void</font> initialize(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>*, <font CLASS=keytype>int</font>, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>*, <font CLASS=keytype>int</font>);
<font CLASS=keytype>void</font> initialize(<font CLASS=keyword>const</font> variant&);
<font CLASS=keytype>void</font> finalize();
<font CLASS=keytype>void</font> assign(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>*, <font CLASS=keytype>int</font>);
<font CLASS=keytype>void</font> assign(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>*);
<font CLASS=keytype>void</font> assign(<font CLASS=keyword>const</font> string&);
<font CLASS=keytype>void</font> assign(<font CLASS=keytype>char</font>);
<font CLASS=preproc>#ifdef</font> CHECK_BOUNDS
<font CLASS=keytype>void</font> idx(<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { <font CLASS=keyword>if</font> (<font CLASS=keytype>unsigned</font>(index) ><font CLASS=symbols>=</font> <font CLASS=keytype>unsigned</font>(STR_LENGTH(data))) idxerror(); }
<font CLASS=preproc>#else</font>
<font CLASS=keytype>void</font> idx(<font CLASS=keytype>int</font>) <font CLASS=keyword>const</font> { }
<font CLASS=preproc>#endif</font>
string(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* s1, <font CLASS=keytype>int</font> len1, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* s2, <font CLASS=keytype>int</font> len2) { initialize(s1, len1, s2, len2); }
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
<font CLASS=keyword>friend</font> <font CLASS=keytype>int</font> length(<font CLASS=keyword>const</font> string& s);
<font CLASS=keyword>friend</font> <font CLASS=keytype>int</font> refcount(<font CLASS=keyword>const</font> string& s);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> assign(string& s, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* buf, <font CLASS=keytype>int</font> len);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> clear(string& s);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> isempty(<font CLASS=keyword>const</font> string& s);
<font CLASS=keyword>friend</font> <font CLASS=keytype>char</font>* setlength(string&, <font CLASS=keytype>int</font>);
<font CLASS=keyword>friend</font> <font CLASS=keytype>char</font>* unique(string&);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> concat(string& s, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* sc, <font CLASS=keytype>int</font> catlen);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> concat(string& s, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* s1);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> concat(string& s, <font CLASS=keytype>char</font> s1);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> concat(string& s, <font CLASS=keyword>const</font> string& s1);
<font CLASS=keyword>friend</font> string copy(<font CLASS=keyword>const</font> string& s, <font CLASS=keytype>int</font> from, <font CLASS=keytype>int</font> cnt);
<font CLASS=keyword>friend</font> string copy(<font CLASS=keyword>const</font> string& s, <font CLASS=keytype>int</font> from);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> ins(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* s1, <font CLASS=keytype>int</font> s1len, string& s, <font CLASS=keytype>int</font> at);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> ins(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* s1, string& s, <font CLASS=keytype>int</font> at);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> ins(<font CLASS=keytype>char</font> s1, string& s, <font CLASS=keytype>int</font> at);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> ins(<font CLASS=keyword>const</font> string& s1, string& s, <font CLASS=keytype>int</font> at);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> del(string& s, <font CLASS=keytype>int</font> at, <font CLASS=keytype>int</font> cnt);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> del(string& s, <font CLASS=keytype>int</font> at);
<font CLASS=keyword>friend</font> <font CLASS=keytype>int</font> pos(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* s1, <font CLASS=keyword>const</font> string& s);
<font CLASS=keyword>friend</font> <font CLASS=keytype>int</font> pos(<font CLASS=keytype>char</font> s1, <font CLASS=keyword>const</font> string& s);
<font CLASS=keyword>friend</font> <font CLASS=keytype>int</font> pos(<font CLASS=keyword>const</font> string& s1, <font CLASS=keyword>const</font> string& s);
<font CLASS=keyword>friend</font> <font CLASS=keytype>int</font> rpos(<font CLASS=keytype>char</font> s1, <font CLASS=keyword>const</font> string& s);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> contains(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* s1, <font CLASS=keytype>int</font> len, <font CLASS=keyword>const</font> string& s, <font CLASS=keytype>int</font> at);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> contains(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* s1, <font CLASS=keyword>const</font> string& s, <font CLASS=keytype>int</font> at);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> contains(<font CLASS=keytype>char</font> s1, <font CLASS=keyword>const</font> string& s, <font CLASS=keytype>int</font> at);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> contains(<font CLASS=keyword>const</font> string& s1, <font CLASS=keyword>const</font> string& s, <font CLASS=keytype>int</font> at);
<font CLASS=keyword>friend</font> string dup(<font CLASS=keyword>const</font> string& s);
string() { initialize(); }
string(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* sc, <font CLASS=keytype>int</font> initlen) { initialize(sc, initlen); }
string(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* sc) { initialize(sc); }
string(<font CLASS=keytype>char</font> c) { initialize(c); }
string(<font CLASS=keyword>const</font> string& s) { initialize(s); }
~string() { finalize(); }
<font CLASS=preproc>#ifdef</font> VARIANT_TYPECAST_HACK
string(<font CLASS=keyword>const</font> variant& v) { initialize(v); }
<font CLASS=preproc>#endif</font>
string& <font CLASS=keyword>operator</font><font CLASS=symbols>=</font> (<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* sc) { assign(sc); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
string& <font CLASS=keyword>operator</font><font CLASS=symbols>=</font> (<font CLASS=keytype>char</font> c) { assign(c); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
string& <font CLASS=keyword>operator</font><font CLASS=symbols>=</font> (<font CLASS=keyword>const</font> string& s) { assign(s); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
string& <font CLASS=keyword>operator</font><font CLASS=symbols>+=</font> (<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* sc) { concat(*<font CLASS=keyword>this</font>, sc); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
string& <font CLASS=keyword>operator</font><font CLASS=symbols>+=</font> (<font CLASS=keytype>char</font> c) { concat(*<font CLASS=keyword>this</font>, c); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
string& <font CLASS=keyword>operator</font><font CLASS=symbols>+=</font> (<font CLASS=keyword>const</font> string& s) { concat(*<font CLASS=keyword>this</font>, s); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
string <font CLASS=keyword>operator</font><font CLASS=symbols>+</font> (<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* sc) <font CLASS=keyword>const</font>;
string <font CLASS=keyword>operator</font><font CLASS=symbols>+</font> (<font CLASS=keytype>char</font> c) <font CLASS=keyword>const</font>;
string <font CLASS=keyword>operator</font><font CLASS=symbols>+</font> (<font CLASS=keyword>const</font> string& s) <font CLASS=keyword>const</font>;
<font CLASS=keyword>friend</font> string <font CLASS=keyword>operator</font><font CLASS=symbols>+</font> (<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* sc, <font CLASS=keyword>const</font> string& s);
<font CLASS=keyword>friend</font> string <font CLASS=keyword>operator</font><font CLASS=symbols>+</font> (<font CLASS=keytype>char</font> c, <font CLASS=keyword>const</font> string& s);
<font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>==</font> (<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* sc) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> strcmp(data, sc) <font CLASS=symbols>==</font> <font CLASS=integer>0</font>; }
<font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>==</font> (<font CLASS=keytype>char</font>) <font CLASS=keyword>const</font>;
<font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>==</font> (<font CLASS=keyword>const</font> string&) <font CLASS=keyword>const</font>;
<font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>!=</font> (<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* sc) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> <font CLASS=symbols>!</font>(*<font CLASS=keyword>this</font> == sc); }
<font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>!=</font> (<font CLASS=keytype>char</font> c) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> <font CLASS=symbols>!</font>(*<font CLASS=keyword>this</font> == c); }
<font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>!=</font> (<font CLASS=keyword>const</font> string& s) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> <font CLASS=symbols>!</font>(*<font CLASS=keyword>this</font> == s); }
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>==</font> (<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>*, <font CLASS=keyword>const</font> string&);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>==</font> (<font CLASS=keytype>char</font>, <font CLASS=keyword>const</font> string&);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>!=</font> (<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>*, <font CLASS=keyword>const</font> string&);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>!=</font> (<font CLASS=keytype>char</font>, <font CLASS=keyword>const</font> string&);
<font CLASS=keyword>operator</font> <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>*() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> data; }
<font CLASS=keyword>operator</font> <font CLASS=keyword>const</font> uchar*() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> (uchar*)data; }
<font CLASS=keytype>char</font>& <font CLASS=keyword>operator</font>[] (<font CLASS=keytype>int</font> i) { idx(i); <font CLASS=keyword>return</font> unique(*<font CLASS=keyword>this</font>)[i]; }
<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>& <font CLASS=keyword>operator</font>[] (<font CLASS=keytype>int</font> i) <font CLASS=keyword>const</font> { idx(i); <font CLASS=keyword>return</font> data[i]; }
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> initialize(string& s);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> initialize(string& s, <font CLASS=keyword>const</font> string& s1);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> initialize(string& s, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* s1);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> finalize(string& s);
};
<font CLASS=keyword>typedef</font> string* pstring;
<font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> length(<font CLASS=keyword>const</font> string& s) { <font CLASS=keyword>return</font> STR_LENGTH(s.data); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> refcount(<font CLASS=keyword>const</font> string& s) { <font CLASS=keyword>return</font> STR_REFCOUNT(s.data); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> assign(string& s, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* buf, <font CLASS=keytype>int</font> len) { s.assign(buf, len); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> clear(string& s) { s.finalize(); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>bool</font> isempty(<font CLASS=keyword>const</font> string& s) { <font CLASS=keyword>return</font> length(s) <font CLASS=symbols>==</font> <font CLASS=integer>0</font>; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> pos(<font CLASS=keyword>const</font> string& s1, <font CLASS=keyword>const</font> string& s) { <font CLASS=keyword>return</font> pos(s1.data, s); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>==</font> (<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* sc, <font CLASS=keyword>const</font> string& s){ <font CLASS=keyword>return</font> s <font CLASS=symbols>==</font> sc; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>==</font> (<font CLASS=keytype>char</font> c, <font CLASS=keyword>const</font> string& s) { <font CLASS=keyword>return</font> s <font CLASS=symbols>==</font> c; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>!=</font> (<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* sc, <font CLASS=keyword>const</font> string& s){ <font CLASS=keyword>return</font> s <font CLASS=symbols>!=</font> sc; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>!=</font> (<font CLASS=keytype>char</font> c, <font CLASS=keyword>const</font> string& s) { <font CLASS=keyword>return</font> s <font CLASS=symbols>!=</font> c; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> initialize(string& s) { s.initialize(); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> initialize(string& s, <font CLASS=keyword>const</font> string& s1) { s.initialize(s1); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> initialize(string& s, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* s1) { s.initialize(s1); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> finalize(string& s) { s.finalize(); }
<font CLASS=keyword>extern</font> <font CLASS=keytype>int</font> stralloc;
<font CLASS=keyword>extern</font> string nullstring;
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// --- string utilities ----------------------------------------------- //</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
string fill(<font CLASS=keytype>int</font> width, <font CLASS=keytype>char</font> pad);
string pad(<font CLASS=keyword>const</font> string& s, <font CLASS=keytype>int</font> width, <font CLASS=keytype>char</font> c, <font CLASS=keytype>bool</font> left <font CLASS=symbols>=</font> <font CLASS=keyword>true</font>);
string itostring(large value, <font CLASS=keytype>int</font> base, <font CLASS=keytype>int</font> width <font CLASS=symbols>=</font> <font CLASS=integer>0</font>, <font CLASS=keytype>char</font> pad <font CLASS=symbols>=</font> <font CLASS=integer>0</font>);
string itostring(ularge value, <font CLASS=keytype>int</font> base, <font CLASS=keytype>int</font> width <font CLASS=symbols>=</font> <font CLASS=integer>0</font>, <font CLASS=keytype>char</font> pad <font CLASS=symbols>=</font> <font CLASS=integer>0</font>);
string itostring(<font CLASS=keytype>int</font> value, <font CLASS=keytype>int</font> base, <font CLASS=keytype>int</font> width <font CLASS=symbols>=</font> <font CLASS=integer>0</font>, <font CLASS=keytype>char</font> pad <font CLASS=symbols>=</font> <font CLASS=integer>0</font>);
string itostring(<font CLASS=keytype>unsigned</font> value, <font CLASS=keytype>int</font> base, <font CLASS=keytype>int</font> width <font CLASS=symbols>=</font> <font CLASS=integer>0</font>, <font CLASS=keytype>char</font> pad <font CLASS=symbols>=</font> <font CLASS=integer>0</font>);
string itostring(large v);
string itostring(ularge v);
string itostring(<font CLASS=keytype>int</font> v);
string itostring(<font CLASS=keytype>unsigned</font> v);
large stringtoi(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>*);
large stringtoie(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>*);
ularge stringtoue(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>*, <font CLASS=keytype>int</font> base);
string lowercase(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* s);
string lowercase(<font CLASS=keyword>const</font> string& s);
<font CLASS=keytype>char</font> hex4(<font CLASS=keytype>char</font> c);
<font CLASS=keyword>inline</font> <font CLASS=keytype>char</font> locase(<font CLASS=keytype>char</font> c)
{ <font CLASS=keyword>if</font> (c ><font CLASS=symbols>=</font> <font CLASS=sinquot>'A'</font> && c <<font CLASS=symbols>=</font> <font CLASS=sinquot>'Z'</font>) <font CLASS=keyword>return</font> <font CLASS=keytype>char</font>(c + <font CLASS=integer>32</font>); <font CLASS=keyword>return</font> c; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>char</font> upcase(<font CLASS=keytype>char</font> c)
{ <font CLASS=keyword>if</font> (c ><font CLASS=symbols>=</font> <font CLASS=sinquot>'a'</font> && c <<font CLASS=symbols>=</font> <font CLASS=sinquot>'z'</font>) <font CLASS=keyword>return</font> <font CLASS=keytype>char</font>(c - <font CLASS=integer>32</font>); <font CLASS=keyword>return</font> c; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> hstrlen(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* p) <font CLASS=comment>// some Unix systems do not accept NULL</font>
{ <font CLASS=keyword>return</font> p <font CLASS=symbols>==</font> nil ? <font CLASS=integer>0</font> : (<font CLASS=keytype>int</font>)strlen(p); }
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// --- character set -------------------------------------------------- //</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> _csetbits <font CLASS=symbols>=</font> <font CLASS=integer>256</font>;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> _csetbytes <font CLASS=symbols>=</font> _csetbits / <font CLASS=integer>8</font>;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> _csetwords <font CLASS=symbols>=</font> _csetbytes / <font CLASS=keyword>sizeof</font>(<font CLASS=keytype>int</font>);
<font CLASS=keyword>const</font> <font CLASS=keytype>char</font> _csetesc <font CLASS=symbols>=</font> <font CLASS=sinquot>'~'</font>;
<font CLASS=keyword>class</font> cset
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
<font CLASS=keytype>char</font> data[_csetbytes];
<font CLASS=keytype>void</font> assign(<font CLASS=keyword>const</font> cset& s) { memcpy(data, s.data, _csetbytes); }
<font CLASS=keytype>void</font> assign(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* setinit);
<font CLASS=keytype>void</font> clear() { memset(data, <font CLASS=integer>0</font>, _csetbytes); }
<font CLASS=keytype>void</font> fill() { memset(data, <font CLASS=symbols>-</font><font CLASS=integer>1</font>, _csetbytes); }
<font CLASS=keytype>void</font> include(<font CLASS=keytype>char</font> b) { data[uchar(b) / <font CLASS=integer>8</font>] <font CLASS=symbols>|=</font> uchar(<font CLASS=integer>1</font> << (uchar(b) % <font CLASS=integer>8</font>)); }
<font CLASS=keytype>void</font> include(<font CLASS=keytype>char</font> min, <font CLASS=keytype>char</font> max);
<font CLASS=keytype>void</font> exclude(<font CLASS=keytype>char</font> b) { data[uchar(b) / <font CLASS=integer>8</font>] &<font CLASS=symbols>=</font> uchar(~(<font CLASS=integer>1</font> << (uchar(b) % <font CLASS=integer>8</font>))); }
<font CLASS=keytype>void</font> unite(<font CLASS=keyword>const</font> cset& s);
<font CLASS=keytype>void</font> subtract(<font CLASS=keyword>const</font> cset& s);
<font CLASS=keytype>void</font> intersect(<font CLASS=keyword>const</font> cset& s);
<font CLASS=keytype>void</font> invert();
<font CLASS=keytype>bool</font> contains(<font CLASS=keytype>char</font> b) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> (data[uchar(b) / <font CLASS=integer>8</font>] & (<font CLASS=integer>1</font> << (uchar(b) % <font CLASS=integer>8</font>))) <font CLASS=symbols>!=</font> <font CLASS=integer>0</font>; }
<font CLASS=keytype>bool</font> eq(<font CLASS=keyword>const</font> cset& s) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> memcmp(data, s.data, _csetbytes) <font CLASS=symbols>==</font> <font CLASS=integer>0</font>; }
<font CLASS=keytype>bool</font> le(<font CLASS=keyword>const</font> cset& s) <font CLASS=keyword>const</font>;
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
cset() { clear(); }
cset(<font CLASS=keyword>const</font> cset& s) { assign(s); }
cset(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* setinit) { assign(setinit); }
cset& <font CLASS=keyword>operator</font><font CLASS=symbols>=</font> (<font CLASS=keyword>const</font> cset& s) { assign(s); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
cset& <font CLASS=keyword>operator</font><font CLASS=symbols>+=</font> (<font CLASS=keyword>const</font> cset& s) { unite(s); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
cset& <font CLASS=keyword>operator</font><font CLASS=symbols>+=</font> (<font CLASS=keytype>char</font> b) { include(b); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
cset <font CLASS=keyword>operator</font><font CLASS=symbols>+</font> (<font CLASS=keyword>const</font> cset& s) <font CLASS=keyword>const</font> { cset t <font CLASS=symbols>=</font> *<font CLASS=keyword>this</font>; <font CLASS=keyword>return</font> t += s; }
cset <font CLASS=keyword>operator</font><font CLASS=symbols>+</font> (<font CLASS=keytype>char</font> b) <font CLASS=keyword>const</font> { cset t <font CLASS=symbols>=</font> *<font CLASS=keyword>this</font>; <font CLASS=keyword>return</font> t += b; }
cset& <font CLASS=keyword>operator</font><font CLASS=symbols>-=</font> (<font CLASS=keyword>const</font> cset& s) { subtract(s); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
cset& <font CLASS=keyword>operator</font><font CLASS=symbols>-=</font> (<font CLASS=keytype>char</font> b) { exclude(b); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
cset <font CLASS=keyword>operator</font><font CLASS=symbols>-</font> (<font CLASS=keyword>const</font> cset& s) <font CLASS=keyword>const</font> { cset t <font CLASS=symbols>=</font> *<font CLASS=keyword>this</font>; <font CLASS=keyword>return</font> t -= s; }
cset <font CLASS=keyword>operator</font><font CLASS=symbols>-</font> (<font CLASS=keytype>char</font> b) <font CLASS=keyword>const</font> { cset t <font CLASS=symbols>=</font> *<font CLASS=keyword>this</font>; <font CLASS=keyword>return</font> t -= b; }
cset& <font CLASS=keyword>operator</font>*<font CLASS=symbols>=</font> (<font CLASS=keyword>const</font> cset& s) { intersect(s); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
cset <font CLASS=keyword>operator</font>* (<font CLASS=keyword>const</font> cset& s) <font CLASS=keyword>const</font> { cset t <font CLASS=symbols>=</font> *<font CLASS=keyword>this</font>; <font CLASS=keyword>return</font> t *<font CLASS=symbols>=</font> s; }
cset <font CLASS=keyword>operator</font><font CLASS=symbols>!</font> () <font CLASS=keyword>const</font> { cset t <font CLASS=symbols>=</font> *<font CLASS=keyword>this</font>; t.invert(); <font CLASS=keyword>return</font> t; }
<font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>==</font> (<font CLASS=keyword>const</font> cset& s) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> eq(s); }
<font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>!=</font> (<font CLASS=keyword>const</font> cset& s) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> !eq(s); }
<font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><<font CLASS=symbols>=</font> (<font CLASS=keyword>const</font> cset& s) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> le(s); }
<font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font>><font CLASS=symbols>=</font> (<font CLASS=keyword>const</font> cset& s) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> s.le(*<font CLASS=keyword>this</font>); }
<font CLASS=keyword>friend</font> cset <font CLASS=keyword>operator</font><font CLASS=symbols>+</font> (<font CLASS=keytype>char</font> b, <font CLASS=keyword>const</font> cset& s);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font>& (<font CLASS=keytype>char</font> b, <font CLASS=keyword>const</font> cset& s);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> assign(cset& s, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* setinit);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> clear(cset& s);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> fill(cset& s);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> include(cset& s, <font CLASS=keytype>char</font> b);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> include(cset& s, <font CLASS=keytype>char</font> min, <font CLASS=keytype>char</font> max);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> exclude(cset& s, <font CLASS=keytype>char</font> b);
<font CLASS=keyword>friend</font> string asstring(<font CLASS=keyword>const</font> cset& s);
};
<font CLASS=keyword>inline</font> cset <font CLASS=keyword>operator</font><font CLASS=symbols>+</font> (<font CLASS=keytype>char</font> b, <font CLASS=keyword>const</font> cset& s) { <font CLASS=keyword>return</font> s <font CLASS=symbols>+</font> b; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font>& (<font CLASS=keytype>char</font> b, <font CLASS=keyword>const</font> cset& s) { <font CLASS=keyword>return</font> s.contains(b); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> assign(cset& s, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* setinit) { s.assign(setinit); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> clear(cset& s) { s.clear(); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> fill(cset& s) { s.fill(); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> include(cset& s, <font CLASS=keytype>char</font> b) { s.include(b); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> include(cset& s, <font CLASS=keytype>char</font> min, <font CLASS=keytype>char</font> max) { s.include(min, max); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> exclude(cset& s, <font CLASS=keytype>char</font> b) { s.exclude(b); }
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// --- basic abstract classes ----------------------------------------- //</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// basic class with virtual destructor; historically was used as a base</font>
<font CLASS=comment>// for all list items. also helps to count the number of created and</font>
<font CLASS=comment>// destroyed objects in a program (objalloc global) in DEBUG mode, to</font>
<font CLASS=comment>// detect memory leaks. most classes in ptypes are derived from unknown.</font>
<font CLASS=keyword>extern</font> <font CLASS=keytype>int</font> objalloc;
<font CLASS=keyword>class</font> unknown
{
<font CLASS=preproc><font CLASS=keyword>private</font>:</font>
// make all classes non-copyable by <font CLASS=keyword>default</font>
unknown(<font CLASS=keyword>const</font> unknown&);
<font CLASS=keyword>const</font> unknown& <font CLASS=keyword>operator</font><font CLASS=symbols>=</font> (<font CLASS=keyword>const</font> unknown&);
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
<font CLASS=preproc>#ifdef</font> COUNT_OBJALLOC
unknown() { pincrement(&objalloc); }
<font CLASS=keyword>virtual</font> ~unknown() { pdecrement(&objalloc); }
<font CLASS=preproc>#else</font>
unknown() { }
<font CLASS=keyword>virtual</font> ~unknown() { }
<font CLASS=preproc>#endif</font>
};
<font CLASS=keyword>typedef</font> unknown* punknown;
<font CLASS=comment>// provide non-copyable base for all classes that are</font>
<font CLASS=comment>// not derived from 'unknown'</font>
<font CLASS=keyword>class</font> noncopyable
{
<font CLASS=preproc><font CLASS=keyword>private</font>:</font>
noncopyable(<font CLASS=keyword>const</font> noncopyable&);
<font CLASS=keyword>const</font> noncopyable& <font CLASS=keyword>operator</font><font CLASS=symbols>=</font> (<font CLASS=keyword>const</font> noncopyable&);
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
noncopyable() {}
~noncopyable() {}
};
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// --- exception ------------------------------------------------------ //</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// the basic exception class. NOTE: the library always throws dynamically</font>
<font CLASS=comment>// allocated exception objects.</font>
<font CLASS=keyword>class</font> exception: public unknown
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
string message;
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
exception(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* imsg);
exception(<font CLASS=keyword>const</font> string& imsg);
<font CLASS=keyword>virtual</font> ~exception();
<font CLASS=keyword>virtual</font> string get_message() { <font CLASS=keyword>return</font> message; }
};
<font CLASS=comment>// conversion exception class for stringtoie() and stringtoue()</font>
<font CLASS=keyword>class</font> econv: public exception
{
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
econv(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* msg): exception(msg) {}
econv(<font CLASS=keyword>const</font> string& msg): exception(msg) {}
<font CLASS=keyword>virtual</font> ~econv();
};
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// --- tpodlist ------------------------------------------------------- //</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// _podlist implements dynamic array of small POD structures; it serves</font>
<font CLASS=comment>// as a basis for all list types in the library. this class is undocumented.</font>
<font CLASS=comment>// tpodlist template must be used instead.</font>
<font CLASS=keyword>class</font> _podlist: public noncopyable
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
<font CLASS=keytype>void</font>* list; <font CLASS=comment>// pointer to the array</font>
<font CLASS=keytype>int</font> count; <font CLASS=comment>// number of items in the list</font>
<font CLASS=keytype>int</font> capacity; <font CLASS=comment>// allocated for the list</font>
<font CLASS=keytype>int</font> itemsize; <font CLASS=comment>// list item size</font>
<font CLASS=keytype>static</font> <font CLASS=keytype>void</font> idxerror();
_podlist& <font CLASS=keyword>operator</font> <font CLASS=symbols>=</font>(<font CLASS=keyword>const</font> _podlist& t);
<font CLASS=keytype>void</font> grow();
<font CLASS=keytype>void</font>* doins(<font CLASS=keytype>int</font> index);
<font CLASS=keytype>void</font> doins(<font CLASS=keytype>int</font> index, <font CLASS=keyword>const</font> _podlist&);
<font CLASS=keytype>void</font>* doget(<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> (<font CLASS=keytype>char</font>*)list <font CLASS=symbols>+</font> index * itemsize; }
<font CLASS=keytype>void</font> dodel(<font CLASS=keytype>int</font> index);
<font CLASS=keytype>void</font> dodel(<font CLASS=keytype>int</font> index, <font CLASS=keytype>int</font> count);
<font CLASS=keytype>void</font> dopop();
<font CLASS=preproc>#ifdef</font> CHECK_BOUNDS
<font CLASS=keytype>void</font> idx(<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { <font CLASS=keyword>if</font> (<font CLASS=keytype>unsigned</font>(index) ><font CLASS=symbols>=</font> <font CLASS=keytype>unsigned</font>(count)) idxerror(); }
<font CLASS=keytype>void</font> idxa(<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { <font CLASS=keyword>if</font> (<font CLASS=keytype>unsigned</font>(index) > <font CLASS=keytype>unsigned</font>(count)) idxerror(); }
<font CLASS=preproc>#else</font>
<font CLASS=keytype>void</font> idx(<font CLASS=keytype>int</font>) <font CLASS=keyword>const</font> { }
<font CLASS=keytype>void</font> idxa(<font CLASS=keytype>int</font>) <font CLASS=keyword>const</font> { }
<font CLASS=preproc>#endif</font>
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
_podlist(<font CLASS=keytype>int</font> itemsize);
~_podlist();
<font CLASS=keytype>int</font> get_count() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> count; }
<font CLASS=keytype>void</font> set_count(<font CLASS=keytype>int</font> newcount, <font CLASS=keytype>bool</font> zero <font CLASS=symbols>=</font> <font CLASS=keyword>false</font>);
<font CLASS=keytype>int</font> get_capacity() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> capacity; }
<font CLASS=keytype>void</font> set_capacity(<font CLASS=keytype>int</font> newcap);
<font CLASS=keytype>void</font> clear() { set_count(<font CLASS=integer>0</font>); }
<font CLASS=keytype>void</font> pack() { set_capacity(count); }
<font CLASS=keytype>void</font>* ins(<font CLASS=keytype>int</font> index) { idxa(index); <font CLASS=keyword>return</font> doins(index); }
<font CLASS=keytype>void</font> ins(<font CLASS=keytype>int</font> index, <font CLASS=keyword>const</font> _podlist& t) { idxa(index); doins(index, t); }
<font CLASS=keytype>void</font>* add();
<font CLASS=keytype>void</font> add(<font CLASS=keyword>const</font> _podlist& t);
<font CLASS=keytype>void</font>* <font CLASS=keyword>operator</font> [](<font CLASS=keytype>int</font> index) { idx(index); <font CLASS=keyword>return</font> doget(index); }
<font CLASS=keytype>void</font>* top() { <font CLASS=keyword>return</font> <font CLASS=keyword>operator</font> [](count <font CLASS=symbols>-</font> <font CLASS=integer>1</font>); }
<font CLASS=keytype>void</font> del(<font CLASS=keytype>int</font> index) { idx(index); dodel(index); }
<font CLASS=keytype>void</font> del(<font CLASS=keytype>int</font> index, <font CLASS=keytype>int</font> count) { idx(index); dodel(index, count); }
<font CLASS=keytype>void</font> pop() { idx(<font CLASS=integer>0</font>); dopop(); }
};
<font CLASS=comment>// tpodlist is a fully-inlined template based on _podlist</font>
<font CLASS=keyword>template</font> <<font CLASS=keyword>class</font> X, <font CLASS=keytype>bool</font> initzero <font CLASS=symbols>=</font> <font CLASS=keyword>false</font>> <font CLASS=keyword>class</font> tpodlist: <font CLASS=keyword>public</font> _podlist
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
X& dozero(X& t) { <font CLASS=keyword>if</font> (initzero) memset(&t, <font CLASS=integer>0</font>, <font CLASS=keyword>sizeof</font>(X)); <font CLASS=keyword>return</font> t; }
X& doget(<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> ((X*)list)[index]; }
X& doins(<font CLASS=keytype>int</font> index) { X& t <font CLASS=symbols>=</font> *(X*)_podlist::doins(index); <font CLASS=keyword>return</font> dozero(t); }
<font CLASS=keytype>void</font> doins(<font CLASS=keytype>int</font> index, <font CLASS=keyword>const</font> X& item) { *(X*)_podlist::doins(index) <font CLASS=symbols>=</font> item; }
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
tpodlist(): _podlist(<font CLASS=keyword>sizeof</font>(X)) {}
tpodlist<X, initzero>& <font CLASS=keyword>operator</font> <font CLASS=symbols>=</font>(<font CLASS=keyword>const</font> tpodlist<X, initzero>& t)
{ _podlist::<font CLASS=keyword>operator</font> <font CLASS=symbols>=</font>(t); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
<font CLASS=keytype>void</font> set_count(<font CLASS=keytype>int</font> newcount) { _podlist::set_count(newcount, initzero); }
X& ins(<font CLASS=keytype>int</font> index) { idxa(index); <font CLASS=keyword>return</font> doins(index); }
<font CLASS=keytype>void</font> ins(<font CLASS=keytype>int</font> index, <font CLASS=keyword>const</font> X& item) { idxa(index); doins(index, item); }
<font CLASS=keytype>void</font> ins(<font CLASS=keytype>int</font> index, <font CLASS=keyword>const</font> tpodlist<X, initzero>& t)
{ _podlist::ins(index, t); }
X& add() { grow(); <font CLASS=keyword>return</font> dozero(doget(count<font CLASS=symbols>++</font>)); }
<font CLASS=keytype>void</font> add(<font CLASS=keyword>const</font> X& item) { grow(); doget(count<font CLASS=symbols>++</font>) <font CLASS=symbols>=</font> item; }
<font CLASS=keytype>void</font> add(<font CLASS=keyword>const</font> tpodlist<X, initzero>& t)
{ _podlist::add(t); }
X& <font CLASS=keyword>operator</font> [](<font CLASS=keytype>int</font> index) { idx(index); <font CLASS=keyword>return</font> doget(index); }
<font CLASS=keyword>const</font> X& <font CLASS=keyword>operator</font> [](<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { idx(index); <font CLASS=keyword>return</font> doget(index); }
X& top() { idx(<font CLASS=integer>0</font>); <font CLASS=keyword>return</font> doget(count <font CLASS=symbols>-</font> <font CLASS=integer>1</font>); }
};
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// --- tobjlist ------------------------------------------------------- //</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// _objlist is a base for the tobjlist template, don't use it directly.</font>
<font CLASS=comment>// also, _objlist is a base for _strlist and derivatives.</font>
<font CLASS=keyword>class</font> _objlist: public unknown, <font CLASS=keyword>protected</font> tpodlist<<font CLASS=keytype>void</font>*, <font CLASS=keyword>true</font>>
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
<font CLASS=keyword>struct</font>
{
<font CLASS=keytype>unsigned</font> ownobjects :<font CLASS=integer>1</font>; <font CLASS=comment>// list is responsible for destroying the items; used in _objlist</font>
<font CLASS=keytype>unsigned</font> ownslobjects :<font CLASS=integer>1</font>; <font CLASS=comment>// same but for _strlist items (in _stritem structure)</font>
<font CLASS=keytype>unsigned</font> sorted :<font CLASS=integer>1</font>; <font CLASS=comment>// sorted list (_objlist+)</font>
<font CLASS=keytype>unsigned</font> duplicates :<font CLASS=integer>1</font>; <font CLASS=comment>// sorted: allows duplicate keys (_objlist+)</font>
<font CLASS=keytype>unsigned</font> casesens :<font CLASS=integer>1</font>; <font CLASS=comment>// sorted: string comparison is case sensitive (_strlist+)</font>
<font CLASS=keytype>unsigned</font> _reserved :<font CLASS=integer>27</font>;
} config;
_objlist(bool ownobjects); <font CLASS=comment>// we hide this ctor, since _objlist actually can't free objects</font>
<font CLASS=keytype>void</font>* doget(<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> ((<font CLASS=keytype>void</font>**)list)[index]; }
<font CLASS=keytype>void</font> doput(<font CLASS=keytype>int</font> index, <font CLASS=keytype>void</font>* obj);
<font CLASS=keytype>void</font> dodel(<font CLASS=keytype>int</font> index);
<font CLASS=keytype>void</font> dodel(<font CLASS=keytype>int</font> index, <font CLASS=keytype>int</font> count);
<font CLASS=keytype>void</font>* dopop();
<font CLASS=keytype>void</font> dofree(<font CLASS=keytype>int</font> index, <font CLASS=keytype>int</font> count);
<font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> dofree(<font CLASS=keytype>void</font>* obj); <font CLASS=comment>// pure method; defined in tobjlist instances</font>
<font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> compare(<font CLASS=keyword>const</font> <font CLASS=keytype>void</font>* key, <font CLASS=keyword>const</font> <font CLASS=keytype>void</font>* obj) <font CLASS=keyword>const</font>; <font CLASS=comment>// pure method; defined in _strlist</font>
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
_objlist();
<font CLASS=keyword>virtual</font> ~_objlist();
<font CLASS=keytype>int</font> get_count() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> count; }
<font CLASS=keytype>void</font> set_count(<font CLASS=keytype>int</font> newcount);
<font CLASS=keytype>int</font> get_capacity() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> capacity; }
<font CLASS=keytype>void</font> set_capacity(<font CLASS=keytype>int</font> newcap) { tpodlist<<font CLASS=keytype>void</font>*,<font CLASS=keyword>true</font>>::set_capacity(newcap); }
<font CLASS=keytype>void</font> clear() { set_count(<font CLASS=integer>0</font>); }
<font CLASS=keytype>void</font> pack() { tpodlist<<font CLASS=keytype>void</font>*,<font CLASS=keyword>true</font>>::pack(); }
<font CLASS=keytype>void</font> ins(<font CLASS=keytype>int</font> index, <font CLASS=keytype>void</font>* obj) { tpodlist<<font CLASS=keytype>void</font>*,<font CLASS=keyword>true</font>>::ins(index, obj); }
<font CLASS=keytype>void</font> add(<font CLASS=keytype>void</font>* obj) { tpodlist<<font CLASS=keytype>void</font>*,<font CLASS=keyword>true</font>>::add(obj); }
<font CLASS=keytype>void</font> put(<font CLASS=keytype>int</font> index, <font CLASS=keytype>void</font>* obj) { idx(index); doput(index, obj); }
<font CLASS=keytype>void</font>* <font CLASS=keyword>operator</font> [](<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { idx(index); <font CLASS=keyword>return</font> doget(index); }
<font CLASS=keytype>void</font>* top() <font CLASS=keyword>const</font> { idx(<font CLASS=integer>0</font>); <font CLASS=keyword>return</font> doget(count <font CLASS=symbols>-</font> <font CLASS=integer>1</font>); }
<font CLASS=keytype>void</font>* pop() { idx(<font CLASS=integer>0</font>); <font CLASS=keyword>return</font> dopop(); }
<font CLASS=keytype>void</font> del(<font CLASS=keytype>int</font> index) { idx(index); dodel(index); }
<font CLASS=keytype>void</font> del(<font CLASS=keytype>int</font> index, <font CLASS=keytype>int</font> count) { idx(index); dodel(index, count); }
<font CLASS=keytype>int</font> indexof(<font CLASS=keytype>void</font>* obj) <font CLASS=keyword>const</font>;
<font CLASS=keytype>bool</font> search(<font CLASS=keyword>const</font> <font CLASS=keytype>void</font>* key, <font CLASS=keytype>int</font>& index) <font CLASS=keyword>const</font>;
};
<font CLASS=comment>// the tobjlist template implements a list of pointers to arbitrary</font>
<font CLASS=comment>// structures. optionally can automatically free objects (ownobjects)</font>
<font CLASS=comment>// when removed from a list. only 2 virtual functions are being</font>
<font CLASS=comment>// instantiated by this template, the rest is static code in _objlist.</font>
<font CLASS=keyword>template</font> <<font CLASS=keyword>class</font> X> <font CLASS=keyword>class</font> tobjlist: <font CLASS=keyword>public</font> _objlist
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
X* doget(<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> (X*)_objlist::doget(index); }
<font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> dofree(<font CLASS=keytype>void</font>* obj);
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
tobjlist(<font CLASS=keytype>bool</font> ownobjects <font CLASS=symbols>=</font> <font CLASS=keyword>false</font>): _objlist(ownobjects) {}
<font CLASS=keyword>virtual</font> ~tobjlist();
<font CLASS=keytype>bool</font> get_ownobjects() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> config.ownobjects; }
<font CLASS=keytype>void</font> set_ownobjects(<font CLASS=keytype>bool</font> newval) { config.ownobjects <font CLASS=symbols>=</font> newval; }
<font CLASS=keytype>void</font> ins(<font CLASS=keytype>int</font> index, X* obj) { _objlist::ins(index, obj); }
<font CLASS=keytype>void</font> add(X* obj) { _objlist::add(obj); }
<font CLASS=keytype>void</font> put(<font CLASS=keytype>int</font> index, X* obj) { _objlist::put(index, obj); }
X* <font CLASS=keyword>operator</font> [](<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { idx(index); <font CLASS=keyword>return</font> (X*)doget(index); }
X* top() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> (X*)_objlist::top(); }
X* pop() { <font CLASS=keyword>return</font> (X*)_objlist::pop(); }
<font CLASS=keytype>int</font> indexof(X* obj) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> _objlist::indexof(obj); }
<font CLASS=preproc>#ifdef</font> PTYPES19_COMPAT
<font CLASS=keyword>friend</font> <font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> ins(tobjlist& s, <font CLASS=keytype>int</font> i, X* obj) { s.ins(i, obj); }
<font CLASS=keyword>friend</font> <font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> add(tobjlist& s, X* obj) { s.add(obj); <font CLASS=keyword>return</font> s.get_count() <font CLASS=symbols>-</font> <font CLASS=integer>1</font>; }
<font CLASS=keyword>friend</font> <font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> put(tobjlist& s, <font CLASS=keytype>int</font> i, X* obj) { s.put(i, obj); }
<font CLASS=keyword>friend</font> <font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> indexof(<font CLASS=keyword>const</font> tobjlist& s, X* obj) { <font CLASS=keyword>return</font> s.indexof(obj); }
<font CLASS=keyword>friend</font> <font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> push(tobjlist& s, X* obj) { s.add(obj); <font CLASS=keyword>return</font> s.get_count() <font CLASS=symbols>-</font> <font CLASS=integer>1</font>; }
<font CLASS=keyword>friend</font> <font CLASS=keyword>inline</font> X* pop(tobjlist& s) { <font CLASS=keyword>return</font> (X*)s.pop(); }
<font CLASS=keyword>friend</font> <font CLASS=keyword>inline</font> X* top(<font CLASS=keyword>const</font> tobjlist& s) { <font CLASS=keyword>return</font> (X*)s.top(); }
<font CLASS=keyword>friend</font> <font CLASS=keyword>inline</font> X* get(<font CLASS=keyword>const</font> tobjlist& s, <font CLASS=keytype>int</font> i) { <font CLASS=keyword>return</font> (X*)s[i]; }
<font CLASS=preproc>#endif</font>
};
<font CLASS=keyword>template</font> <<font CLASS=keyword>class</font> X> <font CLASS=keytype>void</font> tobjlist<X>::dofree(<font CLASS=keytype>void</font>* item)
{
<font CLASS=keyword>delete</font> (X*)item;
}
<font CLASS=keyword>template</font> <<font CLASS=keyword>class</font> X> tobjlist<X>::~tobjlist()
{
set_count(<font CLASS=integer>0</font>);
}
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// --- tstrlist ------------------------------------------------------- //</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// _strlist is a base for the tstrlist template</font>
<font CLASS=keyword>typedef</font> <font CLASS=keytype>int</font> slflags; <font CLASS=comment>// left for compatibility</font>
<font CLASS=preproc>#define</font> SL_SORTED <font CLASS=integer>1</font>
<font CLASS=preproc>#define</font> SL_DUPLICATES <font CLASS=integer>2</font>
<font CLASS=preproc>#define</font> SL_CASESENS <font CLASS=integer>4</font>
<font CLASS=preproc>#define</font> SL_OWNOBJECTS <font CLASS=integer>8</font>
<font CLASS=keyword>struct</font> _stritem
{
string key;
<font CLASS=keytype>void</font>* obj;
_stritem(<font CLASS=keyword>const</font> string& ikey, <font CLASS=keytype>void</font>* iobj)
: key(ikey), obj(iobj) {}
};
<font CLASS=keyword>class</font> _strlist: <font CLASS=keyword>protected</font> tobjlist<_stritem>
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
<font CLASS=keytype>static</font> <font CLASS=keytype>void</font> sortederror();
<font CLASS=keytype>static</font> <font CLASS=keytype>void</font> notsortederror();
<font CLASS=keytype>static</font> <font CLASS=keytype>void</font> duperror();
<font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> dofree(<font CLASS=keytype>void</font>* item);
<font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> compare(<font CLASS=keyword>const</font> <font CLASS=keytype>void</font>* key, <font CLASS=keyword>const</font> <font CLASS=keytype>void</font>* item) <font CLASS=keyword>const</font>;
<font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> dofreeobj(<font CLASS=keytype>void</font>* obj); <font CLASS=comment>// pure; tstrlist overrides it</font>
<font CLASS=keyword>const</font> string& dogetkey(<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> doget(index)<font CLASS=symbols>-</font>>key; }
<font CLASS=keytype>void</font>* dogetobj(<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> doget(index)<font CLASS=symbols>-</font>>obj; }
<font CLASS=keytype>void</font> doins(<font CLASS=keytype>int</font> index, <font CLASS=keyword>const</font> string& key, <font CLASS=keytype>void</font>* obj);
<font CLASS=keytype>void</font> doput(<font CLASS=keytype>int</font> index, <font CLASS=keyword>const</font> string& key, <font CLASS=keytype>void</font>* obj);
<font CLASS=keytype>void</font> doput(<font CLASS=keytype>int</font> index, <font CLASS=keytype>void</font>* obj);
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
_strlist(<font CLASS=keytype>int</font> flags <font CLASS=symbols>=</font> <font CLASS=integer>0</font>);
<font CLASS=keyword>virtual</font> ~_strlist();
<font CLASS=keytype>int</font> get_count() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> count; }
<font CLASS=keytype>void</font> set_count(<font CLASS=keytype>int</font> newcount) { tobjlist<_stritem>::set_count(newcount); }
<font CLASS=keytype>int</font> get_capacity() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> capacity; }
<font CLASS=keytype>void</font> set_capacity(<font CLASS=keytype>int</font> newcap) { tobjlist<_stritem>::set_capacity(newcap); }
<font CLASS=keytype>void</font> clear() { tobjlist<_stritem>::clear(); }
<font CLASS=keytype>void</font> pack() { tobjlist<_stritem>::pack(); }
<font CLASS=keytype>bool</font> get_sorted() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> config.sorted; }
<font CLASS=keytype>bool</font> get_duplicates() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> config.duplicates; }
<font CLASS=keytype>bool</font> get_casesens() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> config.casesens; }
<font CLASS=keytype>bool</font> get_ownobjects() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> config.ownslobjects; }
<font CLASS=keytype>void</font> set_ownobjects(<font CLASS=keytype>bool</font> newval) { config.ownslobjects <font CLASS=symbols>=</font> newval; }
<font CLASS=keytype>void</font> ins(<font CLASS=keytype>int</font> index, <font CLASS=keyword>const</font> string& key, <font CLASS=keytype>void</font>* obj) { idxa(index); doins(index, key, obj); }
<font CLASS=keytype>void</font> put(<font CLASS=keytype>int</font> index, <font CLASS=keyword>const</font> string& key, <font CLASS=keytype>void</font>* obj) { idx(index); doput(index, key, obj); }
<font CLASS=keytype>void</font> put(<font CLASS=keytype>int</font> index, <font CLASS=keytype>void</font>* obj) { idx(index); doput(index, obj); }
<font CLASS=keytype>int</font> put(<font CLASS=keyword>const</font> string& key, <font CLASS=keytype>void</font>* obj);
<font CLASS=keytype>int</font> add(<font CLASS=keyword>const</font> string& key, <font CLASS=keytype>void</font>* obj);
<font CLASS=keytype>void</font>* <font CLASS=keyword>operator</font> [](<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { idx(index); <font CLASS=keyword>return</font> dogetobj(index); }
<font CLASS=keytype>void</font>* <font CLASS=keyword>operator</font> [](<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* key) <font CLASS=keyword>const</font>;
<font CLASS=keyword>const</font> string& getkey(<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { idx(index); <font CLASS=keyword>return</font> dogetkey(index); }
<font CLASS=keytype>bool</font> search(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* key, <font CLASS=keytype>int</font>& index) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> _objlist::search(key, index); }
<font CLASS=keytype>void</font> del(<font CLASS=keytype>int</font> index) { idx(index); dodel(index); }
<font CLASS=keytype>void</font> del(<font CLASS=keytype>int</font> index, <font CLASS=keytype>int</font> delcount) { idx(index); dodel(index, delcount); }
<font CLASS=keytype>void</font> del(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* key) { put(key, nil); }
<font CLASS=keytype>int</font> indexof(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* key) <font CLASS=keyword>const</font>;
<font CLASS=keytype>int</font> indexof(<font CLASS=keytype>void</font>* obj) <font CLASS=keyword>const</font>;
};
<font CLASS=comment>// the tstrlist template implements a list of string/object pairs,</font>
<font CLASS=comment>// optionally sorted for fast searching by string key.</font>
<font CLASS=keyword>template</font> <<font CLASS=keyword>class</font> X> <font CLASS=keyword>class</font> tstrlist: <font CLASS=keyword>public</font> _strlist
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
<font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> dofreeobj(<font CLASS=keytype>void</font>* obj);
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
tstrlist(<font CLASS=keytype>int</font> flags <font CLASS=symbols>=</font> <font CLASS=integer>0</font>): _strlist(flags) {}
<font CLASS=keyword>virtual</font> ~tstrlist();
<font CLASS=keytype>void</font> ins(<font CLASS=keytype>int</font> index, <font CLASS=keyword>const</font> string& key, X* obj) { _strlist::ins(index, key, obj); }
<font CLASS=keytype>void</font> put(<font CLASS=keytype>int</font> index, <font CLASS=keyword>const</font> string& key, X* obj) { _strlist::put(index, key, obj); }
<font CLASS=keytype>void</font> put(<font CLASS=keytype>int</font> index, X* obj) { _strlist::put(index, obj); }
<font CLASS=keytype>int</font> put(<font CLASS=keyword>const</font> string& key, X* obj) { <font CLASS=keyword>return</font> _strlist::put(key, obj); }
<font CLASS=keytype>int</font> add(<font CLASS=keyword>const</font> string& key, X* obj) { <font CLASS=keyword>return</font> _strlist::add(key, obj); }
X* <font CLASS=keyword>operator</font> [](<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> (X*)_strlist::<font CLASS=keyword>operator</font> [](index); }
X* <font CLASS=keyword>operator</font> [](<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* key) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> (X*)_strlist::<font CLASS=keyword>operator</font> [](key); }
<font CLASS=keytype>int</font> indexof(X* obj) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> _strlist::indexof(obj); }
<font CLASS=keytype>int</font> indexof(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* key) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> _strlist::indexof(key); }
<font CLASS=preproc>#ifdef</font> PTYPES19_COMPAT
// pre<font CLASS=symbols>-</font><font CLASS=floatpt>2.0</font> interface <font CLASS=keyword>for</font> backwards compatibility
<font CLASS=keyword>friend</font> <font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> ins(tstrlist& s, <font CLASS=keytype>int</font> i, <font CLASS=keyword>const</font> string& str, X* obj) { s.ins(i, str, obj); }
<font CLASS=keyword>friend</font> <font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> add(tstrlist& s, <font CLASS=keyword>const</font> string& str, X* obj) { <font CLASS=keyword>return</font> s.add(str, obj); }
<font CLASS=keyword>friend</font> <font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> put(tstrlist& s, <font CLASS=keytype>int</font> i, <font CLASS=keyword>const</font> string& str, X* obj) { s.put(i, str, obj); }
<font CLASS=keyword>friend</font> <font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> put(tstrlist& s, <font CLASS=keytype>int</font> i, X* obj) { s.put(i, obj); }
<font CLASS=keyword>friend</font> <font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> indexof(<font CLASS=keyword>const</font> tstrlist& s, X* obj) { <font CLASS=keyword>return</font> s.indexof(obj); }
<font CLASS=keyword>friend</font> <font CLASS=keyword>inline</font> X* get(<font CLASS=keyword>const</font> tstrlist& s, <font CLASS=keytype>int</font> i) { <font CLASS=keyword>return</font> (X*)s[i]; }
<font CLASS=preproc>#endif</font>
};
<font CLASS=keyword>template</font> <<font CLASS=keyword>class</font> X> <font CLASS=keytype>void</font> tstrlist<X>::dofreeobj(<font CLASS=keytype>void</font>* obj)
{
<font CLASS=keyword>delete</font> (X*)obj;
}
<font CLASS=keyword>template</font> <<font CLASS=keyword>class</font> X> tstrlist<X>::~tstrlist()
{
set_count(<font CLASS=integer>0</font>);
}
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// --- textmap -------------------------------------------------------- //</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// textmap is a list of string pairs (key/value)</font>
<font CLASS=keyword>struct</font> _textitem
{
string key;
string value;
_textitem(<font CLASS=keyword>const</font> string& ikey, <font CLASS=keyword>const</font> string& ivalue)
: key(ikey), value(ivalue) {}
};
<font CLASS=keyword>class</font> textmap: <font CLASS=keyword>protected</font> tobjlist<_textitem>
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
<font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> compare(<font CLASS=keyword>const</font> <font CLASS=keytype>void</font>* key, <font CLASS=keyword>const</font> <font CLASS=keytype>void</font>* item) <font CLASS=keyword>const</font>;
<font CLASS=keyword>const</font> string& dogetvalue(<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> doget(index)<font CLASS=symbols>-</font>>value; }
<font CLASS=keyword>const</font> string& dogetkey(<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> doget(index)<font CLASS=symbols>-</font>>key; }
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
textmap(<font CLASS=keytype>bool</font> casesens <font CLASS=symbols>=</font> <font CLASS=keyword>false</font>);
<font CLASS=keyword>virtual</font> ~textmap();
<font CLASS=keytype>int</font> get_count() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> tobjlist<_textitem>::get_count(); }
<font CLASS=keytype>void</font> pack() { tobjlist<_textitem>::pack(); }
<font CLASS=keytype>void</font> clear() { tobjlist<_textitem>::clear(); }
<font CLASS=keytype>int</font> put(<font CLASS=keyword>const</font> string& key, <font CLASS=keyword>const</font> string& value);
<font CLASS=keytype>void</font> del(<font CLASS=keytype>int</font> index) { idx(index); dodel(index); }
<font CLASS=keytype>void</font> del(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* key) { put(key, nullstring); }
<font CLASS=keyword>const</font> string& get(<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { idx(index); <font CLASS=keyword>return</font> dogetvalue(index); }
<font CLASS=keyword>const</font> string& getkey(<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { idx(index); <font CLASS=keyword>return</font> dogetkey(index); }
<font CLASS=keyword>const</font> string& get(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* key) <font CLASS=keyword>const</font>;
<font CLASS=keyword>const</font> string& <font CLASS=keyword>operator</font> [](<font CLASS=keytype>int</font> index) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> get(index); }
<font CLASS=keyword>const</font> string& <font CLASS=keyword>operator</font> [](<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* key) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> get(key); }
<font CLASS=keytype>int</font> indexof(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* key) <font CLASS=keyword>const</font>;
};
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// --- component ------------------------------------------------------ //</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// the component class is an abstract class that provides reference</font>
<font CLASS=comment>// counting and delete notification mechanisms. all stream classes</font>
<font CLASS=comment>// in ptypes are derived from component.</font>
<font CLASS=comment>// class ID's for all basic types: the first byte (least significant)</font>
<font CLASS=comment>// contains the base ID, the next is for the second level of inheritance,</font>
<font CLASS=comment>// etc. total of 4 levels allowed for basic types. call classid() for an</font>
<font CLASS=comment>// object, mask out first N bytes of interest and compare with a CLASS_XXX</font>
<font CLASS=comment>// value. f.ex. to determine whether an object is of type infile or any</font>
<font CLASS=comment>// derivative: (o->classid() & 0xffff) == CLASS2_INFILE. this scheme is for</font>
<font CLASS=comment>// internal use by PTypes and Objection; partly replaces the costly C++ RTTI</font>
<font CLASS=comment>// system.</font>
<font CLASS=comment>// first level of inheritance</font>
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> CLASS_UNDEFINED <font CLASS=symbols>=</font> 0x00000000;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> CLASS_INSTM <font CLASS=symbols>=</font> 0x00000001;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> CLASS_OUTSTM <font CLASS=symbols>=</font> 0x00000002;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> CLASS_UNIT <font CLASS=symbols>=</font> 0x00000003;
<font CLASS=comment>// second level of inheritance</font>
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> CLASS2_INFILE <font CLASS=symbols>=</font> 0x00000100 <font CLASS=symbols>|</font> CLASS_INSTM;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> CLASS2_INMEMORY <font CLASS=symbols>=</font> 0x00000200 <font CLASS=symbols>|</font> CLASS_INSTM;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> CLASS2_FDX <font CLASS=symbols>=</font> 0x00000300 <font CLASS=symbols>|</font> CLASS_INSTM;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> CLASS2_OUTFILE <font CLASS=symbols>=</font> 0x00000100 <font CLASS=symbols>|</font> CLASS_OUTSTM;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> CLASS2_OUTMEMORY <font CLASS=symbols>=</font> 0x00000200 <font CLASS=symbols>|</font> CLASS_OUTSTM;
<font CLASS=comment>// third level of inheritance</font>
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> CLASS3_LOGFILE <font CLASS=symbols>=</font> 0x00010000 <font CLASS=symbols>|</font> CLASS2_OUTFILE;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> CLASS3_IPSTM <font CLASS=symbols>=</font> 0x00020000 <font CLASS=symbols>|</font> CLASS2_FDX;
<font CLASS=keyword>const</font> <font CLASS=keytype>int</font> CLASS3_NPIPE <font CLASS=symbols>=</font> 0x00030000 <font CLASS=symbols>|</font> CLASS2_FDX;
<font CLASS=keyword>class</font> component: public unknown
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
<font CLASS=keytype>int</font> refcount; <font CLASS=comment>// reference counting, used by addref() and release()</font>
tobjlist<component>* freelist; <font CLASS=comment>// list of components to notify about destruction, safer alternative to ref-counting</font>
<font CLASS=keytype>void</font>* typeinfo; <font CLASS=comment>// reserved for future use</font>
<font CLASS=keyword>virtual</font> <font CLASS=keytype>void</font> freenotify(component* sender);
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
component();
<font CLASS=keyword>virtual</font> ~component();
<font CLASS=keytype>void</font> addnotification(component* obj);
<font CLASS=keytype>void</font> delnotification(component* obj);
<font CLASS=keyword>friend</font> component* addref(component*);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> release(component*);
<font CLASS=keyword>friend</font> <font CLASS=keytype>int</font> refcount(component* c);
<font CLASS=keyword>virtual</font> <font CLASS=keytype>int</font> classid();
<font CLASS=keytype>void</font> set_typeinfo(<font CLASS=keytype>void</font>* t) { typeinfo <font CLASS=symbols>=</font> t; }
<font CLASS=keytype>void</font>* get_typeinfo() { <font CLASS=keyword>return</font> typeinfo; }
};
<font CLASS=keyword>typedef</font> component* pcomponent;
<font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> refcount(component* c) { <font CLASS=keyword>return</font> c<font CLASS=symbols>-</font>>refcount; }
<font CLASS=keyword>template</font> <<font CLASS=keyword>class</font> T> <font CLASS=keyword>inline</font> T* taddref(T* c)
{ <font CLASS=keyword>return</font> (T*)addref((component*)c); }
<font CLASS=keyword>template</font> <<font CLASS=keyword>class</font> T> <font CLASS=keyword>class</font> compref
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
T* ref;
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
compref() { ref <font CLASS=symbols>=</font> <font CLASS=integer>0</font>; }
compref(<font CLASS=keyword>const</font> compref<T>& r) { ref <font CLASS=symbols>=</font> taddref<T>(r.ref); }
compref(T* c) { ref <font CLASS=symbols>=</font> taddref<T>(c); }
~compref() { release(ref); }
compref<T>& <font CLASS=keyword>operator</font> <font CLASS=symbols>=</font>(T* c);
compref<T>& <font CLASS=keyword>operator</font> <font CLASS=symbols>=</font>(<font CLASS=keyword>const</font> compref<T>& r) { <font CLASS=keyword>return</font> <font CLASS=keyword>operator</font> <font CLASS=symbols>=</font>(r.ref); }
T& <font CLASS=keyword>operator</font> *() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> *ref; }
T* <font CLASS=keyword>operator</font> <font CLASS=symbols>-</font>>() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> ref; }
<font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font> <font CLASS=symbols>==</font>(<font CLASS=keyword>const</font> compref<T>& r) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> ref <font CLASS=symbols>==</font> r.ref; }
<font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font> <font CLASS=symbols>==</font>(T* c) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> ref <font CLASS=symbols>==</font> c; }
<font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font> <font CLASS=symbols>!=</font>(<font CLASS=keyword>const</font> compref<T>& r) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> ref <font CLASS=symbols>!=</font> r.ref; }
<font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font> <font CLASS=symbols>!=</font>(T* c) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> ref <font CLASS=symbols>!=</font> c; }
<font CLASS=keyword>operator</font> T*() <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> ref; }
};
<font CLASS=keyword>template</font> <<font CLASS=keyword>class</font> T> compref<T>& compref<T>::<font CLASS=keyword>operator</font> <font CLASS=symbols>=</font>(T* c)
{
release(tpexchange<T>(&ref, taddref<T>(c)));
<font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>;
}
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// --- variant -------------------------------------------------------- //</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=keyword>enum</font> {
VAR_NULL,
VAR_INT,
VAR_BOOL,
VAR_FLOAT,
VAR_STRING,
VAR_ARRAY,
VAR_OBJECT,
VAR_COMPOUND <font CLASS=symbols>=</font> VAR_STRING
};
<font CLASS=keyword>class</font> _varray;
<font CLASS=keyword>class</font> variant
{
<font CLASS=keyword>friend</font> <font CLASS=keyword>class</font> string;
<font CLASS=keyword>friend</font> <font CLASS=keyword>class</font> _varray;
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
<font CLASS=keytype>int</font> tag; <font CLASS=comment>// VAR_XXX</font>
<font CLASS=keyword>union</font> {
large i; <font CLASS=comment>// 64-bit int value</font>
<font CLASS=keytype>bool</font> b; <font CLASS=comment>// bool value</font>
<font CLASS=keytype>double</font> f; <font CLASS=comment>// double value</font>
char* s; <font CLASS=comment>// string object; can't declare as string because of the union</font>
_varray* a; <font CLASS=comment>// pointer to a reference-counted _strlist object</font>
component* o; <font CLASS=comment>// pointer to a reference-counted component object (or derivative)</font>
} value; <font CLASS=comment>// we need this name to be able to copy the entire union in some situations</font>
<font CLASS=keytype>void</font> initialize() { tag <font CLASS=symbols>=</font> VAR_NULL; }
<font CLASS=keytype>void</font> initialize(large v) { tag <font CLASS=symbols>=</font> VAR_INT; value.i <font CLASS=symbols>=</font> v; }
<font CLASS=keytype>void</font> initialize(<font CLASS=keytype>bool</font> v) { tag <font CLASS=symbols>=</font> VAR_BOOL; value.b <font CLASS=symbols>=</font> v; }
<font CLASS=keytype>void</font> initialize(<font CLASS=keytype>double</font> v) { tag <font CLASS=symbols>=</font> VAR_FLOAT; value.f <font CLASS=symbols>=</font> v; }
<font CLASS=keytype>void</font> initialize(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* v) { tag <font CLASS=symbols>=</font> VAR_STRING; PTYPES_NAMESPACE::initialize(PTR_TO_STRING(value.s), v); }
<font CLASS=keytype>void</font> initialize(<font CLASS=keyword>const</font> string& v) { tag <font CLASS=symbols>=</font> VAR_STRING; PTYPES_NAMESPACE::initialize(PTR_TO_STRING(value.s), v); }
<font CLASS=keytype>void</font> initialize(_varray* a);
<font CLASS=keytype>void</font> initialize(component* o);
<font CLASS=keytype>void</font> initialize(<font CLASS=keyword>const</font> variant& v);
<font CLASS=keytype>void</font> finalize();
<font CLASS=keytype>void</font> assign(large);
<font CLASS=keytype>void</font> assign(<font CLASS=keytype>bool</font>);
<font CLASS=keytype>void</font> assign(<font CLASS=keytype>double</font>);
<font CLASS=keytype>void</font> assign(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>*);
<font CLASS=keytype>void</font> assign(<font CLASS=keyword>const</font> string&);
<font CLASS=keytype>void</font> assign(_varray*);
<font CLASS=keytype>void</font> assign(component*);
<font CLASS=keytype>void</font> assign(<font CLASS=keyword>const</font> variant&);
<font CLASS=keytype>bool</font> equal(<font CLASS=keyword>const</font> variant& v) <font CLASS=keyword>const</font>;
variant(_varray* a) { initialize(a); }
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
// construction
variant() { initialize(); }
variant(<font CLASS=keytype>int</font> v) { initialize(large(v)); }
variant(<font CLASS=keytype>unsigned</font> <font CLASS=keytype>int</font> v) { initialize(large(v)); }
variant(large v) { initialize(v); }
variant(<font CLASS=keytype>bool</font> v) { initialize(v); }
variant(<font CLASS=keytype>double</font> v) { initialize(v); }
variant(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* v) { initialize(v); }
variant(<font CLASS=keyword>const</font> string& v) { initialize(v); }
variant(component* v) { initialize(v); }
variant(<font CLASS=keyword>const</font> variant& v) { initialize(v); }
~variant() { finalize(); }
// assignment
variant& <font CLASS=keyword>operator</font><font CLASS=symbols>=</font> (<font CLASS=keytype>int</font> v) { assign(large(v)); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
variant& <font CLASS=keyword>operator</font><font CLASS=symbols>=</font> (<font CLASS=keytype>unsigned</font> <font CLASS=keytype>int</font> v) { assign(large(v)); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
variant& <font CLASS=keyword>operator</font><font CLASS=symbols>=</font> (large v) { assign(v); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
variant& <font CLASS=keyword>operator</font><font CLASS=symbols>=</font> (<font CLASS=keytype>bool</font> v) { assign(v); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
variant& <font CLASS=keyword>operator</font><font CLASS=symbols>=</font> (<font CLASS=keytype>double</font> v) { assign(v); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
variant& <font CLASS=keyword>operator</font><font CLASS=symbols>=</font> (<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* v) { assign(v); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
variant& <font CLASS=keyword>operator</font><font CLASS=symbols>=</font> (<font CLASS=keyword>const</font> string& v) { assign(v); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
variant& <font CLASS=keyword>operator</font><font CLASS=symbols>=</font> (component* v) { assign(v); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
variant& <font CLASS=keyword>operator</font><font CLASS=symbols>=</font> (<font CLASS=keyword>const</font> variant& v) { assign(v); <font CLASS=keyword>return</font> *<font CLASS=keyword>this</font>; }
// typecast
<font CLASS=keyword>operator</font> <font CLASS=keytype>int</font>() <font CLASS=keyword>const</font>;
<font CLASS=keyword>operator</font> <font CLASS=keytype>unsigned</font> <font CLASS=keytype>int</font>() <font CLASS=keyword>const</font>;
<font CLASS=keyword>operator</font> <font CLASS=keytype>long</font>() <font CLASS=keyword>const</font>;
<font CLASS=keyword>operator</font> <font CLASS=keytype>unsigned</font> <font CLASS=keytype>long</font>() <font CLASS=keyword>const</font>;
<font CLASS=keyword>operator</font> large() <font CLASS=keyword>const</font>;
<font CLASS=keyword>operator</font> <font CLASS=keytype>bool</font>() <font CLASS=keyword>const</font>;
<font CLASS=keyword>operator</font> <font CLASS=keytype>double</font>() <font CLASS=keyword>const</font>;
<font CLASS=keyword>operator</font> string() <font CLASS=keyword>const</font>;
<font CLASS=keyword>operator</font> component*() <font CLASS=keyword>const</font>;
// comparison
<font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>==</font> (<font CLASS=keyword>const</font> variant& v) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> equal(v); }
<font CLASS=keytype>bool</font> <font CLASS=keyword>operator</font><font CLASS=symbols>!=</font> (<font CLASS=keyword>const</font> variant& v) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> !equal(v); }
// typification
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> clear(variant&);
<font CLASS=keyword>friend</font> <font CLASS=keytype>int</font> vartype(<font CLASS=keyword>const</font> variant& v);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> isnull(<font CLASS=keyword>const</font> variant& v);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> isint(<font CLASS=keyword>const</font> variant& v);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> isbool(<font CLASS=keyword>const</font> variant& v);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> isfloat(<font CLASS=keyword>const</font> variant& v);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> isstring(<font CLASS=keyword>const</font> variant& v);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> isarray(<font CLASS=keyword>const</font> variant& v);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> isobject(<font CLASS=keyword>const</font> variant& v);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> iscompound(<font CLASS=keyword>const</font> variant& v);
// array manipulation
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> aclear(variant&);
<font CLASS=keyword>friend</font> variant aclone(<font CLASS=keyword>const</font> variant&);
<font CLASS=keyword>friend</font> <font CLASS=keyword>const</font> variant& get(<font CLASS=keyword>const</font> variant&, <font CLASS=keyword>const</font> string& key);
<font CLASS=keyword>friend</font> <font CLASS=keyword>const</font> variant& get(<font CLASS=keyword>const</font> variant&, large key);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> put(variant&, <font CLASS=keyword>const</font> string& key, <font CLASS=keyword>const</font> variant& item);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> put(variant&, large key, <font CLASS=keyword>const</font> variant& item);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> del(variant&, <font CLASS=keyword>const</font> string& key);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> del(variant&, large key);
// indexed access to arrays
<font CLASS=keyword>friend</font> <font CLASS=keytype>int</font> alength(<font CLASS=keyword>const</font> variant&);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> apack(variant&);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> anext(<font CLASS=keyword>const</font> variant& a, <font CLASS=keytype>int</font>&, variant& item);
<font CLASS=keyword>friend</font> <font CLASS=keytype>bool</font> anext(<font CLASS=keyword>const</font> variant& a, <font CLASS=keytype>int</font>&, variant& item, string& key);
<font CLASS=keyword>friend</font> <font CLASS=keytype>int</font> aadd(variant&, <font CLASS=keyword>const</font> variant& item);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> aput(variant&, <font CLASS=keytype>int</font> index, <font CLASS=keyword>const</font> variant& item);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> ains(variant&, <font CLASS=keytype>int</font> index, <font CLASS=keyword>const</font> variant& item);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> adel(variant&, <font CLASS=keytype>int</font> index);
<font CLASS=keyword>friend</font> <font CLASS=keyword>const</font> variant& aget(<font CLASS=keyword>const</font> variant&, <font CLASS=keytype>int</font> index);
<font CLASS=keyword>friend</font> string akey(<font CLASS=keyword>const</font> variant&, <font CLASS=keytype>int</font> index);
<font CLASS=keyword>const</font> variant& <font CLASS=keyword>operator</font>[](<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* key) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> get(*<font CLASS=keyword>this</font>, string(key)); }
<font CLASS=keyword>const</font> variant& <font CLASS=keyword>operator</font>[](<font CLASS=keyword>const</font> string& key) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> get(*<font CLASS=keyword>this</font>, key); }
<font CLASS=keyword>const</font> variant& <font CLASS=keyword>operator</font>[](large key) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> get(*<font CLASS=keyword>this</font>, key); }
// <font CLASS=sinquot>'manual'</font> initialization/finalization, undocumented. use with care<font CLASS=symbols>!</font>
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> initialize(variant& v);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> initialize(variant& v, large i);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> initialize(variant& v, <font CLASS=keytype>int</font> i);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> initialize(variant& v, <font CLASS=keytype>unsigned</font> <font CLASS=keytype>int</font> i);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> initialize(variant& v, <font CLASS=keytype>bool</font> i);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> initialize(variant& v, <font CLASS=keytype>double</font> i);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> initialize(variant& v, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* i);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> initialize(variant& v, <font CLASS=keyword>const</font> string& i);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> initialize(variant& v, component* i);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> initialize(variant& v, <font CLASS=keyword>const</font> variant& i);
<font CLASS=keyword>friend</font> <font CLASS=keytype>void</font> finalize(variant& v);
};
<font CLASS=keyword>typedef</font> variant* pvariant;
<font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> vartype(<font CLASS=keyword>const</font> variant& v) { <font CLASS=keyword>return</font> v.tag; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>bool</font> isnull(<font CLASS=keyword>const</font> variant& v) { <font CLASS=keyword>return</font> v.tag <font CLASS=symbols>==</font> VAR_NULL; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>bool</font> isint(<font CLASS=keyword>const</font> variant& v) { <font CLASS=keyword>return</font> v.tag <font CLASS=symbols>==</font> VAR_INT; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>bool</font> isbool(<font CLASS=keyword>const</font> variant& v) { <font CLASS=keyword>return</font> v.tag <font CLASS=symbols>==</font> VAR_BOOL; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>bool</font> isfloat(<font CLASS=keyword>const</font> variant& v) { <font CLASS=keyword>return</font> v.tag <font CLASS=symbols>==</font> VAR_FLOAT; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>bool</font> isstring(<font CLASS=keyword>const</font> variant& v) { <font CLASS=keyword>return</font> v.tag <font CLASS=symbols>==</font> VAR_STRING; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>bool</font> isarray(<font CLASS=keyword>const</font> variant& v) { <font CLASS=keyword>return</font> v.tag <font CLASS=symbols>==</font> VAR_ARRAY; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>bool</font> isobject(<font CLASS=keyword>const</font> variant& v) { <font CLASS=keyword>return</font> v.tag <font CLASS=symbols>==</font> VAR_OBJECT; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>bool</font> iscompound(<font CLASS=keyword>const</font> variant& v) { <font CLASS=keyword>return</font> v.tag ><font CLASS=symbols>=</font> VAR_COMPOUND; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> initialize(variant& v) { v.initialize(); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> initialize(variant& v, large i) { v.initialize(i); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> initialize(variant& v, <font CLASS=keytype>int</font> i) { v.initialize(large(i)); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> initialize(variant& v, <font CLASS=keytype>unsigned</font> <font CLASS=keytype>int</font> i) { v.initialize(large(i)); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> initialize(variant& v, <font CLASS=keytype>bool</font> i) { v.initialize(i); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> initialize(variant& v, <font CLASS=keytype>double</font> i) { v.initialize(i); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> initialize(variant& v, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* i) { v.initialize(i); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> initialize(variant& v, <font CLASS=keyword>const</font> string& i) { v.initialize(i); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> initialize(variant& v, component* i) { v.initialize(i); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> initialize(variant& v, <font CLASS=keyword>const</font> variant& i) { v.initialize(i); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> finalize(variant& v) { <font CLASS=keyword>if</font> (v.tag ><font CLASS=symbols>=</font> VAR_COMPOUND) v.finalize(); }
<font CLASS=keyword>extern</font> <font CLASS=keyword>const</font> variant nullvar;
<font CLASS=comment>// variant exception class; may be thrown when a variant</font>
<font CLASS=comment>// is being typecast'ed to 32-bit int and the value is</font>
<font CLASS=comment>// out of range</font>
<font CLASS=keyword>class</font> evariant: public exception
{
<font CLASS=preproc><font CLASS=keyword>protected</font>:</font>
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
evariant(<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* msg): exception(msg) {}
evariant(<font CLASS=keyword>const</font> string& msg): exception(msg) {}
<font CLASS=keyword>virtual</font> ~evariant();
};
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=comment>// --- pre-2.0 compatibility declarations ----------------------------- //</font>
<font CLASS=comment>// -------------------------------------------------------------------- //</font>
<font CLASS=preproc>#ifdef</font> PTYPES19_COMPAT
<font CLASS=comment>// ptypes-1.9 objlist and strlist: accept only 'unknown' and</font>
<font CLASS=comment>// derivatives as a base type</font>
<font CLASS=keyword>class</font> objlist: public tobjlist<unknown>
{
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
objlist(<font CLASS=keytype>bool</font> ownobjects <font CLASS=symbols>=</font> <font CLASS=keyword>false</font>);
<font CLASS=keyword>virtual</font> ~objlist();
};
<font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> length(<font CLASS=keyword>const</font> _objlist& s) { <font CLASS=keyword>return</font> s.get_count(); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> setlength(_objlist& s, <font CLASS=keytype>int</font> newcount) { s.set_count(newcount); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> pack(_objlist& s) { s.pack(); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> clear(_objlist& s) { s.clear(); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> push(_objlist& s, unknown* obj) { s.add(obj); <font CLASS=keyword>return</font> length(s) <font CLASS=symbols>-</font> <font CLASS=integer>1</font>; }
<font CLASS=keyword>inline</font> unknown* top(<font CLASS=keyword>const</font> _objlist& s) { <font CLASS=keyword>return</font> (unknown*)s.top(); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> ins(_objlist& s, <font CLASS=keytype>int</font> i, unknown* obj) { s.ins(i, obj); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> add(_objlist& s, unknown* obj) { s.add(obj); <font CLASS=keyword>return</font> length(s) <font CLASS=symbols>-</font> <font CLASS=integer>1</font>; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> put(_objlist& s, <font CLASS=keytype>int</font> i, unknown* obj) { s.put(i, obj); }
<font CLASS=keyword>inline</font> unknown* get(<font CLASS=keyword>const</font> _objlist& s, <font CLASS=keytype>int</font> i) { <font CLASS=keyword>return</font> (unknown*)s[i]; }
<font CLASS=keyword>inline</font> unknown* pop(_objlist& s) { <font CLASS=keyword>return</font> (unknown*)s.pop(); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> del(_objlist& s, <font CLASS=keytype>int</font> i) { s.del(i); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> indexof(<font CLASS=keyword>const</font> _objlist& s, unknown* obj) { <font CLASS=keyword>return</font> s.indexof(obj); }
<font CLASS=keyword>class</font> strlist: public tstrlist<unknown>
{
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
strlist(<font CLASS=keytype>int</font> flags <font CLASS=symbols>=</font> <font CLASS=integer>0</font>);
<font CLASS=keyword>virtual</font> ~strlist();
};
<font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> length(<font CLASS=keyword>const</font> _strlist& s) { <font CLASS=keyword>return</font> s.get_count(); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> clear(_strlist& s) { s.clear(); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> pack(_strlist& s) { s.pack(); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>bool</font> search(<font CLASS=keyword>const</font> _strlist& s, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* key, <font CLASS=keytype>int</font>& i) { <font CLASS=keyword>return</font> s.search(key, i); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> ins(_strlist& s, <font CLASS=keytype>int</font> i, <font CLASS=keyword>const</font> string& key, unknown* obj) { s.ins(i, key, obj); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> add(_strlist& s, <font CLASS=keyword>const</font> string& key, unknown* obj) { <font CLASS=keyword>return</font> s.add(key, obj); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> put(_strlist& s, <font CLASS=keytype>int</font> i, <font CLASS=keyword>const</font> string& key, unknown* obj) { s.put(i, key, obj); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> put(_strlist& s, <font CLASS=keytype>int</font> i, unknown* obj) { s.put(i, obj); }
<font CLASS=keyword>inline</font> unknown* get(<font CLASS=keyword>const</font> _strlist& s, <font CLASS=keytype>int</font> i) { <font CLASS=keyword>return</font> (unknown*)s[i]; }
<font CLASS=keyword>inline</font> <font CLASS=keyword>const</font> string& getstr(<font CLASS=keyword>const</font> _strlist& s, <font CLASS=keytype>int</font> i) { <font CLASS=keyword>return</font> s.getkey(i); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> del(_strlist& s, <font CLASS=keytype>int</font> i) { s.del(i); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> find(<font CLASS=keyword>const</font> _strlist& s, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* key) { <font CLASS=keyword>return</font> s.indexof(key); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> indexof(<font CLASS=keyword>const</font> _strlist& s, unknown* obj) { <font CLASS=keyword>return</font> s.indexof(obj); }
<font CLASS=comment>// ptypes-1.9 strmap: now replaced with _strlist(SL_SORTED)</font>
<font CLASS=keyword>class</font> strmap: public tstrlist<unknown>
{
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
strmap(<font CLASS=keytype>int</font> flags <font CLASS=symbols>=</font> <font CLASS=integer>0</font>);
<font CLASS=keyword>virtual</font> ~strmap();
};
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> put(strmap& m, <font CLASS=keyword>const</font> string& key, unknown* obj) { m.put(key, obj); }
<font CLASS=keyword>inline</font> unknown* get(<font CLASS=keyword>const</font> strmap& m, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* key) { <font CLASS=keyword>return</font> m[key]; }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> del(strmap& m, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* key) { m.del(key); }
<font CLASS=keyword>template</font> <<font CLASS=keyword>class</font> X> <font CLASS=keyword>class</font> tstrmap: <font CLASS=keyword>public</font> strmap
{
<font CLASS=preproc><font CLASS=keyword>public</font>:</font>
tstrmap(): strmap() {}
tstrmap(<font CLASS=keytype>int</font> iflags): strmap(iflags) {}
<font CLASS=keyword>friend</font> <font CLASS=keyword>inline</font> X* get(<font CLASS=keyword>const</font> tstrmap& m, <font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* str) { <font CLASS=keyword>return</font> (X*)PTYPES_NAMESPACE::get((<font CLASS=keyword>const</font> strmap&)m, str); }
<font CLASS=keyword>friend</font> <font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> put(tstrmap& m, <font CLASS=keyword>const</font> string& str, X* obj) { unknown* t <font CLASS=symbols>=</font> obj; PTYPES_NAMESPACE::put(m, str, t); }
X* <font CLASS=keyword>operator</font>[] (<font CLASS=keyword>const</font> <font CLASS=keytype>char</font>* str) <font CLASS=keyword>const</font> { <font CLASS=keyword>return</font> (X*)PTYPES_NAMESPACE::get(*<font CLASS=keyword>this</font>, str); }
};
<font CLASS=comment>// ptypes-1.9 textmap interface</font>
<font CLASS=keyword>inline</font> <font CLASS=keytype>int</font> length(<font CLASS=keyword>const</font> textmap& m) { <font CLASS=keyword>return</font> m.get_count(); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> clear(textmap& m) { m.clear(); }
<font CLASS=keyword>inline</font> <font CLASS=keyword>const</font> string& get(<font CLASS=keyword>const</font> textmap& m, <font CLASS=keyword>const</font> string& k) { <font CLASS=keyword>return</font> m.get(k); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> put(textmap& m, <font CLASS=keyword>const</font> string& k, <font CLASS=keyword>const</font> string& v) { m.put(k, v); }
<font CLASS=keyword>inline</font> <font CLASS=keytype>void</font> del(textmap& m, <font CLASS=keyword>const</font> string& k) { m.del(k); }
<font CLASS=preproc>#endif</font> <font CLASS=comment>// PTYPES19_COMPAT </font>
<font CLASS=preproc>#ifdef</font> _MSC_VER
<font CLASS=preproc>#pragma</font> warning(pop)
<font CLASS=preproc>#pragma</font> pack(pop)
<font CLASS=preproc>#endif</font>
PTYPES_END
<font CLASS=preproc>#endif</font> <font CLASS=comment>// __PTYPES_H__ </font>
</pre>
</div>
<hr noshade></body>
</html>