00001 // 00002 // core/value.h 00003 // 00004 // Copyright (c) 2008-2009, Mike Austin 00005 // All rights reserved. 00006 // 00007 00008 #ifndef _IMPULSE_VALUE_H_ 00009 #define _IMPULSE_VALUE_H_ 00010 00011 #include <string> 00012 00013 #include "../impulse.h" 00014 00015 namespace impulse { 00016 00017 // 00018 // class Value 00019 // 00020 00026 00027 class Value_data { 00028 00029 public: 00030 00031 Value_data(); 00032 Value_data( double value ); 00033 Value_data( string value ); 00034 Value_data( Frame* frame ); 00035 00036 Frame* getFrame() { return _frame; } 00037 double getFloat() { return _float; } 00038 template <typename T> 00039 T* get() { return dynamic_cast<T*>( getFrame() ); } 00040 00041 private: 00042 00043 Frame* _frame; 00044 union { 00045 double _float; 00046 struct { 00047 short x; short y; 00048 }; 00049 }; 00050 00051 }; 00052 00053 class Value : public Value_data { 00054 00055 public: 00056 00057 Value(); 00058 Value( double value ); 00059 Value( string value ); 00060 Value( Frame* value ); 00061 00062 Value getSlot( Symbol& symbol ); 00063 Value setSlot( Symbol& symbol, Value value ); 00064 00065 Value eval( Array& args, Value self ); 00066 Value send( Symbol& selector, Array& args ); 00067 00068 string inspect(); 00069 00070 void incrRef(); 00071 void decrRef(); 00072 00073 }; 00074 00075 // 00076 // class val 00077 // 00078 // val is a subclass of Value, which supports standard math operations and provides convenience 00079 // functions. It can be thought of as an "any type" or "variant" that can store any type. 00080 // 00081 00082 } 00083 00084 #endif