00001
00002
00003 #include "cppscript"
00004 #include "dynamic/extensions.hpp"
00005
00006 static_call( register_pickle_type( cmp_reverse, reverse(null) ) );
00007 static_call( register_pickle_type( cmp_transform, transform(null,null) ) );
00008 static_call( register_pickle_type( cmp_filter, filter(null, null) ) );
00009 static_call( register_pickle_type( cmp_tail, tail(null) ) );
00010
00011 using internal::nonroot_var;
00012
00013
00014 namespace dynamic
00015 {
00016 namespace types
00017 {
00019 class reverse_impl : public dynamic::shared_var_impl
00020 {
00021 nonroot_var m_container;
00022
00023 public:
00024 reverse_impl(const var & container) : m_container(container)
00025 {
00026 }
00027
00028 void mark_children(gc::garbage_collector &gc)
00029 {
00030 m_container.ref().impl().mark_reachable(gc);
00031 }
00032
00033 var_cmp_index comparison_index()
00034 {
00035 return cmp_reverse;
00036 }
00037
00038 var begin()
00039 {
00040 return m_container.ref().rbegin();
00041 }
00042
00043 var end()
00044 {
00045 return m_container.ref().rend();
00046 }
00047
00048 var rbegin()
00049 {
00050 return m_container.ref().begin();
00051 }
00052
00053 var rend()
00054 {
00055 return m_container.ref().end();
00056 }
00057
00058 int size()
00059 {
00060 return m_container.ref().size();
00061 }
00062
00063 var back()
00064 {
00065 return m_container.ref().front();
00066 }
00067
00068 var front()
00069 {
00070 return m_container.ref().back();
00071 }
00072
00073 var pop_front()
00074 {
00075 return m_container.ref().pop_back();
00076 }
00077
00078 var pop_back()
00079 {
00080 return m_container.ref().pop_front();
00081 }
00082
00083 void push_back(const var & v)
00084 {
00085 m_container.ref().push_front(v);
00086 }
00087
00088 void push_front(const var & v)
00089 {
00090 m_container.ref().push_back(v);
00091 }
00092
00093 var enumerator()
00094 {
00095 return m_container.ref().reverse_enumerator();
00096 }
00097
00098 var reverse_enumerator()
00099 {
00100 return m_container.ref().enumerator();
00101 }
00102
00103 bool empty()
00104 {
00105 return m_container.ref().empty();
00106 }
00107
00108 std::string class_name()
00109 {
00110 return "reverse";
00111 }
00112
00113 void output(ostream & os)
00114 {
00115 os << "reverse(";
00116 m_container.ref().impl().output(os);
00117 os << ")";
00118 }
00119
00120 void output(wostream & os)
00121 {
00122 os << L"reverse(";
00123 m_container.ref().impl().output(os);
00124 os << L")";
00125 }
00126
00127 void pickle(pickler & p)
00128 {
00129 p.write_object_type(cmp_reverse);
00130 m_container.ref().impl().pickle(p);
00131 }
00132
00133 void unpickle(unpickler & p)
00134 {
00135 m_container = p.read_object();
00136 }
00137
00138 bool as_bool()
00139 {
00140 return m_container.ref();
00141 }
00142
00143 var keys()
00144 {
00145 return reverse(m_container.ref().keys());
00146 }
00147
00148 var values()
00149 {
00150 return reverse(m_container.ref().values());
00151 }
00152
00153 var get_member(const char * s)
00154 {
00155 return m_container.ref()[s];
00156 }
00157
00158 var get_member(int i)
00159 {
00160 return m_container.ref()[i];
00161 }
00162
00163 var get_member(const var & v)
00164 {
00165 return m_container.ref()[v];
00166 }
00167
00168 void clear()
00169 {
00170 m_container.ref().clear();
00171 }
00172
00173 bool contains(const var & v)
00174 {
00175 return m_container.ref().contains(v);
00176 }
00177
00178 void erase(const var & v)
00179 {
00180 m_container.ref().erase(v);
00181 }
00182
00183 var clone()
00184 {
00185 return new reverse_impl(*this);
00186 }
00187 };
00188
00189
00191 class filter_impl : public dynamic::shared_var_impl
00192 {
00193 nonroot_var m_container, m_predicate;
00194 public:
00195 filter_impl(const var & c, const var & p) : m_container(c), m_predicate(p)
00196 {
00197 }
00198
00199 std::string class_name()
00200 {
00201 return "filter";
00202 }
00203
00204 var_cmp_index comparison_index()
00205 {
00206 return cmp_filter;
00207 }
00208
00209 void mark_children(gc::garbage_collector &gc)
00210 {
00211 m_container.ref().impl().mark_reachable(gc);
00212 m_predicate.ref().impl().mark_reachable(gc);
00213 }
00214
00215 void output(ostream & os)
00216 {
00217 os << "filter(";
00218 m_container.ref().impl().output(os);
00219 os << ")";
00220 }
00221
00222 void output(wostream & os)
00223 {
00224 os << L"filter(";
00225 m_container.ref().impl().output(os);
00226 os << L")";
00227 }
00228
00229 void pickle(pickler & p)
00230 {
00231 p.write_object_type(cmp_filter);
00232 p.write_object(m_container.ref());
00233 p.write_object(m_predicate.ref());
00234 }
00235
00236 void unpickle(unpickler & p)
00237 {
00238 m_container = p.read_object();
00239 m_predicate = p.read_object();
00240 }
00241
00242 class iterator : public shared_var_impl
00243 {
00244 nonroot_var m_enumerator, m_pred;
00245 public:
00246 iterator(const var & enumerator, nonroot_var & p) :
00247 m_enumerator(enumerator), m_pred(p)
00248 {
00249 while( m_enumerator.ref() && !m_pred.ref()(*m_enumerator.ref()) )
00250 ++m_enumerator.ref();
00251 }
00252
00253 bool as_bool()
00254 {
00255 return m_enumerator.ref().as_bool();
00256 }
00257
00258 std::string class_name()
00259 {
00260 return "filter_enumerator";
00261 }
00262
00263 void op_inc()
00264 {
00265 do
00266 {
00267 ++m_enumerator.ref();
00268 }
00269 while( m_enumerator.ref() && !m_pred.ref()(*m_enumerator.ref()) );
00270 }
00271
00272 var deref()
00273 {
00274 return *m_enumerator.ref();
00275 }
00276
00277 void mark_children(gc::garbage_collector &gc)
00278 {
00279 m_enumerator.ref().impl().mark_reachable(gc);
00280 m_pred.ref().impl().mark_reachable(gc);
00281 }
00282 };
00283
00284 var enumerator()
00285 {
00286 return new iterator(m_container.ref().enumerator(), m_predicate);
00287 }
00288
00289 var reverse_enumerator()
00290 {
00291 return new iterator(m_container.ref().reverse_enumerator(), m_predicate);
00292 }
00293
00294 var clone()
00295 {
00296 return new filter_impl(*this);
00297 }
00298 };
00299
00300
00302 class transform_impl : public dynamic::shared_var_impl
00303 {
00304 nonroot_var m_container, m_fn;
00305
00306 public:
00307 transform_impl(const var & c, const var & f) : m_container(c), m_fn(f)
00308 {
00309 }
00310
00311 std::string class_name()
00312 {
00313 return "transform";
00314 }
00315
00316 void mark_children(gc::garbage_collector &gc)
00317 {
00318 m_container.ref().impl().mark_reachable(gc);
00319 m_fn.ref().impl().mark_reachable(gc);
00320 }
00321
00322 var_cmp_index comparison_index()
00323 {
00324 return cmp_transform;
00325 }
00326
00327 void output(ostream & os)
00328 {
00329 os << "transform(";
00330 m_container.ref().impl().output(os);
00331 os << ")";
00332 }
00333
00334 void output(wostream & os)
00335 {
00336 os << L"transform(";
00337 m_container.ref().impl().output(os);
00338 os << L")";
00339 }
00340
00341 void pickle(pickler & p)
00342 {
00343 p.write_object_type(cmp_transform);
00344 p.write_object(m_container.ref());
00345 p.write_object(m_fn.ref());
00346 }
00347
00348 void unpickle(unpickler & p)
00349 {
00350 m_container = p.read_object();
00351 m_fn = p.read_object();
00352 }
00353
00354 int size()
00355 {
00356 return m_container.ref().size();
00357 }
00358
00359 bool as_bool()
00360 {
00361 return m_container.ref();
00362 }
00363
00364 bool empty()
00365 {
00366 return m_container.ref().empty();
00367 }
00368
00369 class iterator : public shared_var_impl
00370 {
00371 nonroot_var m_enumerator, m_fn;
00372
00373 public:
00374 iterator(const var & enumerator, nonroot_var & f) :
00375 m_enumerator(enumerator), m_fn(f)
00376 {
00377 }
00378
00379 bool as_bool()
00380 {
00381 return m_enumerator.ref().as_bool();
00382 }
00383
00384 std::string class_name()
00385 {
00386 return "transform_enumerator";
00387 }
00388
00389 void op_inc()
00390 {
00391 ++m_enumerator.ref();
00392 }
00393
00394 var deref()
00395 {
00396 return m_fn.ref()(*m_enumerator.ref());
00397 }
00398
00399 void mark_children(gc::garbage_collector &gc)
00400 {
00401 m_enumerator.ref().impl().mark_reachable(gc);
00402 m_fn.ref().impl().mark_reachable(gc);
00403 }
00404 };
00405
00406 var enumerator()
00407 {
00408 return new iterator( m_container.ref().enumerator(), m_fn );
00409 }
00410
00411 var reverse_enumerator()
00412 {
00413 return new iterator( m_container.ref().reverse_enumerator(), m_fn );
00414 }
00415
00416 var clone()
00417 {
00418 return new transform_impl(*this);
00419 }
00420
00421 var front()
00422 {
00423 return m_fn.ref()(m_container.ref().front());
00424 }
00425
00426 var back()
00427 {
00428 return m_fn.ref()(m_container.ref().back());
00429 }
00430 };
00431
00432
00434 class tail_impl : public dynamic::shared_var_impl
00435 {
00436 nonroot_var m_container;
00437
00438 public:
00439 tail_impl(const var & c) : m_container(c)
00440 {
00441 }
00442
00443 std::string class_name()
00444 {
00445 return "tail";
00446 }
00447
00448 void mark_children(gc::garbage_collector &gc)
00449 {
00450 m_container.ref().impl().mark_reachable(gc);
00451 }
00452
00453 var_cmp_index comparison_index()
00454 {
00455 return cmp_tail;
00456 }
00457
00458 void output(ostream & os)
00459 {
00460 os << "tail(";
00461 m_container.ref().impl().output(os);
00462 os << ")";
00463 }
00464
00465 void output(wostream & os)
00466 {
00467 os << L"tail(";
00468 m_container.ref().impl().output(os);
00469 os << L")";
00470 }
00471
00472 void pickle(pickler & p)
00473 {
00474 p.write_object_type(cmp_tail);
00475 p.write_object(m_container.ref());
00476 }
00477
00478 void unpickle(unpickler & p)
00479 {
00480 m_container = p.read_object();
00481 }
00482
00483 int size()
00484 {
00485 int rs = m_container.ref().size()-1;
00486 return rs>0 ? rs : 0;
00487 }
00488
00489 bool as_bool()
00490 {
00491 return size()>0;
00492 }
00493
00494 bool empty()
00495 {
00496 return size()==0;
00497 }
00498
00499 var enumerator()
00500 {
00501 return ++m_container.ref().enumerator();
00502 }
00503
00504 var begin()
00505 {
00506 return enumerator();
00507 }
00508
00509 var end()
00510 {
00511 return m_container.ref().end();
00512 }
00513
00514 var front()
00515 {
00516 return *enumerator();
00517 }
00518
00519 var back()
00520 {
00521 return m_container.ref().back();
00522 }
00523
00524
00525
00526 var clone()
00527 {
00528 return new tail_impl(*this);
00529 }
00530 };
00531
00532
00534 class enumerate_enumerator : public dynamic::shared_var_impl
00535 {
00536 nonroot_var m_fn, m_current_value;
00537
00538 public:
00539 enumerate_enumerator(nonroot_var & fn) :
00540 m_fn(fn),
00541 m_current_value( m_fn.ref()() )
00542 {
00543 }
00544
00545 void mark_children(gc::garbage_collector & gc)
00546 {
00547 m_fn.ref().impl().mark_reachable(gc);
00548 m_current_value.ref().impl().mark_reachable(gc);
00549 }
00550
00551 bool as_bool()
00552 {
00553 return m_current_value.ref() != null;
00554 }
00555
00556 var deref()
00557 {
00558 return m_current_value.get();
00559 }
00560
00561 void op_inc()
00562 {
00563 m_current_value = m_fn.ref()();
00564 }
00565
00566 std::string class_name()
00567 {
00568 return "fn_enumerator2";
00569 }
00570 };
00571
00572
00574 class enumerate_impl : public dynamic::shared_var_impl
00575 {
00576 nonroot_var m_fn;
00577 public:
00578
00579 enumerate_impl(const var & fn) : m_fn(fn)
00580 {
00581 }
00582
00583 void mark_children(gc::garbage_collector & gc)
00584 {
00585 m_fn.ref().impl().mark_reachable(gc);
00586 }
00587
00588 std::string class_name()
00589 {
00590 return "fn_enumerator";
00591 }
00592
00593 var enumerator()
00594 {
00595 return new enumerate_enumerator(m_fn);
00596 }
00597 };
00598 }
00599 }
00600
00601
00602 var dynamic::reverse(const var & container)
00603 {
00604 return new types::reverse_impl(container);
00605 }
00606
00607
00608 var dynamic::filter(const var & container, const var & pred)
00609 {
00610 return new types::filter_impl(container, pred);
00611 }
00612
00613
00614 var dynamic::transform(const var & container, const var & fn)
00615 {
00616 return new types::transform_impl(container, fn);
00617 }
00618
00619
00620 var dynamic::tail(const var & container)
00621 {
00622 return new types::tail_impl(container);
00623 }
00624
00625
00626 var dynamic::enumerate(const var & fn)
00627 {
00628 return new types::enumerate_impl(fn);
00629 }