00001
00002
00003 #include "cppscript"
00004 #include "dynamic/extensions.hpp"
00005
00006 using internal::nonroot_var;
00007
00008
00009 namespace dynamic
00010 {
00011 namespace types
00012 {
00014
00015 class dispatcher_impl : public shared_var_impl
00016 {
00017 nonroot_var m_object;
00018
00019 public:
00020 dispatcher_impl(const var & object) :
00021 m_object(object)
00022 {
00023 }
00024
00025 void mark_children(gc::garbage_collector & gc)
00026 {
00027 m_object.ref().impl().mark_reachable(gc);
00028 }
00029
00030 var_cmp_index comparison_index()
00031 {
00032 return cmp_dispatcher;
00033 }
00034
00035 void pickle(pickler & p)
00036 {
00037 p.write_object_type(cmp_dispatcher);
00038 p.write_object(m_object.ref());
00039 }
00040
00041 void unpickle(unpickler & p)
00042 {
00043 m_object = p.read_object();
00044 }
00045
00046 var get_member(const var & member)
00047 {
00048 return m_object.ref()["get_member"](member);
00049 }
00050
00051 void set_member(const var & member, const var & value)
00052 {
00053 m_object.ref()["set_member"](member, value);
00054 }
00055
00056 std::string class_name()
00057 {
00058 return m_object.ref()["class_name"]().as_string();
00059 }
00060
00061 var call()
00062 {
00063 return m_object.ref()["call"]();
00064 }
00065
00066 var call(const var & a0)
00067 {
00068 return m_object.ref()["call"](a0);
00069 }
00070
00071 var call(const var & a0, const var & a1)
00072 {
00073 return m_object.ref()["call"](a0,a1);
00074 }
00075
00076 var call(const var & a0, const var & a1,const var & a2)
00077 {
00078 return m_object.ref()["call"](a0,a1,a2);
00079 }
00080
00081 var call(const var & a0, const var & a1,const var & a2,const var & a3)
00082 {
00083 return m_object.ref()["call"](a0,a1,a2,a3);
00084 }
00085
00086 var call(const var & a0, const var & a1,const var & a2,const var & a3,const var &a4)
00087 {
00088 return m_object.ref()["call"](a0,a1,a2,a3,a4);
00089 }
00090
00091 var call(const var & a0, const var & a1,const var & a2,const var & a3,const var &a4,const var&a5)
00092 {
00093 return m_object.ref()["call"](a0,a1,a2,a3,a4,a5);
00094 }
00095
00096 var call(const var & a0, const var & a1,const var & a2,const var & a3,const var &a4,const var&a5,const var &a6)
00097 {
00098 return m_object.ref()["call"](a0,a1,a2,a3,a4,a5,a6);
00099 }
00100
00101 var call(const var & a0, const var & a1,const var & a2,const var & a3,const var &a4,const var&a5,const var &a6,const var &a7)
00102 {
00103 return m_object.ref()["call"](a0,a1,a2,a3,a4,a5,a6,a7);
00104 }
00105
00106 var call(const var & a0, const var & a1,const var & a2,const var & a3,const var &a4,const var&a5,const var &a6,const var &a7,const var &a8)
00107 {
00108 return m_object.ref()["call"](a0,a1,a2,a3,a4,a5,a6,a7,a8);
00109 }
00110
00111 var call(const var & a0, const var & a1,const var & a2,const var & a3,const var &a4,const var&a5,const var &a6,const var &a7,const var &a8,const var &a9)
00112 {
00113 return m_object.ref()["call"](a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);
00114 }
00115
00116 int max_args()
00117 {
00118 return m_object.ref()["call"].max_args();
00119 }
00120
00121 void output(ostream & os)
00122 {
00123 os << m_object.ref()["as_string"]();
00124 }
00125
00126 void output(wostream & os)
00127 {
00128 os << m_object.ref()["as_string"]();
00129 }
00130
00131 int as_int()
00132 {
00133 return m_object.ref()["as_int"]().as_int();
00134 }
00135
00136 double as_double()
00137 {
00138 return m_object.ref()["as_double"]().as_double();
00139 }
00140
00141 bool as_bool()
00142 {
00143 return m_object.ref()["as_bool"]().as_bool();
00144 }
00145
00146 int size()
00147 {
00148 return m_object.ref()["size"]().as_int();
00149 }
00150
00151 void resize(std::size_t new_size)
00152 {
00153 m_object.ref()["resize"](int(new_size));
00154 }
00155
00156 bool empty()
00157 {
00158 return m_object.ref()["empty"]();
00159 }
00160
00161 var enumerator()
00162 {
00163 return m_object.ref()["enumerator"]();
00164 }
00165
00166 var reverse_enumerator()
00167 {
00168 return m_object.ref()["reverse_enumerator"]();
00169 }
00170
00171 var keys()
00172 {
00173 return m_object.ref()["keys"]();
00174 }
00175
00176 var values()
00177 {
00178 return m_object.ref()["values"]();
00179 }
00180
00181 void insert(const var & i)
00182 {
00183 m_object.ref()["insert"](i);
00184 }
00185
00186 void reserve(std::size_t i)
00187 {
00188 m_object.ref()["reserve"](int(i));
00189 }
00190
00191 std::size_t capacity()
00192 {
00193 return m_object.ref()["capacity"]().as_int();
00194 }
00195
00196 void push_back(const var & v)
00197 {
00198 m_object.ref()["push_back"](v);
00199 }
00200
00201 void push_front(const var & v)
00202 {
00203 m_object.ref()["push_front"](v);
00204 }
00205
00206 var pop_back()
00207 {
00208 return m_object.ref()["pop_back"]();
00209 }
00210
00211 var pop_front()
00212 {
00213 return m_object.ref()["pop_front"]();
00214 }
00215
00216 var back()
00217 {
00218 return m_object.ref()["back"]();
00219 }
00220
00221 var front()
00222 {
00223 return m_object.ref()["front"]();
00224 }
00225
00226 void clear()
00227 {
00228 m_object.ref()["clear"]();
00229 }
00230
00231 bool contains(const var & a)
00232 {
00233 return m_object.ref()["contains"](a);
00234 }
00235
00236 void erase(const var & a)
00237 {
00238 m_object.ref()["erase"](a);
00239 }
00240
00241 var clone()
00242 {
00243 return m_object.ref()["clone"]();
00244 }
00245
00246 var key()
00247 {
00248 return m_object.ref()["key"]();
00249 }
00250
00251 var value()
00252 {
00253 return m_object.ref()["value"]();
00254 }
00255
00256 var deref()
00257 {
00258 return m_object.ref()["deref"]();
00259 }
00260
00261 void op_inc()
00262 {
00263 m_object.ref()["++"]();
00264 }
00265
00266 void op_dec()
00267 {
00268 m_object.ref()["--"]();
00269 }
00270
00271 var op_add(const var & a)
00272 {
00273 return m_object.ref()["+"](a);
00274 }
00275
00276 var op_sub(const var & a)
00277 {
00278 return m_object.ref()["-"](a);
00279 }
00280
00281 var op_mul(const var & a)
00282 {
00283 return m_object.ref()["*"](a);
00284 }
00285
00286 var op_div(const var & a)
00287 {
00288 return m_object.ref()["/"](a);
00289 }
00290
00291 var op_mod(const var & a)
00292 {
00293 return m_object.ref()["%"](a);
00294 }
00295
00296 var op_neg()
00297 {
00298 return m_object.ref()["neg"]();
00299 }
00300
00301 var op_lshift(const var & a)
00302 {
00303 return m_object.ref()["<<"](a);
00304 }
00305
00306 var op_rshift(const var & a)
00307 {
00308 return m_object.ref()[">>"](a);
00309 }
00310
00311 var op_and(const var & a)
00312 {
00313 return m_object.ref()["&"](a);
00314 }
00315
00316 var op_or(const var & a)
00317 {
00318 return m_object.ref()["|"](a);
00319 }
00320
00321 var op_xor(const var & a)
00322 {
00323 return m_object.ref()["^"](a);
00324 }
00325
00326 var op_inv()
00327 {
00328 return m_object.ref()["~"]();
00329 }
00330
00331 void assign_add(const var & a)
00332 {
00333 m_object.ref()["+="](a);
00334 }
00335
00336 void assign_sub(const var & a)
00337 {
00338 m_object.ref()["-="](a);
00339 }
00340
00341 void assign_mul(const var & a)
00342 {
00343 m_object.ref()["*="](a);
00344 }
00345
00346 void assign_div(const var & a)
00347 {
00348 m_object.ref()["/="](a);
00349 }
00350
00351 void assign_mod(const var & a)
00352 {
00353 m_object.ref()["%="](a);
00354 }
00355
00356 void assign_lshift(const var & a)
00357 {
00358 m_object.ref()["<<="](a);
00359 }
00360
00361 void assign_rshift(const var & a)
00362 {
00363 m_object.ref()[">>="](a);
00364 }
00365
00366 void assign_and(const var & a)
00367 {
00368 m_object.ref()["&="](a);
00369 }
00370
00371 void assign_or(const var & a)
00372 {
00373 m_object.ref()["|="](a);
00374 }
00375
00376 void assign_xor(const var & a)
00377 {
00378 m_object.ref()["^="](a);
00379 }
00380 };
00381 }
00382 }
00383
00384
00385 var dynamic::dispatcher(const var & object)
00386 {
00387 return new types::dispatcher_impl(object);
00388 }