00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 #include "PDataContainer.h"
00018 
00019 using namespace Fluxus;
00020 
00021 PDataContainer::PDataContainer() 
00022 {
00023 }
00024 
00025 PDataContainer::PDataContainer(const PDataContainer &other) 
00026 {
00027     Clear();
00028     for (map<string,PData*>::const_iterator i=other.m_PData.begin(); 
00029         i!=other.m_PData.end(); i++)
00030     {
00031         m_PData[i->first] = i->second->Copy();
00032     }
00033 }
00034 
00035 PDataContainer::~PDataContainer() 
00036 {
00037     Clear();
00038 }
00039 
00040 void PDataContainer::Clear()
00041 {
00042     for (map<string,PData*>::iterator i=m_PData.begin(); i!=m_PData.end(); i++)
00043     {
00044         delete i->second;
00045     }
00046 }   
00047 
00048 void PDataContainer::Resize(unsigned int size)
00049 {
00050     for (map<string,PData*>::iterator i=m_PData.begin(); i!=m_PData.end(); i++)
00051     {
00052         i->second->Resize(size);
00053     }
00054 }
00055 
00056     
00057 unsigned int PDataContainer::Size()
00058 {
00059     if (!m_PData.empty())
00060     {
00061         return m_PData.begin()->second->Size();
00062     }
00063     
00064     return 0;
00065 }
00066 
00067 bool PDataContainer::GetDataInfo(const string &name, char &type, unsigned int &size)
00068 {
00069     map<string,PData*>::iterator i=m_PData.find(name);
00070     if (i==m_PData.end())
00071     {
00072         return false;
00073     }
00074     
00075     size=i->second->Size();
00076     
00077     TypedPData<dVector> *data = dynamic_cast<TypedPData<dVector>*>(i->second);  
00078     if (data) type='v';
00079     else
00080     {
00081         TypedPData<dColour> *data = dynamic_cast<TypedPData<dColour>*>(i->second);
00082         if (data) type='c';
00083         else 
00084         {
00085             TypedPData<float> *data = dynamic_cast<TypedPData<float>*>(i->second);
00086             if (data) type='f';
00087             else 
00088             {
00089                 TypedPData<dMatrix> *data = dynamic_cast<TypedPData<dMatrix>*>(i->second);
00090                 if (data) type='m';
00091             }
00092         }
00093     }
00094         
00095     return true;
00096 }
00097     
00098 void PDataContainer::AddData(const string &name, PData* pd)
00099 {
00100     map<string,PData*>::iterator i=m_PData.find(name);
00101     if (i!=m_PData.end())
00102     {
00103         Trace::Stream<<"Primitive::AddData: pdata: "<<name<<" already exists"<<endl;
00104         return;
00105     }
00106     
00107     m_PData[name]=pd;
00108 }
00109 
00110 void PDataContainer::CopyData(const string &name, string newname)
00111 {
00112     map<string,PData*>::iterator i=m_PData.find(name);
00113     if (i==m_PData.end())
00114     {
00115         Trace::Stream<<"Primitive::CopyData: pdata source: "<<name<<" doesn't exist"<<endl;
00116         return;
00117     }
00118     
00119     
00120     map<string,PData*>::iterator oldi=m_PData.find(newname);
00121     if (oldi!=m_PData.end())
00122     {
00123         delete oldi->second;
00124     }
00125     
00126     m_PData[newname]=i->second->Copy();
00127     
00128     PDataDirty();
00129 }
00130 
00131 void PDataContainer::RemoveDataVec(const string &name)
00132 {
00133     map<string,PData*>::iterator i=m_PData.find(name);
00134     if (i==m_PData.end())
00135     {
00136         Trace::Stream<<"Primitive::RemovePDataVec: pdata: "<<name<<" doesn't exist"<<endl;
00137         return;
00138     }
00139     
00140     delete i->second;
00141     m_PData.erase(i);
00142 }
00143 
00144 PData* PDataContainer::GetDataRaw(const string &name)
00145 {
00146     map<string,PData*>::iterator i=m_PData.find(name);
00147     if (i==m_PData.end())
00148     {
00149         return NULL;
00150     }
00151     
00152     return i->second;
00153 }
00154 
00155 void PDataContainer::SetDataRaw(const string &name, PData* pd)
00156 {
00157     map<string,PData*>::iterator i=m_PData.find(name);
00158     if (i==m_PData.end())
00159     {
00160         Trace::Stream<<"Primitive::SetDataRaw: pdata: "<<name<<" doesn't exist"<<endl;
00161         return;
00162     }
00163     delete i->second;
00164     i->second = pd;
00165     PDataDirty();
00166 }