00001
00002
00003 namespace dynamic
00004 {
00005 namespace internal
00006 {
00007 template<typename T> class var_member;
00008 }
00009
00011
00012 typedef var (*f0)();
00013 typedef var (*f1)(var);
00014 typedef var (*f2)(var,var);
00015 typedef var (*f3)(var,var,var);
00016 typedef var (*f4)(var,var,var,var);
00017 typedef var (*f5)(var,var,var,var,var);
00018 typedef var (*f6)(var,var,var,var,var,var);
00019 typedef var (*f7)(var,var,var,var,var,var,var);
00020 typedef var (*f8)(var,var,var,var,var,var,var,var);
00021 typedef var (*f9)(var,var,var,var,var,var,var,var,var);
00022 typedef var (*f10)(var,var,var,var,var,var,var,var,var,var);
00023
00025
00026 typedef void (*vf0)();
00027 typedef void (*vf1)(var);
00028 typedef void (*vf2)(var,var);
00029 typedef void (*vf3)(var,var,var);
00030 typedef void (*vf4)(var,var,var,var);
00031 typedef void (*vf5)(var,var,var,var,var);
00032 typedef void (*vf6)(var,var,var,var,var,var);
00033 typedef void (*vf7)(var,var,var,var,var,var,var);
00034 typedef void (*vf8)(var,var,var,var,var,var,var,var);
00035 typedef void (*vf9)(var,var,var,var,var,var,var,var,var);
00036 typedef void (*vf10)(var,var,var,var,var,var,var,var,var,var);
00037
00038
00040
00045 class DYNAMIC_API var : public internal::var_methods<var, const var &>
00046 {
00047 public:
00049 mutable var_variant m_variant;
00050
00051 public:
00053 template<typename T>
00054 var(const internal::var_member<T>&);
00055
00057 var();
00058
00060 var(shared_var_impl * i);
00061
00063 struct assign_impl { };
00064
00066
00067 template<typename T>
00068 var(const T & impl, assign_impl) : m_variant(impl)
00069 {
00070 }
00071
00073 var(const char * str);
00074
00076 var(const std::string & str);
00077
00079 var(const wchar_t * str);
00080
00082 var(const wstring & str);
00083
00085 var(int i);
00086
00088 var(double d);
00089
00091 var(char ch);
00092
00094 var(wchar_t wc);
00095
00097 var(bool b);
00098
00100 var(f0);
00101
00103 var(f1);
00104
00106 var(f2);
00107
00109 var(f3);
00110
00112 var(f4);
00113
00115 var(f5);
00116
00118 var(f6);
00119
00121 var(f7);
00122
00124 var(f8);
00125
00127 var(f9);
00128
00130 var(f10);
00131
00133 var(vf0);
00134
00136 var(vf1);
00137
00139 var(vf2);
00140
00142 var(vf3);
00143
00145 var(vf4);
00146
00148 var(vf5);
00149
00151 var(vf6);
00152
00154 var(vf7);
00155
00157 var(vf8);
00158
00160 var(vf9);
00161
00163 var(vf10);
00164
00166 template<std::size_t N>
00167 var(var(&list)[N]) : m_variant(array_it(list, list+N).m_variant)
00168 { }
00169
00171 var(const internal::extender&);
00172
00174 template<typename T>
00175 var & operator=(T const & t)
00176 {
00177 *this = var(t);
00178 return *this;
00179 }
00180
00182 internal::var_member<const char*> operator[](const char * m) const;
00183
00185 internal::var_member<var> operator[](const var &) const;
00186
00188 internal::var_member<int> operator[](int) const;
00189
00191 typedef var iterator;
00192
00194 typedef var const_iterator;
00195
00197 typedef std::size_t size_type;
00198
00200 typedef std::ptrdiff_t difference_type;
00201
00203 typedef var reverse_iterator;
00204
00206 typedef var const_reverse_iterator;
00207
00209 var_impl & impl() const
00210 { return *m_variant; }
00211
00213 const var & deref() const
00214 { return *this; }
00215
00217
00218 typedef std::bidirectional_iterator_tag iterator_category;
00219
00221 typedef var value_type;
00222
00224 typedef var * pointer;
00225
00227 typedef var & reference;
00228
00230 var operator+() const
00231 { return impl().op_pos(); }
00232
00234 var operator-() const
00235 { return impl().op_neg(); }
00236
00238 var operator~() const
00239 { return impl().op_inv(); }
00240
00242 template<typename T> var operator+(const T&t) const
00243 { return impl().op_add(t); }
00244
00246 template<typename T> var operator-(const T&t) const
00247 { return impl().op_sub(t); }
00248
00250 template<typename T> var operator/(const T&t) const
00251 { return impl().op_div(t); }
00252
00254 template<typename T> var operator%(const T&t) const
00255 { return impl().op_mod(t); }
00256
00258 template<typename T> var operator|(const T&t) const
00259 { return impl().op_or(t); }
00260
00262 template<typename T> var operator&(const T&t) const
00263 { return impl().op_and(t); }
00264
00266 template<typename T> var operator^(const T&t) const
00267 { return impl().op_xor(t); }
00268
00270 template<typename T> var operator<<(const T&t) const
00271 { return impl().op_lshift(t); }
00272
00274 template<typename T> var operator>>(const T&t) const
00275 { return impl().op_rshift(t); }
00276
00278 template<typename T> var & operator+=(const T&t)
00279 { impl().assign_add(t); return *this; }
00280
00282 template<typename T> var & operator-=(const T&t)
00283 { impl().assign_sub(t); return *this; }
00284
00286 template<typename T> var & operator*=(const T&t)
00287 { impl().assign_mul(t); return *this; }
00288
00290 template<typename T> var & operator/=(const T&t)
00291 { impl().assign_div(t); return *this; }
00292
00294 template<typename T> var & operator%=(const T&t)
00295 { impl().assign_mod(t); return *this; }
00296
00298 template<typename T> var & operator<<=(const T&t)
00299 { impl().assign_lshift(t); return *this; }
00300
00302 template<typename T> var & operator>>=(const T&t)
00303 { impl().assign_rshift(t); return *this; }
00304
00306 template<typename T> var & operator&=(const T&t)
00307 { impl().assign_and(t); return *this; }
00308
00310 template<typename T> var & operator|=(const T&t)
00311 { impl().assign_or(t); return *this; }
00312
00314 template<typename T> var & operator^=(const T&t)
00315 { impl().assign_xor(t); return *this; }
00316 };
00317
00318
00319 typedef std::basic_ostream<wchar_t> wostream;
00320
00322 DYNAMIC_API std::ostream & operator<<(std::ostream & os, var const & a);
00323
00325 DYNAMIC_API wostream & operator<<(wostream & os, var const & a);
00326
00327
00328 namespace internal
00329 {
00331
00332 class var_deref
00333 {
00334 var m_v;
00335 public:
00336 var_deref(const var & v) : m_v(v)
00337 { }
00338
00339 var * operator->()
00340 { return &m_v; }
00341 };
00342 }
00343 }