📄 ptypes.h.html
字号:
~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();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -