00001
00002
00003
00004
00005
00006
00007
00008 #ifndef _IMPULSE_FLOAT_H_
00009 #define _IMPULSE_FLOAT_H_
00010
00011 #include <cmath>
00012 #include <limits>
00013
00014 #include "../impulse.h"
00015
00016 namespace impulse {
00017
00018
00019
00020
00021
00026
00027 class Float : public Frame {
00028
00029 public:
00030
00031 Float() { }
00032
00033 void initSlots()
00034 {
00035
00036 setSlot( Symbol::at("+"), new Method<Float>( "+", &Float::_add_, _LitNum_.getFrame() ) );
00037 setSlot( Symbol::at("-"), new Method<Float>( "-", &Float::_sub_, _LitNum_.getFrame() ) );
00038 setSlot( Symbol::at("*"), new Method<Float>( "*", &Float::_mul_, _LitNum_.getFrame() ) );
00039 setSlot( Symbol::at("/"), new Method<Float>( "/", &Float::_div_, _LitNum_.getFrame() ) );
00040
00041 setSlot( Symbol::at("sin"), new Method<Float>( "sin", &Float::_sin ) );
00042 setSlot( Symbol::at("cos"), new Method<Float>( "cos", &Float::_cos ) );
00043 setSlot( Symbol::at("pow"), new Method<Float>( "pow", &Float::_pow_ ) );
00044 setSlot( Symbol::at("abs"), new Method<Float>( "abs", &Float::_abs ) );
00045 }
00046
00047 string inspect() { return "[Float]"; }
00048
00049 double abs( double value );
00050
00051 protected:
00052
00053 Value _add_( Array& args, Value self ) { return self.getFloat() + args.at(0).getFloat(); }
00054 Value _sub_( Array& args, Value self ) { return self.getFloat() - args.at(0).getFloat(); }
00055 Value _mul_( Array& args, Value self ) { return self.getFloat() * args.at(0).getFloat(); }
00056 Value _div_( Array& args, Value self ) { return self.getFloat() / args.at(0).getFloat(); }
00057 Value _add_nil( Array& args, Value self ) { cout << "!!!" << endl; return self.getFloat() + args.at(0).getFloat(); }
00058
00059 Value _sin( Array& args, Value self ) { return ::sin( self.getFloat() ); }
00060 Value _cos( Array& args, Value self ) { return ::cos( self.getFloat() ); }
00061 Value _pow_( Array& args, Value self ) { return ::pow( self.getFloat(), args.at(0).getFloat() ); }
00062 Value _abs( Array& args, Value self ) { return abs( self.getFloat() ); }
00063
00064 private:
00065
00066 friend class FloatTest;
00067
00068 };
00069
00070
00071
00072
00073
00074 double Float::abs( double value )
00075 {
00076 BEG( "Float::abs( value = " << value << " )" );
00077
00078 double result = value < 0 ? value * -1.0 : value;
00079
00080 END( result );
00081
00082 return result;
00083 }
00084
00085 }
00086
00087 #endif