00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <map>
00018 #include "PData.h"
00019 #include "PDataOperator.h"
00020 #include "PDataArithmetic.h"
00021
00022 #ifndef PDATA_CONTAINER
00023 #define PDATA_CONTAINER
00024
00025 using namespace std;
00026
00027 namespace Fluxus
00028 {
00029
00043 class PDataContainer
00044 {
00045 public:
00046 PDataContainer();
00047 PDataContainer(const PDataContainer &other);
00048 virtual ~PDataContainer();
00049 virtual PDataContainer *Clone() const=0;
00050
00052 void Clear();
00053
00056 void AddData(const string &name, PData* pd);
00057
00060 void CopyData(const string &name, string newname);
00061
00065 template<class T> vector<T>* GetDataVec(const string &name);
00066
00068 void RemoveDataVec(const string &name);
00069
00072 bool GetDataInfo(const string &name, char &type, unsigned int &size);
00073
00076 template<class T> void SetData(const string &name, unsigned int index, T s);
00077
00080 template<class T> T GetData(const string &name, unsigned int index);
00081
00083 template<class T> PData *DataOp(const string &op, const string &name, T operand);
00084
00086 PData* GetDataRaw(const string &name);
00087
00089 void SetDataRaw(const string &name, PData* pd);
00090
00093 template <class S, class T> PData *FindOperate(const string &name, TypedPData<S> *a, T b);
00094
00096 void Resize(unsigned int size);
00097
00099 unsigned int Size();
00100
00101 protected:
00102
00104 virtual void PDataDirty()=0;
00105
00107 map<string,PData*> m_PData;
00108
00109 };
00110
00111 template<class T>
00112 void PDataContainer::SetData(const string &name, unsigned int index, T s)
00113 {
00114 dynamic_cast<TypedPData<T>*>(m_PData[name])->m_Data[index]=s;
00115 }
00116
00117 template<class T>
00118 T PDataContainer::GetData(const string &name, unsigned int index)
00119 {
00120 return dynamic_cast<TypedPData<T>*>(m_PData[name])->m_Data[index];
00121 }
00122
00123 template<class T>
00124 vector<T>* PDataContainer::GetDataVec(const string &name)
00125 {
00126 map<string,PData*>::iterator i=m_PData.find(name);
00127 if (i==m_PData.end())
00128 {
00129 Trace::Stream<<"Primitive::GetPDataVec: pdata: "<<name<<" doesn't exists"<<endl;
00130 return NULL;
00131 }
00132
00133 TypedPData<T> *ptr=dynamic_cast<TypedPData<T> *>(i->second);
00134 if (!ptr)
00135 {
00136 Trace::Stream<<"Primitive::GetPDataVec: pdata: "<<name<<" is not of type: "<<typeid(TypedPData<T>).name()<<endl;
00137 return NULL;
00138 }
00139
00140 return &ptr->m_Data;
00141 }
00142
00143 template<class T>
00144 PData *PDataContainer::DataOp(const string &op, const string &name, T operand)
00145 {
00146 map<string,PData*>::iterator i=m_PData.find(name);
00147 if (i==m_PData.end())
00148 {
00149 Trace::Stream<<"Primitive::DataOp: pdata: "<<name<<" doesn't exists"<<endl;
00150 return NULL;
00151 }
00152
00153 TypedPData<dVector> *data = dynamic_cast<TypedPData<dVector>*>(i->second);
00154 if (data) return FindOperate<dVector,T>(op, data, operand);
00155 else
00156 {
00157 TypedPData<dColour> *data = dynamic_cast<TypedPData<dColour>*>(i->second);
00158 if (data) return FindOperate<dColour, T>(op, data, operand);
00159 else
00160 {
00161 TypedPData<float> *data = dynamic_cast<TypedPData<float>*>(i->second);
00162 if (data) return FindOperate<float, T>(op, data, operand);
00163 else
00164 {
00165 TypedPData<dMatrix> *data = dynamic_cast<TypedPData<dMatrix>*>(i->second);
00166 if (data) return FindOperate<dMatrix, T>(op, data, operand);
00167 }
00168 }
00169 }
00170
00171 return NULL;
00172 }
00173
00174 template <class S, class T>
00175 PData *PDataContainer::FindOperate(const string &name, TypedPData<S> *a, T b)
00176 {
00177 if (name=="+") return AddOperator::Operate<S,T>(a,b);
00178 else if (name=="*") return MultOperator::Operate<S,T>(a,b);
00179 else if (name=="closest") return ClosestOperator::Operate<S,T>(a,b);
00180 else if (name=="sin") return SineOperator::Operate<S,T>(a,b);
00181 else if (name=="cos") return CosineOperator::Operate<S,T>(a,b);
00182
00183 Trace::Stream<<"operator "<<name<<" not found"<<endl;
00184 return NULL;
00185 }
00186
00187 };
00188
00189 #endif