00001 #ifndef __XTENDED__ 00002 #define __XTENDED__ 00003 00004 // xtended 00005 #include "tlib.hh" 00006 #include "sigtype.hh" 00007 #include "klass.hh" 00008 #include "sigvisitor.hh" 00009 #include <vector> 00010 #include "lateq.hh" 00011 00012 class xtended 00013 { 00014 Symbol* fSymbol; 00015 public: 00016 00017 00018 xtended (const char* name) : 00019 fSymbol(::symbol(name)) { 00020 setUserData(fSymbol, (void*)this); 00021 } 00022 virtual ~xtended() { setUserData(fSymbol, 0); } 00023 00024 Sym symbol() { return fSymbol; } 00025 const char * name () { return ::name(fSymbol); } 00026 00027 Tree box () { 00028 Tree b = tree(fSymbol); 00029 assert(getUserData(b) != 0); 00030 return b; 00031 } 00032 00033 // virtual method to be implemented by subclasses 00034 virtual unsigned int arity () = 0; 00035 virtual string generateCode (Klass* klass, const vector<string>& args, const vector<Type>& types) = 0; 00036 virtual string generateLateq (Lateq* lateq, const vector<string>& args, const vector<Type>& types) = 0; 00037 virtual int infereSigOrder (const vector<int>& args) = 0; 00038 virtual Type infereSigType (const vector<Type>& args) = 0; 00039 virtual Tree computeSigOutput (const vector<Tree>& args) = 0; 00040 virtual bool needCache () = 0; 00041 00042 virtual bool isSpecialInfix() { return false; } 00043 }; 00044 00045 // -- Trigonometric Functions 00046 00047 extern xtended* gAcosPrim; 00048 extern xtended* gAsinPrim; 00049 extern xtended* gAtanPrim; 00050 extern xtended* gAtan2Prim; 00051 00052 extern xtended* gSinPrim; 00053 extern xtended* gCosPrim; 00054 extern xtended* gTanPrim; 00055 00056 00057 // -- Exponential Functions 00058 00059 extern xtended* gExpPrim; 00060 extern xtended* gLogPrim; 00061 extern xtended* gLog10Prim; 00062 extern xtended* gPowPrim; 00063 00064 extern xtended* gSqrtPrim; 00065 extern xtended* gCbrtPrim; 00066 extern xtended* gHypotPrim; 00067 extern xtended* gLdexpPrim; 00068 extern xtended* gScalbPrim; 00069 extern xtended* gLog1pPrim; 00070 extern xtended* gLogbPrim; 00071 extern xtended* gIlogbPrim; 00072 extern xtended* gExpm1Prim; 00073 00074 00075 // -- Hyperbolic Functions 00076 00077 extern xtended* gAcoshPrim; 00078 extern xtended* gAsinhPrim; 00079 extern xtended* gAtanhPrim; 00080 00081 extern xtended* gSinhPrim; 00082 extern xtended* gCoshPrim; 00083 extern xtended* gTanhPrim; 00084 00085 00086 // -- Remainder Functions 00087 00088 extern xtended* gFmodPrim; 00089 extern xtended* gRemainderPrim; 00090 00091 // -- Nearest Integer Functions 00092 00093 extern xtended* gFloorPrim; 00094 extern xtended* gCeilPrim; 00095 extern xtended* gRintPrim; 00096 00097 00098 // -- Miscellaneous Functions 00099 00100 extern xtended* gAbsPrim; 00101 extern xtended* gMaxPrim; 00102 extern xtended* gMinPrim; 00103 00104 #endif