Paradiseo-eo sources added
git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@40 331e1502-861f-0410-8da2-ba01fb791d7f
This commit is contained in:
parent
bc1f453978
commit
c3aec878e5
3609 changed files with 342772 additions and 0 deletions
862
trunk/paradiseo-eo/doc/html/parse__tree_8h-source.html
Normal file
862
trunk/paradiseo-eo/doc/html/parse__tree_8h-source.html
Normal file
|
|
@ -0,0 +1,862 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
|
||||
<title>EO: parse_tree.h Source File</title>
|
||||
<link href="doxygen.css" rel="stylesheet" type="text/css">
|
||||
</head><body>
|
||||
<!-- Generated by Doxygen 1.3.9.1 -->
|
||||
<div class="qindex"> <form class="search" action="search.php" method="get">
|
||||
<a class="qindex" href="main.html">Main Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="pages.html">Related Pages</a> | <span class="search"><u>S</u>earch for <input class="search" type="text" name="query" value="" size="20" accesskey="s"/></span></form></div>
|
||||
<div class="nav">
|
||||
<a class="el" href="dir_000000.html">src</a> / <a class="el" href="dir_000017.html">gp</a></div>
|
||||
<h1>parse_tree.h</h1><div class="fragment"><pre class="fragment">00001 <span class="preprocessor">#ifndef PARSE_TREE_HH</span>
|
||||
00002 <span class="preprocessor"></span><span class="preprocessor">#define PARSE_TREE_HH</span>
|
||||
00003 <span class="preprocessor"></span>
|
||||
00155 <span class="preprocessor">#include <vector></span>
|
||||
00156 <span class="preprocessor">#include <utility></span> <span class="comment">// for swap</span>
|
||||
00157
|
||||
00158 <span class="preprocessor">#ifdef _MSC_VER</span>
|
||||
00159 <span class="preprocessor"></span><span class="preprocessor">#pragma warning(disable : 4786) // disable this nagging warning about the limitations of the mirkosoft debugger</span>
|
||||
00160 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
|
||||
00161 <span class="preprocessor"></span>
|
||||
<a name="l00162"></a><a class="code" href="namespacegp__parse__tree.html">00162</a> <span class="keyword">namespace </span>gp_parse_tree
|
||||
00163 {
|
||||
00164
|
||||
00165 <span class="preprocessor">#include "node_pool.h"</span>
|
||||
00166
|
||||
00168 <span class="keyword">template</span> <<span class="keyword">class</span> T>
|
||||
00169 <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="namespacegp__parse__tree.html#a0">do_the_swap</a>(T& a, T& b)
|
||||
00170 {
|
||||
00171 T tmp = a;
|
||||
00172 a = b;
|
||||
00173 b = tmp;
|
||||
00174 }
|
||||
00175
|
||||
00176 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="keyword">class </span>parse_tree
|
||||
00177 {
|
||||
00178 <span class="keyword">public</span> :
|
||||
00179
|
||||
00180
|
||||
00181 <span class="keyword">class </span>subtree
|
||||
00182 {
|
||||
00183
|
||||
00184 <span class="comment">/*</span>
|
||||
<a name="l00185"></a><a class="code" href="classgp__parse__tree_1_1_mem_pool.html">00185</a> <span class="comment"> a bit nasty way to use a pool allocator (which would otherwise use slooow new and delete)</span>
|
||||
00186 <span class="comment"> TODO: use the std::allocator interface</span>
|
||||
00187 <span class="comment">*/</span>
|
||||
00188
|
||||
00189 <span class="preprocessor">#if (defined(__GNUC__) || defined(_MSC_VER)) && !(defined(_MT) || defined(MACOSX) || defined(__APPLE__)) // not multithreaded (or MACOSX - J. Eggermont)</span>
|
||||
00190 <span class="preprocessor"></span> Node_alloc<T> node_allocator;
|
||||
00191 Tree_alloc<subtree> tree_allocator;
|
||||
00192 <span class="preprocessor">#else</span>
|
||||
00193 <span class="preprocessor"></span> Standard_Node_alloc<T> node_allocator;
|
||||
00194 Standard_alloc<subtree> tree_allocator;
|
||||
00195 <span class="preprocessor">#endif</span>
|
||||
00196 <span class="preprocessor"></span>
|
||||
00197 <span class="keyword">public</span> :
|
||||
00198
|
||||
00199 <span class="keyword">typedef</span> subtree* iterator;
|
||||
00200 <span class="keyword">typedef</span> <span class="keyword">const</span> subtree* const_iterator;
|
||||
00201
|
||||
00202 <span class="comment">/* Constructors, assignments */</span>
|
||||
00203
|
||||
00204 subtree(<span class="keywordtype">void</span>) : content(node_allocator.allocate()), args(0), parent(0), _cumulative_size(0), _depth(0), _size(1)
|
||||
00205 {}
|
||||
00206 subtree(<span class="keyword">const</span> subtree& s)
|
||||
00207 : content(node_allocator.allocate()),
|
||||
00208 args(0),
|
||||
00209 parent(0),
|
||||
00210 _cumulative_size(1),
|
||||
00211 _depth(1),
|
||||
00212 _size(1)
|
||||
00213 {
|
||||
00214 copy(s);
|
||||
00215 }
|
||||
00216
|
||||
00217 subtree(<span class="keyword">const</span> T& t) : content(node_allocator.allocate()), args(0), parent(0), _cumulative_size(0), _depth(0), _size(1)
|
||||
00218 { copy(t); }
|
||||
00219
|
||||
00220 <span class="keyword">template</span> <<span class="keyword">class</span> It>
|
||||
00221 subtree(It b, It e) : content(node_allocator.allocate()), args(0), parent(0), _cumulative_size(0), _depth(0), _size(1)
|
||||
00222 { <span class="comment">// initialize in prefix order for efficiency reasons</span>
|
||||
00223 init(b, --e);
|
||||
00224 }
|
||||
00225
|
||||
00226 <span class="keyword">virtual</span> ~subtree(<span class="keywordtype">void</span>) { tree_allocator.deallocate(args, arity()); node_allocator.deallocate(content); }
|
||||
00227
|
||||
00228 subtree& operator=(<span class="keyword">const</span> subtree& s)
|
||||
00229 {
|
||||
00230 <span class="keywordflow">if</span> (s.get_root() == get_root())
|
||||
00231 { <span class="comment">// from the same tree, maybe a child. Don't take any chances</span>
|
||||
00232 subtree anotherS = s;
|
||||
00233 <span class="keywordflow">return</span> copy(anotherS);
|
||||
00234 }
|
||||
00235
|
||||
00236 copy(s);
|
||||
00237 updateAfterInsert();
|
||||
00238 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
|
||||
00239 }
|
||||
00240
|
||||
00241 subtree& operator=(<span class="keyword">const</span> T& t) { copy(t); updateAfterInsert(); <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
|
||||
00242
|
||||
00243 <span class="comment">/* Access to the nodes */</span>
|
||||
00244
|
||||
00245 T& operator*(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> *content; }
|
||||
00246 <span class="keyword">const</span> T& operator*(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *content; }
|
||||
00247 T* operator->(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> content; }
|
||||
00248 <span class="keyword">const</span> T* operator->(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> content; }
|
||||
00249
|
||||
00250 <span class="comment">/* Equality, inequality check, Node needs to implement operator== */</span>
|
||||
00251
|
||||
00252 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> subtree& other)<span class="keyword"> const</span>
|
||||
00253 <span class="keyword"> </span>{
|
||||
00254 <span class="keywordflow">if</span> (! (*content == *other.content))
|
||||
00255 <span class="keywordflow">return</span> <span class="keyword">false</span>;
|
||||
00256
|
||||
00257 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < arity(); i++)
|
||||
00258 {
|
||||
00259 <span class="keywordflow">if</span> (!(args[i] == other.args[i]))
|
||||
00260 <span class="keywordflow">return</span> <span class="keyword">false</span>;
|
||||
00261 }
|
||||
00262
|
||||
00263 <span class="keywordflow">return</span> <span class="keyword">true</span>;
|
||||
00264 }
|
||||
00265
|
||||
00266 <span class="keywordtype">bool</span> operator !=(<span class="keyword">const</span> subtree& other)<span class="keyword"> const</span>
|
||||
00267 <span class="keyword"> </span>{
|
||||
00268 <span class="keywordflow">return</span> !operator==(other);
|
||||
00269 }
|
||||
00270
|
||||
00271 <span class="comment">/* Arity */</span>
|
||||
00272 <span class="keywordtype">int</span> arity(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> content->arity(); }
|
||||
00273
|
||||
00274 <span class="comment">/* Evaluation with an increasing amount of user defined arguments */</span>
|
||||
00275 <span class="keyword">template</span> <<span class="keyword">class</span> RetVal>
|
||||
00276 <span class="keywordtype">void</span> apply(RetVal& v)<span class="keyword"> const </span>{ (*content)(v, begin()); }
|
||||
00277
|
||||
00278 <span class="keyword">template</span> <<span class="keyword">class</span> RetVal, <span class="keyword">class</span> It>
|
||||
00279 <span class="keywordtype">void</span> apply(RetVal& v, It values)<span class="keyword"> const</span>
|
||||
00280 <span class="keyword"> </span>{
|
||||
00281 (*content)(v, begin(), values);
|
||||
00282 }
|
||||
00283
|
||||
00284 <span class="keyword">template</span> <<span class="keyword">class</span> RetVal, <span class="keyword">class</span> It>
|
||||
00285 <span class="keywordtype">void</span> apply_mem_func(RetVal& v, It misc, <span class="keywordtype">void</span> (T::* f)(RetVal&, <span class="keyword">typename</span> subtree::iterator, It))
|
||||
00286 {
|
||||
00287 (content->*f)(v, begin(), misc);
|
||||
00288 }
|
||||
00289
|
||||
00290
|
||||
00291 <span class="comment">/* template <class RetVal, class It, class It2></span>
|
||||
00292 <span class="comment"> void apply(RetVal& v, It values, It2 moreValues) const</span>
|
||||
00293 <span class="comment"> { (*content)(v, begin(), values, moreValues); }</span>
|
||||
00294 <span class="comment"></span>
|
||||
00295 <span class="comment"> template <class RetVal, class It, class It2, class It3></span>
|
||||
00296 <span class="comment"> void apply(RetVal& v, It values, It2 moreValues, It3 evenMoreValues) const</span>
|
||||
00297 <span class="comment"> { (*content)(v, begin(), values, moreValues, evenMoreValues); }</span>
|
||||
00298 <span class="comment">*/</span>
|
||||
00299
|
||||
00300 <span class="keyword">template</span> <<span class="keyword">class</span> Pred>
|
||||
00301 <span class="keywordtype">void</span> find_nodes(std::vector<subtree*>& result, Pred& p)
|
||||
00302 {
|
||||
00303 <span class="keywordflow">if</span> (p(*content))
|
||||
00304 {
|
||||
00305 result.push_back(<span class="keyword">this</span>);
|
||||
00306 }
|
||||
00307
|
||||
00308 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < arity(); ++i)
|
||||
00309 {
|
||||
00310 args[i].find_nodes(result, p);
|
||||
00311 }
|
||||
00312 }
|
||||
00313
|
||||
00314 <span class="keyword">template</span> <<span class="keyword">class</span> Pred>
|
||||
00315 <span class="keywordtype">void</span> find_nodes(std::vector<const subtree*>& result, Pred& p)<span class="keyword"> const</span>
|
||||
00316 <span class="keyword"> </span>{
|
||||
00317 <span class="keywordflow">if</span> (p(*content))
|
||||
00318 {
|
||||
00319 result.push_back(<span class="keyword">this</span>);
|
||||
00320 }
|
||||
00321
|
||||
00322 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < arity(); ++i)
|
||||
00323 {
|
||||
00324 args[i].find_nodes(result, p);
|
||||
00325 }
|
||||
00326 }
|
||||
00327
|
||||
00328 <span class="comment">/* Iterators */</span>
|
||||
00329
|
||||
00330 iterator begin(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> args; }
|
||||
00331 const_iterator begin(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> args; }
|
||||
00332
|
||||
00333 iterator end(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> args + arity(); }
|
||||
00334 const_iterator end(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> args + arity(); }
|
||||
00335
|
||||
00336 subtree& operator[](<span class="keywordtype">int</span> i) { <span class="keywordflow">return</span> *(begin() + i); }
|
||||
00337 <span class="keyword">const</span> subtree& operator[](<span class="keywordtype">int</span> i)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *(begin() + i); }
|
||||
00338
|
||||
00339 <span class="comment">/* Some statistics */</span>
|
||||
00340
|
||||
00341 size_t size(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _size; }
|
||||
00342
|
||||
00343 size_t cumulative_size(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _cumulative_size; }
|
||||
00344 size_t depth(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _depth; }
|
||||
00345
|
||||
00346 <span class="keyword">const</span> subtree& select_cumulative(size_t which)<span class="keyword"> const</span>
|
||||
00347 <span class="keyword"> </span>{ <span class="keywordflow">return</span> imp_select_cumulative(which); }
|
||||
00348
|
||||
00349 subtree& select_cumulative(size_t which)
|
||||
00350 { <span class="keywordflow">return</span> const_cast<subtree&>(imp_select_cumulative(which)); }
|
||||
00351
|
||||
00352 subtree& get_node(size_t which)
|
||||
00353 { <span class="keywordflow">return</span> const_cast<subtree&>(imp_get_node(which));}
|
||||
00354 <span class="keyword">const</span> subtree& get_node(size_t which)<span class="keyword"> const</span>
|
||||
00355 <span class="keyword"> </span>{ <span class="keywordflow">return</span> imp_get_node(which); }
|
||||
00356
|
||||
00357 subtree* get_parent(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> parent; }
|
||||
00358 <span class="keyword">const</span> subtree* get_parent(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> parent; }
|
||||
00359
|
||||
00360 <span class="keywordtype">void</span> clear(<span class="keywordtype">void</span>)
|
||||
00361 { tree_allocator.deallocate(args, arity()); args = 0; *content = T(); parent = 0; _cumulative_size = 0; _depth = 0; _size = 0; }
|
||||
00362
|
||||
00363 <span class="keywordtype">void</span> swap(subtree& y)
|
||||
00364 {
|
||||
00365 <a class="code" href="namespacegp__parse__tree.html#a0">do_the_swap</a>(content, y.content);
|
||||
00366 <a class="code" href="namespacegp__parse__tree.html#a0">do_the_swap</a>(args, y.args);
|
||||
00367
|
||||
00368 adopt();
|
||||
00369 y.adopt();
|
||||
00370
|
||||
00371 <a class="code" href="namespacegp__parse__tree.html#a0">do_the_swap</a>(parent, y.parent);
|
||||
00372
|
||||
00373 <a class="code" href="namespacegp__parse__tree.html#a0">do_the_swap</a>(_cumulative_size, y._cumulative_size);
|
||||
00374 <a class="code" href="namespacegp__parse__tree.html#a0">do_the_swap</a>(_depth, y._depth);
|
||||
00375 <a class="code" href="namespacegp__parse__tree.html#a0">do_the_swap</a>(_size, y._size);
|
||||
00376 updateAfterInsert();
|
||||
00377 }
|
||||
00378
|
||||
00379 <span class="keyword">protected</span> :
|
||||
00380
|
||||
00381 <span class="keyword">virtual</span> <span class="keywordtype">void</span> updateAfterInsert(<span class="keywordtype">void</span>)
|
||||
00382 {
|
||||
00383 _depth = 0;
|
||||
00384 _size = 1;
|
||||
00385 _cumulative_size = 0;
|
||||
00386
|
||||
00387 <span class="keywordflow">for</span> (iterator it = begin(); it != end(); ++it)
|
||||
00388 {
|
||||
00389 _size += it->size();
|
||||
00390 _cumulative_size += it->_cumulative_size;
|
||||
00391 _depth = it->_depth > _depth? it->_depth: _depth;
|
||||
00392 }
|
||||
00393 _cumulative_size += _size;
|
||||
00394 _depth++;
|
||||
00395
|
||||
00396 <span class="keywordflow">if</span> (parent)
|
||||
00397 parent->updateAfterInsert();
|
||||
00398 }
|
||||
00399
|
||||
00400 <span class="keyword">private</span> :
|
||||
00401
|
||||
00402 <span class="keyword">const</span> subtree& imp_select_cumulative(size_t which)<span class="keyword"> const</span>
|
||||
00403 <span class="keyword"> </span>{
|
||||
00404 <span class="keywordflow">if</span> (which >= (_cumulative_size - size()))
|
||||
00405 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
|
||||
00406 <span class="comment">// else</span>
|
||||
00407
|
||||
00408 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = arity() - 1; i >= 0; --i)
|
||||
00409 {
|
||||
00410 <span class="keywordflow">if</span> (which < args[i]._cumulative_size)
|
||||
00411 <span class="keywordflow">return</span> args[i].imp_select_cumulative(which);
|
||||
00412 which -= args[i]._cumulative_size;
|
||||
00413 }
|
||||
00414
|
||||
00415 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <span class="comment">// error!</span>
|
||||
00416 }
|
||||
00417
|
||||
00418 <span class="keyword">const</span> subtree& imp_get_node(size_t which)<span class="keyword"> const</span>
|
||||
00419 <span class="keyword"> </span>{
|
||||
00420 <span class="keywordflow">if</span> (which == size() - 1)
|
||||
00421 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
|
||||
00422
|
||||
00423 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = arity() - 1; i >= 0; --i)
|
||||
00424 {
|
||||
00425 <span class="keywordtype">unsigned</span> c_size = args[i].size();
|
||||
00426 <span class="keywordflow">if</span> (which < c_size)
|
||||
00427 <span class="keywordflow">return</span> args[i].imp_get_node(which);
|
||||
00428 which -= c_size;
|
||||
00429 }
|
||||
00430
|
||||
00431 <span class="keywordflow">return</span> *<span class="keyword">this</span>; <span class="comment">// error!</span>
|
||||
00432 }
|
||||
00433
|
||||
00434 <span class="keyword">const</span> subtree* get_root(<span class="keywordtype">void</span>)<span class="keyword"> const</span>
|
||||
00435 <span class="keyword"> </span>{
|
||||
00436 <span class="keywordflow">if</span> (parent == 0)
|
||||
00437 <span class="keywordflow">return</span> <span class="keyword">this</span>;
|
||||
00438 <span class="comment">// else</span>
|
||||
00439
|
||||
00440 <span class="keywordflow">return</span> parent->get_root();
|
||||
00441 }
|
||||
00442 subtree& copy(<span class="keyword">const</span> subtree& s)
|
||||
00443 {
|
||||
00444 <span class="keywordtype">int</span> old_arity = arity();
|
||||
00445
|
||||
00446 <span class="keywordtype">int</span> new_arity = s.arity();
|
||||
00447
|
||||
00448 <span class="keywordflow">if</span> (new_arity != old_arity)
|
||||
00449 {
|
||||
00450 tree_allocator.deallocate(args, old_arity);
|
||||
00451
|
||||
00452 args = tree_allocator.allocate(new_arity);
|
||||
00453 }
|
||||
00454
|
||||
00455 <span class="keywordflow">switch</span>(new_arity)
|
||||
00456 {
|
||||
00457 <span class="keywordflow">case</span> 3 : args[2].copy(s.args[2]); args[2].parent = <span class="keyword">this</span>; <span class="comment">// no break!</span>
|
||||
00458 <span class="keywordflow">case</span> 2 : args[1].copy(s.args[1]); args[1].parent = <span class="keyword">this</span>;
|
||||
00459 <span class="keywordflow">case</span> 1 : args[0].copy(s.args[0]); args[0].parent = <span class="keyword">this</span>;
|
||||
00460 <span class="keywordflow">case</span> 0 : <span class="keywordflow">break</span>;
|
||||
00461 <span class="keywordflow">default</span> :
|
||||
00462 {
|
||||
00463 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < new_arity; ++i)
|
||||
00464 {
|
||||
00465 args[i].copy(s.args[i]);
|
||||
00466 args[i].parent = <span class="keyword">this</span>;
|
||||
00467 }
|
||||
00468 }
|
||||
00469 }
|
||||
00470
|
||||
00471 *content = *s.content;
|
||||
00472 _size = s._size;
|
||||
00473 _depth = s._depth;
|
||||
00474 _cumulative_size = s._cumulative_size;
|
||||
00475
|
||||
00476 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
|
||||
00477 }
|
||||
00478
|
||||
00479 subtree& copy(<span class="keyword">const</span> T& t)
|
||||
00480 {
|
||||
<a name="l00481"></a><a class="code" href="namespacegp__parse__tree.html#a0">00481</a> <span class="keywordtype">int</span> oldArity = arity();
|
||||
00482
|
||||
00483 <span class="keywordflow">if</span> (content != &t)
|
||||
00484 *content = t;
|
||||
00485 <span class="keywordflow">else</span>
|
||||
00486 oldArity = -1;
|
||||
00487
|
||||
00488 <span class="keywordtype">int</span> ar = arity();
|
||||
00489
|
||||
00490 <span class="keywordflow">if</span> (ar != oldArity)
|
||||
00491 {
|
||||
00492 <span class="keywordflow">if</span> (oldArity != -1)
|
||||
00493 tree_allocator.deallocate(args, oldArity);
|
||||
00494
|
||||
00495 args = tree_allocator.allocate(ar);
|
||||
00496
|
||||
00497 <span class="comment">//if (ar > 0)</span>
|
||||
00498 <span class="comment">// args = new subtree [ar];</span>
|
||||
00499 <span class="comment">//else</span>
|
||||
00500 <span class="comment">// args = 0;</span>
|
||||
00501 }
|
||||
00502
|
||||
00503 adopt();
|
||||
00504 updateAfterInsert();
|
||||
00505 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
|
||||
00506 }
|
||||
00507
|
||||
00508 <span class="keywordtype">void</span> disown(<span class="keywordtype">void</span>)
|
||||
00509 {
|
||||
00510 <span class="keywordflow">switch</span>(arity())
|
||||
00511 {
|
||||
00512 <span class="keywordflow">case</span> 3 : args[2].parent = 0; <span class="comment">// no break!</span>
|
||||
00513 <span class="keywordflow">case</span> 2 : args[1].parent = 0;
|
||||
00514 <span class="keywordflow">case</span> 1 : args[0].parent = 0; <span class="keywordflow">break</span>;
|
||||
00515 <span class="keywordflow">case</span> 0 : <span class="keywordflow">break</span>;
|
||||
00516 <span class="keywordflow">default</span> :
|
||||
00517 {
|
||||
00518 <span class="keywordflow">for</span> (iterator it = begin(); it != end(); ++it)
|
||||
00519 {
|
||||
00520 it->parent = 0;
|
||||
00521 }
|
||||
00522 }
|
||||
00523 }
|
||||
00524
|
||||
00525 }
|
||||
00526
|
||||
00527 <span class="keywordtype">void</span> adopt(<span class="keywordtype">void</span>)
|
||||
00528 {
|
||||
00529 <span class="keywordflow">switch</span>(arity())
|
||||
00530 {
|
||||
00531 <span class="keywordflow">case</span> 3 : args[2].parent = <span class="keyword">this</span>; <span class="comment">// no break!</span>
|
||||
00532 <span class="keywordflow">case</span> 2 : args[1].parent = <span class="keyword">this</span>;
|
||||
00533 <span class="keywordflow">case</span> 1 : args[0].parent = <span class="keyword">this</span>; <span class="keywordflow">break</span>;
|
||||
00534 <span class="keywordflow">case</span> 0 : <span class="keywordflow">break</span>;
|
||||
00535 <span class="keywordflow">default</span> :
|
||||
00536 {
|
||||
00537 <span class="keywordflow">for</span> (iterator it = begin(); it != end(); ++it)
|
||||
00538 {
|
||||
00539 it->parent = <span class="keyword">this</span>;
|
||||
00540 }
|
||||
00541 }
|
||||
00542 }
|
||||
00543 }
|
||||
00544
|
||||
00545 <span class="keyword">template</span> <<span class="keyword">class</span> It>
|
||||
00546 <span class="keywordtype">void</span> init(It b, It& last)
|
||||
00547 {
|
||||
00548 *<span class="keyword">this</span> = *last;
|
||||
00549
|
||||
00550 <span class="preprocessor">#ifndef NDEBUG</span>
|
||||
00551 <span class="preprocessor"></span> <span class="keywordflow">if</span> (last == b && arity() > 0)
|
||||
00552 {
|
||||
00553 <span class="keywordflow">throw</span> <span class="stringliteral">"subtree::init()"</span>;
|
||||
00554 }
|
||||
00555 <span class="preprocessor">#endif</span>
|
||||
00556 <span class="preprocessor"></span>
|
||||
00557 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < arity(); ++i)
|
||||
00558 {
|
||||
00559 args[i].parent = 0;
|
||||
00560 args[i].init(b, --last);
|
||||
00561 args[i].parent = <span class="keyword">this</span>;
|
||||
00562 }
|
||||
00563
|
||||
00564 updateAfterInsert();
|
||||
00565 }
|
||||
00566
|
||||
00567 T* content;
|
||||
00568 subtree* args;
|
||||
00569 subtree* parent;
|
||||
00570
|
||||
00571 size_t _cumulative_size;
|
||||
00572 size_t _depth;
|
||||
00573 size_t _size;
|
||||
00574 };
|
||||
00575
|
||||
00576 <span class="comment">// Continuing with parse_tree</span>
|
||||
00577
|
||||
00578 <span class="keyword">typedef</span> T value_type;
|
||||
00579
|
||||
00580 <span class="comment">/* Constructors and Assignments */</span>
|
||||
00581
|
||||
00582 parse_tree(<span class="keywordtype">void</span>) : _root(), pushed() {}
|
||||
00583 parse_tree(<span class="keyword">const</span> parse_tree& org) : _root(org._root), pushed(org.pushed) { }
|
||||
00584 parse_tree(<span class="keyword">const</span> subtree& sub) : _root(sub), pushed() { }
|
||||
00585
|
||||
00586 <span class="keyword">template</span> <<span class="keyword">class</span> It>
|
||||
00587 parse_tree(It b, It e) : _root(b, e), pushed() {}
|
||||
00588
|
||||
00589 <span class="keyword">virtual</span> ~parse_tree(<span class="keywordtype">void</span>) {}
|
||||
00590
|
||||
00591 parse_tree& operator=(<span class="keyword">const</span> parse_tree& org) { <span class="keywordflow">return</span> copy(org); }
|
||||
00592 parse_tree& operator=(<span class="keyword">const</span> subtree& sub)
|
||||
00593 { <span class="keywordflow">return</span> copy(sub); }
|
||||
00594
|
||||
00595
|
||||
00596 <span class="comment">/* Equality and inequality */</span>
|
||||
00597
|
||||
00598 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> parse_tree& other)<span class="keyword"> const</span>
|
||||
00599 <span class="keyword"> </span>{ <span class="keywordflow">return</span> _root == other._root; }
|
||||
00600
|
||||
00601 <span class="keywordtype">bool</span> operator !=(<span class="keyword">const</span> parse_tree& other)<span class="keyword"> const</span>
|
||||
00602 <span class="keyword"> </span>{ <span class="keywordflow">return</span> !operator==(other); }
|
||||
00603
|
||||
00604 <span class="comment">/* Simple tree statistics */</span>
|
||||
00605
|
||||
00606 size_t size(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _root.size(); }
|
||||
00607 size_t depth(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _root.depth(); }
|
||||
00608 <span class="keywordtype">void</span> clear(<span class="keywordtype">void</span>) { _root.clear(); pushed.resize(0); }
|
||||
00609
|
||||
00610 <span class="comment">/* Evaluation (application), with an increasing number of user defined arguments */</span>
|
||||
00611
|
||||
00612 <span class="keyword">template</span> <<span class="keyword">class</span> RetVal>
|
||||
00613 <span class="keywordtype">void</span> apply(RetVal& v)<span class="keyword"> const</span>
|
||||
00614 <span class="keyword"> </span>{ _root.apply(v); }
|
||||
00615
|
||||
00616 <span class="keyword">template</span> <<span class="keyword">class</span> RetVal, <span class="keyword">class</span> It>
|
||||
00617 <span class="keywordtype">void</span> apply(RetVal& v, It varValues)<span class="keyword"> const</span>
|
||||
00618 <span class="keyword"> </span>{ _root.apply(v, varValues); }
|
||||
00619
|
||||
00620 <span class="keyword">template</span> <<span class="keyword">class</span> RetVal, <span class="keyword">class</span> It>
|
||||
00621 <span class="keywordtype">void</span> apply_mem_func(RetVal& v, It misc, <span class="keywordtype">void</span> (T::* f)(RetVal&, <span class="keyword">typename</span> subtree::iterator, It))
|
||||
00622 {
|
||||
00623 _root.apply_mem_func(v, misc, f);
|
||||
00624 }
|
||||
00625
|
||||
00626 <span class="comment">//template <class RetVal, class It, class It2></span>
|
||||
00627 <span class="comment">// void apply(RetVal& v, It varValues, It2 moreValues) const</span>
|
||||
00628 <span class="comment">// { _root.apply(v, varValues, moreValues); }</span>
|
||||
00629
|
||||
00630 <span class="comment">//template <class RetVal, class It, class It2, class It3></span>
|
||||
00631 <span class="comment">// void apply(RetVal& v, It varValues, It2 moreValues, It3 evenMoreValues) const</span>
|
||||
00632 <span class="comment">// { _root.apply(v, varValues, moreValues, evenMoreValues); }</span>
|
||||
00633
|
||||
00634 <span class="keyword">template</span> <<span class="keyword">class</span> Pred>
|
||||
00635 <span class="keywordtype">void</span> find_nodes(std::vector<subtree*>& result, Pred& p)
|
||||
00636 {
|
||||
00637 _root.find_nodes(result, p);
|
||||
00638 }
|
||||
00639
|
||||
00640 <span class="keyword">template</span> <<span class="keyword">class</span> Pred>
|
||||
00641 <span class="keywordtype">void</span> find_nodes(std::vector<const subtree*>& result, Pred& p)<span class="keyword"> const</span>
|
||||
00642 <span class="keyword"> </span>{
|
||||
00643 _root.find_nodes(p);
|
||||
00644 }
|
||||
00645
|
||||
00646 <span class="comment">/* Customized Swap */</span>
|
||||
00647 <span class="keywordtype">void</span> swap(parse_tree<T>& other)
|
||||
00648 {
|
||||
00649 <a class="code" href="namespacegp__parse__tree.html#a0">do_the_swap</a>(pushed, other.pushed);
|
||||
00650 _root.swap(other._root);
|
||||
00651 }
|
||||
00652
|
||||
00653 <span class="comment">/* Definitions of the iterators */</span>
|
||||
00654
|
||||
00655 <span class="keyword">class </span>base_iterator
|
||||
00656 {
|
||||
00657 <span class="keyword">public</span> :
|
||||
00658
|
||||
00659 base_iterator() {}
|
||||
00660 base_iterator(subtree* n) { node = n; }
|
||||
00661
|
||||
00662 base_iterator& operator=(<span class="keyword">const</span> base_iterator& org)
|
||||
00663 { node = org.node; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
|
||||
00664
|
||||
00665 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> base_iterator& org)<span class="keyword"> const</span>
|
||||
00666 <span class="keyword"> </span>{ <span class="keywordflow">return</span> node == org.node; }
|
||||
00667 <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> base_iterator& org)<span class="keyword"> const</span>
|
||||
00668 <span class="keyword"> </span>{ <span class="keywordflow">return</span> !operator==(org); }
|
||||
00669
|
||||
00670 base_iterator operator+(size_t n)<span class="keyword"> const</span>
|
||||
00671 <span class="keyword"> </span>{
|
||||
00672 base_iterator tmp = *<span class="keyword">this</span>;
|
||||
00673
|
||||
00674 <span class="keywordflow">for</span>(;n != 0; --n)
|
||||
00675 {
|
||||
00676 ++tmp;
|
||||
00677 }
|
||||
00678
|
||||
00679 <span class="keywordflow">return</span> tmp;
|
||||
00680 }
|
||||
00681
|
||||
00682 base_iterator& operator++(<span class="keywordtype">void</span>)
|
||||
00683 {
|
||||
00684 subtree* parent = node->get_parent();
|
||||
00685
|
||||
00686 <span class="keywordflow">if</span> (parent == 0)
|
||||
00687 {
|
||||
00688 node = 0;
|
||||
00689 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
|
||||
00690 }
|
||||
00691 <span class="comment">// else</span>
|
||||
00692 <span class="keyword">typename</span> subtree::iterator it;
|
||||
00693 <span class="keywordflow">for</span> (it = parent->begin(); it != parent->end(); ++it)
|
||||
00694 {
|
||||
00695 <span class="keywordflow">if</span> (node == &(*it))
|
||||
00696 <span class="keywordflow">break</span>;
|
||||
00697 }
|
||||
00698
|
||||
00699 <span class="keywordflow">if</span> (it == parent->begin())
|
||||
00700 node = parent;
|
||||
00701 <span class="keywordflow">else</span>
|
||||
00702 {
|
||||
00703 node = &(--it)->get_node(0);
|
||||
00704 }
|
||||
00705
|
||||
00706 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
|
||||
00707 }
|
||||
00708
|
||||
00709 base_iterator operator++(<span class="keywordtype">int</span>)
|
||||
00710 {
|
||||
00711 base_iterator tmp = *<span class="keyword">this</span>;
|
||||
00712 operator++();
|
||||
00713 <span class="keywordflow">return</span> tmp;
|
||||
00714 }
|
||||
00715
|
||||
00716 <span class="keyword">protected</span> :
|
||||
00717 subtree* node;
|
||||
00718 };
|
||||
00719
|
||||
00720 <span class="keyword">class </span>iterator : <span class="keyword">public</span> base_iterator
|
||||
00721 {
|
||||
00722 <span class="keyword">public</span>:
|
||||
00723
|
||||
00724 <span class="keyword">using</span> base_iterator::node;
|
||||
00725
|
||||
00726 <span class="keyword">typedef</span> std::forward_iterator_tag iterator_category;
|
||||
00727 <span class="keyword">typedef</span> subtree value_type;
|
||||
00728 <span class="keyword">typedef</span> size_t distance_type;
|
||||
00729 <span class="keyword">typedef</span> size_t difference_type;
|
||||
00730 <span class="keyword">typedef</span> subtree* pointer;
|
||||
00731 <span class="keyword">typedef</span> subtree& reference;
|
||||
00732
|
||||
00733 iterator() : base_iterator() {}
|
||||
00734 iterator(subtree* n): base_iterator(n) {}
|
||||
00735 iterator& operator=(<span class="keyword">const</span> iterator& org)
|
||||
00736 { base_iterator::operator=(org); <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
|
||||
00737
|
||||
00738 subtree& operator*(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> *node; }
|
||||
00739 subtree* operator->(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> node; }
|
||||
00740 };
|
||||
00741
|
||||
00742
|
||||
00743
|
||||
00744 <span class="keyword">class </span>embedded_iterator : <span class="keyword">public</span> base_iterator
|
||||
00745 {
|
||||
00746 <span class="keyword">public</span>:
|
||||
00747
|
||||
00748 <span class="keyword">using</span> base_iterator::node;
|
||||
00749
|
||||
00750 <span class="keyword">typedef</span> std::forward_iterator_tag iterator_category;
|
||||
00751 <span class="keyword">typedef</span> T value_type;
|
||||
00752 <span class="keyword">typedef</span> size_t distance_type;
|
||||
00753 <span class="keyword">typedef</span> size_t difference_type;
|
||||
00754 <span class="keyword">typedef</span> T* pointer;
|
||||
00755 <span class="keyword">typedef</span> T& reference;
|
||||
00756
|
||||
00757 embedded_iterator() : base_iterator() {}
|
||||
00758 embedded_iterator(subtree* n): base_iterator(n) {}
|
||||
00759 embedded_iterator& operator=(<span class="keyword">const</span> embedded_iterator& org)
|
||||
00760 { base_iterator::operator=(org); <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
|
||||
00761
|
||||
00762 T& operator*(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> **node; }
|
||||
00763 T* operator->(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> &**node; }
|
||||
00764 };
|
||||
00765
|
||||
00766 <span class="keyword">class </span>base_const_iterator
|
||||
00767 {
|
||||
00768 <span class="keyword">public</span>:
|
||||
00769
|
||||
00770 base_const_iterator() {}
|
||||
00771 base_const_iterator(<span class="keyword">const</span> subtree* n) { node = n; }
|
||||
00772
|
||||
00773 base_const_iterator& operator=(<span class="keyword">const</span> base_const_iterator& org)
|
||||
00774 { node = org.node; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
|
||||
00775
|
||||
00776 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> base_const_iterator& org)<span class="keyword"> const</span>
|
||||
00777 <span class="keyword"> </span>{ <span class="keywordflow">return</span> node == org.node; }
|
||||
00778 <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> base_const_iterator& org)<span class="keyword"> const</span>
|
||||
00779 <span class="keyword"> </span>{ <span class="keywordflow">return</span> !operator==(org); }
|
||||
00780
|
||||
00781 base_const_iterator& operator++(<span class="keywordtype">void</span>)
|
||||
00782 {
|
||||
00783 <span class="keyword">const</span> subtree* parent = node->get_parent();
|
||||
00784
|
||||
00785 <span class="keywordflow">if</span> (parent == 0)
|
||||
00786 {
|
||||
00787 node = 0;
|
||||
00788 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
|
||||
00789 }
|
||||
00790 <span class="comment">// else</span>
|
||||
00791 <span class="keyword">typename</span> subtree::const_iterator it;
|
||||
00792
|
||||
00793 <span class="keywordflow">for</span> (it = parent->begin(); it != parent->end(); ++it)
|
||||
00794 {
|
||||
00795 <span class="keywordflow">if</span> (node == &(*it))
|
||||
00796 <span class="keywordflow">break</span>;
|
||||
00797 }
|
||||
00798
|
||||
00799 <span class="keywordflow">if</span> (it == parent->begin())
|
||||
00800 node = parent;
|
||||
00801 <span class="keywordflow">else</span>
|
||||
00802 node = &(--it)->get_node(0);
|
||||
00803 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
|
||||
00804 }
|
||||
00805
|
||||
00806 base_const_iterator operator++(<span class="keywordtype">int</span>)
|
||||
00807 {
|
||||
00808 base_const_iterator tmp = *<span class="keyword">this</span>;
|
||||
00809 operator++();
|
||||
00810 <span class="keywordflow">return</span> tmp;
|
||||
00811 }
|
||||
00812
|
||||
00813 <span class="keyword">protected</span> :
|
||||
00814
|
||||
00815 <span class="keyword">const</span> subtree* node;
|
||||
00816 };
|
||||
00817
|
||||
00818 <span class="keyword">class </span>const_iterator : <span class="keyword">public</span> base_const_iterator
|
||||
00819 {
|
||||
00820 <span class="keyword">public</span>:
|
||||
00821
|
||||
00822 <span class="keyword">using</span> base_iterator::node;
|
||||
00823
|
||||
00824 <span class="keyword">typedef</span> std::forward_iterator_tag iterator_category;
|
||||
00825 <span class="keyword">typedef</span> <span class="keyword">const</span> subtree value_type;
|
||||
00826 <span class="keyword">typedef</span> size_t distance_type;
|
||||
00827 <span class="keyword">typedef</span> size_t difference_type;
|
||||
00828 <span class="keyword">typedef</span> <span class="keyword">const</span> subtree* pointer;
|
||||
00829 <span class="keyword">typedef</span> <span class="keyword">const</span> subtree& reference;
|
||||
00830
|
||||
00831 const_iterator() : base_const_iterator() {}
|
||||
00832 const_iterator(<span class="keyword">const</span> subtree* n): base_const_iterator(n) {}
|
||||
00833 const_iterator& operator=(<span class="keyword">const</span> const_iterator& org)
|
||||
00834 { base_const_iterator::operator=(org); <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
|
||||
00835
|
||||
00836 <span class="keyword">const</span> subtree& operator*(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> *node; }
|
||||
00837 <span class="keyword">const</span> subtree* operator->(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> node; }
|
||||
00838 };
|
||||
00839
|
||||
00840 <span class="keyword">class </span>embedded_const_iterator : <span class="keyword">public</span> base_const_iterator
|
||||
00841 {
|
||||
00842 <span class="keyword">public</span>:
|
||||
00843
|
||||
00844 <span class="keyword">using</span> base_const_iterator::node;
|
||||
00845
|
||||
00846 <span class="keyword">typedef</span> std::forward_iterator_tag iterator_category;
|
||||
00847 <span class="keyword">typedef</span> <span class="keyword">const</span> T value_type;
|
||||
00848 <span class="keyword">typedef</span> size_t distance_type;
|
||||
00849 <span class="keyword">typedef</span> size_t difference_type;
|
||||
00850 <span class="keyword">typedef</span> <span class="keyword">const</span> T* pointer;
|
||||
00851 <span class="keyword">typedef</span> <span class="keyword">const</span> T& reference;
|
||||
00852
|
||||
00853 embedded_const_iterator() : base_const_iterator() {}
|
||||
00854 embedded_const_iterator(<span class="keyword">const</span> subtree* n): base_const_iterator(n) {}
|
||||
00855 embedded_const_iterator& operator=(<span class="keyword">const</span> embedded_const_iterator& org)
|
||||
00856 { base_const_iterator::operator=(org); <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
|
||||
00857
|
||||
00858 embedded_const_iterator operator+(size_t n)<span class="keyword"> const</span>
|
||||
00859 <span class="keyword"> </span>{
|
||||
00860 embedded_const_iterator tmp = *<span class="keyword">this</span>;
|
||||
00861
|
||||
00862 <span class="keywordflow">for</span>(;n != 0; --n)
|
||||
00863 {
|
||||
00864 ++tmp;
|
||||
00865 }
|
||||
00866
|
||||
00867 <span class="keywordflow">return</span> tmp;
|
||||
00868 }
|
||||
00869
|
||||
00870 <span class="keyword">const</span> T& operator*(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> **node; }
|
||||
00871 <span class="keyword">const</span> T* operator->(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> node->operator->(); }
|
||||
00872 };
|
||||
00873
|
||||
00874 <span class="comment">/* Iterator access */</span>
|
||||
00875
|
||||
00876 iterator begin(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> iterator(&<span class="keyword">operator</span>[](0)); }
|
||||
00877 const_iterator begin(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(&<span class="keyword">operator</span>[](0)); }
|
||||
00878 iterator end(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> iterator(0); }
|
||||
00879 const_iterator end(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> const_iterator(0);}
|
||||
00880
|
||||
00881 embedded_iterator ebegin(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> embedded_iterator(&<span class="keyword">operator</span>[](0)); }
|
||||
00882 embedded_const_iterator ebegin(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> embedded_const_iterator(&<span class="keyword">operator</span>[](0)); }
|
||||
00883 embedded_iterator eend(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> embedded_iterator(0); }
|
||||
00884 embedded_const_iterator eend(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> embedded_const_iterator(0);}
|
||||
00885
|
||||
00886 <span class="keywordtype">bool</span> empty(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> size() == 0; }
|
||||
00887 <span class="keywordtype">bool</span> valid(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> pushed.empty(); }
|
||||
00888
|
||||
00889 <span class="comment">/* push_back */</span>
|
||||
00890
|
||||
00891 <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> parse_tree<T>& tree)
|
||||
00892 {
|
||||
00893 <span class="keywordflow">if</span> (!empty())
|
||||
00894 pushed.push_back(_root);
|
||||
00895
|
||||
00896 _root = tree.back();
|
||||
00897 }
|
||||
00898
|
||||
00899 <span class="keywordtype">void</span> push_back(<span class="keyword">const</span> T& t)
|
||||
00900 {
|
||||
00901 <span class="keywordflow">if</span> (!empty())
|
||||
00902 pushed.push_back(_root);
|
||||
00903
|
||||
00904 _root = t;
|
||||
00905
|
||||
00906 <span class="keywordflow">for</span> (<span class="keyword">typename</span> subtree::iterator it = _root.begin(); it != _root.end(); it++)
|
||||
00907 {
|
||||
00908 *it = pushed.back();
|
||||
00909 pushed.pop_back();
|
||||
00910 }
|
||||
00911
|
||||
00912 }
|
||||
00913
|
||||
00914 <span class="comment">/* Access to subtrees */</span>
|
||||
00915
|
||||
00916 subtree& back(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> _root; }
|
||||
00917 <span class="keyword">const</span> subtree& back(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _root; }
|
||||
00918 subtree& root(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> _root; }
|
||||
00919 <span class="keyword">const</span> subtree& root(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _root; }
|
||||
00920
|
||||
00921 subtree& front(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> _root[0]; }
|
||||
00922 <span class="keyword">const</span> subtree& front(<span class="keywordtype">void</span>)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> _root[0]; }
|
||||
00923
|
||||
00924 subtree& operator[](size_t i)
|
||||
00925 { <span class="keywordflow">return</span> const_cast<subtree&>(_root.get_node(i)); }
|
||||
00926 <span class="keyword">const</span> subtree& operator[](size_t i)<span class="keyword"> const</span>
|
||||
00927 <span class="keyword"> </span>{ <span class="keywordflow">return</span> _root.get_node(i); }
|
||||
00928
|
||||
00929 subtree& get_cumulative(size_t i)
|
||||
00930 { <span class="keywordflow">return</span> const_cast<subtree&>(_root.get_cumulative(i)); }
|
||||
00931 <span class="keyword">const</span> subtree& get_cumulative(size_t i)<span class="keyword"> const</span>
|
||||
00932 <span class="keyword"> </span>{ <span class="keywordflow">return</span> get_cumulative(i); }
|
||||
00933
|
||||
00934 <span class="keyword">private</span> :
|
||||
00935
|
||||
00936 parse_tree& copy(<span class="keyword">const</span> parse_tree& org)
|
||||
00937 {
|
||||
00938 _root = org._root;
|
||||
00939 pushed = org.pushed;
|
||||
00940
|
||||
00941 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
|
||||
00942 }
|
||||
00943
|
||||
00944 parse_tree& copy(<span class="keyword">const</span> subtree& sub)
|
||||
00945 { _root = sub; pushed.resize(0); <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
|
||||
00946
|
||||
00947 subtree _root;
|
||||
00948 std::vector<subtree > pushed;
|
||||
00949 }; <span class="comment">// end class parse_tree</span>
|
||||
00950
|
||||
00951
|
||||
00952 } <span class="comment">// end namespace gp_parse_tree</span>
|
||||
00953
|
||||
00954 <span class="keyword">namespace </span>std
|
||||
00955 { <span class="comment">// for use with stlport on MSVC</span>
|
||||
00956
|
||||
00957 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="keyword">inline</span>
|
||||
00958 std::forward_iterator_tag iterator_category(<span class="keyword">typename</span> gp_parse_tree::parse_tree<T>::embedded_iterator)
|
||||
00959 {
|
||||
00960 <span class="keywordflow">return</span> std::forward_iterator_tag();
|
||||
00961 }
|
||||
00962
|
||||
00963 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="keyword">inline</span>
|
||||
00964 ptrdiff_t* distance_type(<span class="keyword">typename</span> gp_parse_tree::parse_tree<T>::embedded_iterator)
|
||||
00965 {
|
||||
00966 <span class="keywordflow">return</span> 0;
|
||||
00967 }
|
||||
00968
|
||||
00969 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="keyword">inline</span>
|
||||
00970 std::forward_iterator_tag iterator_category(<span class="keyword">typename</span> gp_parse_tree::parse_tree<T>::iterator)
|
||||
00971 {
|
||||
00972 <span class="keywordflow">return</span> std::forward_iterator_tag();
|
||||
00973 }
|
||||
00974
|
||||
00975 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="keyword">inline</span>
|
||||
00976 ptrdiff_t* distance_type(<span class="keyword">typename</span> gp_parse_tree::parse_tree<T>::iterator)
|
||||
00977 {
|
||||
00978 <span class="keywordflow">return</span> 0;
|
||||
00979 }
|
||||
00980
|
||||
00981 <span class="comment">/* Put customized swaps also in std...</span>
|
||||
00982 <span class="comment"></span>
|
||||
00983 <span class="comment">template<class T> inline</span>
|
||||
00984 <span class="comment">void swap(gp_parse_tree::parse_tree<T>& a, gp_parse_tree::parse_tree<T>& b)</span>
|
||||
00985 <span class="comment">{</span>
|
||||
00986 <span class="comment"> a.swap(b);</span>
|
||||
00987 <span class="comment">}</span>
|
||||
00988 <span class="comment"></span>
|
||||
00989 <span class="comment">template<class T> inline</span>
|
||||
00990 <span class="comment">void iter_swap(std::vector<gp_parse_tree::parse_tree<T> >::iterator a, std::vector<gp_parse_tree::parse_tree<T> > b)</span>
|
||||
00991 <span class="comment">{</span>
|
||||
00992 <span class="comment"> a->swap(*b);</span>
|
||||
00993 <span class="comment">}*/</span>
|
||||
00994
|
||||
00995
|
||||
00996 } <span class="comment">// namespace std</span>
|
||||
00997
|
||||
00998
|
||||
00999 <span class="preprocessor">#endif</span>
|
||||
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu Oct 19 05:06:41 2006 for EO by
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
|
||||
</body>
|
||||
</html>
|
||||
Loading…
Add table
Add a link
Reference in a new issue