mxWrap.h // mxWrap.h: interface for the mxWrap class. // // #if !defined(AFX_MXWRAP_H__B2D91E17_C0D5_4A55_A321_C87BE1C6ABAE__INCLUDED_) #define AFX_MXWRAP_H__B2D91E17_C0D5_4A55_A321_C87BE1C6ABAE__INCLUDED_ /************************************************************************/ /* matlab&c++ author:san address:南京航空航天大学 CEPE 202 EMAIL:visualsan@yahoo.cn This file is part of matlab&c++ interface. feel easy to use it. san. 2010.3. */ /************************************************************************/ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "ImxArray.h" class MAT_API mxWrap { public: mxWrap(); mxWrap(mxArray*); mxWrap(const mxWrap&); //value mxWrap(double );//double mxWrap(bool ); //bool mxWrap(char* ); //string //matrix mxWrap(int m,int n, bool* ); //string mxWrap(int m,int n, char*); // mxWrap(int m,int n, double*); // mxWrap(int m,int n, float*); // mxWrap(int m,int n, int*); // mxWrap(int m,int n, unsigned int*); // mxWrap(int m,int n, __int64*); // mxWrap(int m,int n, unsigned __int64*); // //array mxWrap(mwSize dim,mwSize dims[], bool* ); //string mxWrap(mwSize dim,mwSize dims[], char*); // mxWrap(mwSize dim,mwSize dims[], double*); // mxWrap(mwSize dim,mwSize dims[], float*); // mxWrap(mwSize dim,mwSize dims[], int*); // mxWrap(mwSize dim,mwSize dims[], unsigned int*); // mxWrap(mwSize dim,mwSize dims[], __int64*); // mxWrap(mwSize dim,mwSize dims[], unsigned __int64*); // // const mxArray* operator&(); // const mxArray* operator->(); const mxWrap& operator=(mxArray*); const mxWrap& operator=(mxWrap&); virtual ~mxWrap(); // void SetArray(mxArray*,bool bCopy=0); mxArray* GetArray(); const GetDataType(); ImxArray*GetArrayInterface(); private: ImxArray* m_pArray; }; #endif // !defined(AFX_MXWRAP_H__B2D91E17_C0D5_4A55_A321_C87BE1C6ABAE__INCLUDED_) mxWrap.cpp // mxWrap.cpp: implementation of the mxWrap class. // // /************************************************************************/ /* matlab&c++ author:san address:南京航空航天大学 CEPE 202 EMAIL:visualsan@yahoo.cn This file is part of matlab&c++ interface. feel easy to use it. san. 2010.3. */ /************************************************************************/ #include "mxWrap.h" #include "xDouble.h" #include "xString.h" #include "xBool.h" #include "xMatrix.h" #include "xArray.h" #include "xInt.h" #include "xStruct.h" // // Construction/Destruction // mxWrap::~mxWrap() { if(m_pArray) delete m_pArray; } mxWrap::mxWrap() { m_pArray=NULL; } mxWrap::mxWrap(mxArray*d) { m_pArray=NULL; SetArray(d); } mxWrap::mxWrap(const mxWrap&d) { m_pArray=NULL; SetArray( mxDuplicateArray(d.m_pArray->GetArray())); } //value mxWrap::mxWrap(double d)//double { m_pArray=new xDouble(d); } mxWrap::mxWrap(bool d) //bool { m_pArray=new xBool(d); } mxWrap::mxWrap(char* d) //string { m_pArray=new xString(d); } //matrix mxWrap::mxWrap(int m,int n, bool* d) //string { m_pArray=new xMatrixBool(m,n,d); } mxWrap::mxWrap(int m,int n, char*d) // { m_pArray=new xMatrixChar(m,n,d); } mxWrap::mxWrap(int m,int n, double*d)// { m_pArray=new xMatrixDouble(m,n,d); } mxWrap::mxWrap(int m,int n, float*d) // { m_pArray=new xMatrixFloat(m,n,d); } mxWrap::mxWrap(int m,int n, int*d) // { m_pArray=new xMatrixInt(m,n,d); } mxWrap::mxWrap(int m,int n, unsigned int*d) // { m_pArray=new xMatrixUInt(m,n,d); } mxWrap::mxWrap(int m,int n, __int64*d) // { m_pArray=new xMatrixInt64(m,n,d); } mxWrap::mxWrap(int m,int n, unsigned __int64*d) // { m_pArray=new xMatrixUInt64(m,n,d); } //array mxWrap::mxWrap(mwSize dim,mwSize dims[], bool* d) //string { m_pArray=new xArrayBool(dim,dims,d); } mxWrap::mxWrap(mwSize dim,mwSize dims[], char*d) // { m_pArray=new xArrayChar(dim,dims,d); } mxWrap::mxWrap(mwSize dim,mwSize dims[], double*d)// { m_pArray=new xArrayDouble(dim,dims,d); } mxWrap::mxWrap(mwSize dim,mwSize dims[], float*d) // { m_pArray=new xArrayFloat(dim,dims,d); } mxWrap::mxWrap(mwSize dim,mwSize dims[], int*d) // { m_pArray=new xArrayInt(dim,dims,d); } mxWrap::mxWrap(mwSize dim,mwSize dims[], unsigned int*d) // { m_pArray=new xArrayUInt(dim,dims,d); } mxWrap::mxWrap(mwSize dim,mwSize dims[], __int64*d) // { m_pArray=new xArrayInt64(dim,dims,d); } mxWrap::mxWrap(mwSize dim,mwSize dims[], unsigned __int64*d) // { m_pArray=new xArrayUInt64(dim,dims,d); } mxArray* mxWrap::GetArray() { return m_pArray->GetArray(); } ImxArray*mxWrap::GetArrayInterface() { return m_pArray; } const mxWrap::GetDataType() { if(m_pArray) return m_pArray->GetType(); return -1; } void mxWrap::SetArray(mxArray*pArray,bool bCopy) { #define TEST(str) //printf("%d/n",str); if (pArray) { if(bCopy) pArray = mxDuplicateArray(pArray); if(m_pArray) delete m_pArray; m_pArray=NULL; //获得维数 mwSize dim=mxGetNumberOfDimensions(pArray); const mwSize *dims=mxGetDimensions(pArray); TEST(dim); if(dim==2&&dims[0]==1&&dims[1]==1&&!mxIsChar(pArray))//value { if(mxIsDouble(pArray))//double { m_pArray = new xDouble; m_pArray->SetArray(pArray); TEST(1); } else if(mxIsSingle(pArray))//float { m_pArray = new xFloat; m_pArray->SetArray(pArray); TEST(12); } else if(mxIsLogical(pArray))//bool { m_pArray = new xBool; m_pArray->SetArray(pArray); TEST(2); } else if(mxIsInt32(pArray))//int { m_pArray = new xInt(0); m_pArray->SetArray(pArray); TEST(2); }else if(mxIsUint32(pArray))//unsigned int { m_pArray = new xUInt(0); m_pArray->SetArray(pArray); TEST(2); } else if(mxIsInt64(pArray))//int64 { m_pArray = new xInt64(0); m_pArray->SetArray(pArray); TEST(2); }else if(mxIsUint64(pArray))//unsigned int64 { m_pArray = new xUInt64(0); m_pArray->SetArray(pArray); TEST(2); } else if(mxIsStruct(pArray))//STRUCT { m_pArray = new xStruct(0); m_pArray->SetArray(pArray); TEST(22); } } else if(dim==2&&dims[0]==1&&dims[1]>=1&&mxIsChar(pArray))//value { m_pArray = new xString; m_pArray->SetArray(pArray); TEST(3); } else if(dim==2&& dims[0]*dims[1]>1 )//matrix { if(mxIsDouble(pArray)) { m_pArray = new xMatrixDouble; m_pArray->SetArray(pArray); TEST(4); } else if(mxIsChar(pArray)) { m_pArray = new xMatrixChar; m_pArray->SetArray(pArray); TEST(5); } else if(mxIsLogical(pArray)) { m_pArray = new xMatrixBool; m_pArray->SetArray(pArray); TEST(6); } else if(mxIsSingle(pArray)) { m_pArray = new xMatrixFloat; m_pArray->SetArray(pArray); TEST(7); }else if(mxIsInt32(pArray)) { m_pArray = new xMatrixInt; m_pArray->SetArray(pArray); TEST(8); }else if(mxIsUint32(pArray)) { m_pArray = new xMatrixUInt; m_pArray->SetArray(pArray); TEST(9); } else if(mxIsInt64(pArray)) { m_pArray = new xMatrixInt64; m_pArray->SetArray(pArray); TEST(10); } else if(mxIsUint64(pArray)) { m_pArray = new xMatrixUInt64; m_pArray->SetArray(pArray); TEST(11); } } else if(dim>2)//array { if(mxIsDouble(pArray)) { m_pArray = new xArrayDouble; m_pArray->SetArray(pArray); TEST(12); } else if(mxIsChar(pArray)) { m_pArray = new xArrayChar; m_pArray->SetArray(pArray); TEST(13); } else if(mxIsLogical(pArray)) { m_pArray = new xArrayBool; m_pArray->SetArray(pArray); TEST(14); } else if(mxIsSingle(pArray)) { m_pArray = new xArrayFloat; m_pArray->SetArray(pArray); TEST(15); }else if(mxIsInt32(pArray)) { m_pArray = new xArrayInt; m_pArray->SetArray(pArray); TEST(16); }else if(mxIsUint32(pArray)) { m_pArray = new xArrayUInt; m_pArray->SetArray(pArray); TEST(17); } else if(mxIsInt64(pArray)) { m_pArray = new xArrayInt64; m_pArray->SetArray(pArray); TEST(18); } else if(mxIsUint64(pArray)) { m_pArray = new xArrayUInt64; m_pArray->SetArray(pArray); TEST(19); } } } } /*const mxArray* mxWrap::operator&() { return GetArray(); } const mxArray* mxWrap::operator->() { return GetArray(); }*/ const mxWrap& mxWrap::operator=(mxArray*v) { SetArray(v,0); return *this; } const mxWrap& mxWrap::operator=(mxWrap&v) { SetArray(v.GetArray(),1); return *this; }