00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 #include "PDataOperator.h"
00019 
00020 #ifndef N_PDATA_ARITH_OPERATOR
00021 #define N_PDATA_ARITH_OPERATOR
00022 
00023 using namespace std;
00024 
00025 namespace Fluxus
00026 {
00027 
00033 
00038 class AddOperator : public PDataOperator
00039 {
00040 public:
00041     AddOperator() {}
00042     
00043     template <class S, class T>
00044     static PData *Operate(TypedPData<S> *a, T b)
00045     {
00046         Trace::Stream<<"AddOperator has no operator for types: "<<typeid(a).name()<<" and " 
00047             <<typeid(b).name()<<endl;
00048         return NULL;
00049     }
00050     
00051 };
00052 
00053 template<>
00054 PData *AddOperator::Operate(TypedPData<float> *a, float b);
00055 template<>
00056 PData *AddOperator::Operate(TypedPData<dVector> *a, float b);
00057 template<>
00058 PData *AddOperator::Operate(TypedPData<dVector> *a, dVector b);
00059 template<>
00060 PData *AddOperator::Operate(TypedPData<float> *a, TypedPData<float> *b);
00061 template<>
00062 PData *AddOperator::Operate(TypedPData<dVector> *a, TypedPData<float> *b);
00063 template<>
00064 PData *AddOperator::Operate(TypedPData<dVector> *a, TypedPData<dVector> *b);
00065 
00066 class MultOperator : public PDataOperator
00067 {
00068 public:
00069     MultOperator() {}
00070     
00071     template <class S, class T>
00072     static PData *Operate(TypedPData<S> *a, T b)
00073     {
00074         Trace::Stream<<"MultOperator has no operator for types: "<<typeid(a).name()<<" and "    
00075             <<typeid(b).name()<<endl;
00076         return NULL;
00077     }
00078     
00079 };
00080 
00081 template<>
00082 PData *MultOperator::Operate(TypedPData<float> *a, float b);
00083 template<>
00084 PData *MultOperator::Operate(TypedPData<dVector> *a, float b);
00085 template<>
00086 PData *MultOperator::Operate(TypedPData<dColour> *a, float b);
00087 template<>
00088 PData *MultOperator::Operate(TypedPData<dVector> *a, dVector b);
00089 template<>
00090 PData *MultOperator::Operate(TypedPData<float> *a, TypedPData<float> *b);
00091 template<>
00092 PData *MultOperator::Operate(TypedPData<dVector> *a, TypedPData<float> *b);
00093 template<>
00094 PData *MultOperator::Operate(TypedPData<dVector> *a, TypedPData<dVector> *b);
00095 
00096 class SineOperator : public PDataOperator
00097 {
00098 public:
00099     SineOperator() {}
00100     
00101     template <class S, class T>
00102     static PData *Operate(TypedPData<S> *a, T b)
00103     {
00104         Trace::Stream<<"SineOperator has no operator for types: "<<typeid(a).name()<<" and "    
00105             <<typeid(b).name()<<endl;
00106         return NULL;
00107     }
00108     
00109 };
00110 
00111 template<>
00112 PData *SineOperator::Operate(TypedPData<float> *a, TypedPData<float> *b);
00113 
00114 class CosineOperator : public PDataOperator
00115 {
00116 public:
00117     CosineOperator() {}
00118     
00119     template <class S, class T>
00120     static PData *Operate(TypedPData<S> *a, T b)
00121     {
00122         Trace::Stream<<"CosineOperator has no operator for types: "<<typeid(a).name()<<" and "  
00123             <<typeid(b).name()<<endl;
00124         return NULL;
00125     }
00126     
00127 };
00128 
00129 template<>
00130 PData *CosineOperator::Operate(TypedPData<float> *a, TypedPData<float> *b);
00131 
00132 class ClosestOperator : public PDataOperator
00133 {
00134 public:
00135     ClosestOperator() {}
00136     
00137     template <class S, class T>
00138     static PData *Operate(TypedPData<S> *a, T b)
00139     {
00140         Trace::Stream<<"ClosestOperator has no operator for types: "<<typeid(a).name()<<" and " 
00141             <<typeid(b).name()<<endl;
00142         return NULL;
00143     }
00144     
00145 };
00146 
00147 template<>
00148 PData *ClosestOperator::Operate(TypedPData<dVector> *a, dVector b);
00149 template<>
00150 PData *ClosestOperator::Operate(TypedPData<dVector> *a, float b);
00151 
00152 }
00153 
00154 #endif