00001 // Copyright (C) Calum Grant 2008 00002 00003 #include "cppscript" 00004 #include "dynamic/extensions.hpp" 00005 00006 static_call( register_pickle_type( cmp_double, 0.0 ) ); 00007 00008 namespace dynamic 00009 { 00010 namespace types 00011 { 00013 00014 class double_impl : public dynamic::var_impl 00015 { 00016 double d; 00017 public: 00018 double_impl(double d) : d(d) { } 00019 00020 double_impl(const double_impl&d) : d(d.d) { } 00021 00022 void output(ostream & ss) 00023 { 00024 ss << d; 00025 } 00026 00027 void output(wostream & ss) 00028 { 00029 ss << d; 00030 } 00031 00032 std::string class_name() { return "double"; } 00033 00034 int as_int() 00035 { 00036 return int(d); 00037 } 00038 00039 double as_double() 00040 { 00041 return d; 00042 } 00043 00044 bool as_bool() 00045 { 00046 return d != 0.0; 00047 } 00048 00049 var op_neg() 00050 { 00051 return -d; 00052 } 00053 00054 var op_add(const var & v) 00055 { 00056 return d + v.as_double(); 00057 } 00058 00059 var op_sub(const var & v) 00060 { 00061 return d - v.as_double(); 00062 } 00063 00064 var op_mul(const var & v) 00065 { 00066 return d * v.as_double(); 00067 } 00068 00069 var op_div(const var & v) 00070 { 00071 return d / v.as_double(); 00072 } 00073 00074 void op_inc() { ++d; } 00075 void op_dec() { --d; } 00076 00077 var_cmp_index comparison_index() { return cmp_double; } 00078 00079 var_cmp_result compare2(const var & v) 00080 { 00081 double diff = d - v.as_double(); 00082 if(diff<0) return cmp_lt; 00083 if(diff>0) return cmp_gt; 00084 return cmp_equal; 00085 } 00086 00087 void copy_to(void * dest) const 00088 { 00089 new(dest) double_impl(*this); 00090 } 00091 00092 void assign_add(const var & v) 00093 { 00094 d += v.as_double(); 00095 } 00096 00097 void assign_sub(const var & v) 00098 { 00099 d -= v.as_double(); 00100 } 00101 00102 void assign_mul(const var & v) 00103 { 00104 d *= v.as_double(); 00105 } 00106 00107 void assign_div(const var & v) 00108 { 00109 d /= v.as_double(); 00110 } 00111 00112 void pickle(pickler & p) 00113 { 00114 p.write_object_type(cmp_double); 00115 p.write_double(d); 00116 } 00117 00118 void unpickle(unpickler & u) 00119 { 00120 d = u.read_double(); 00121 } 00122 }; 00123 } 00124 } 00125 00126 00127 var::var(double d) : m_variant(types::double_impl(d)) 00128 { 00129 }
1.5.7.1