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