My Project
 All Classes Files Functions Variables Enumerations Enumerator Friends Macros Pages
MexHandler.h
Go to the documentation of this file.
1 // $Id: MexHandler.h,v 1.4 2010/03/03 18:23:12 eml Exp $
2 
3 #ifndef GCP_MATLAB_MEXHANDLER_H
4 #define GCP_MATLAB_MEXHANDLER_H
5 
15 #include <iostream>
16 #include <cmath>
17 
18 #include "gcp/util/common/Debug.h"
19 #include "gcp/util/common/DataType.h"
20 #include "gcp/util/common/ErrHandler.h"
21 #include "gcp/util/common/Logger.h"
22 #include "gcp/util/common/MonitorDataType.h"
23 #include "gcp/util/common/RegDescription.h"
24 #include "gcp/util/common/RegParser.h"
25 
26 #include "gcp/matlab/common/MexParser.h"
27 
28 #include "mex.h"
29 #include "matrix.h"
30 
31 #include <sstream>
32 
33 #define MXPRINT(statement) \
34 {\
35  std::ostringstream os;\
36  os.str("");\
37  os << statement << std::endl;\
38  mexPrintf(os.str().c_str());\
39 }
40 
41 #define MXPRINTN(statement) \
42 {\
43  std::ostringstream os;\
44  os.str("");\
45  os << statement; \
46  mexPrintf(os.str().c_str());\
47 }
48 
49 
50 namespace gcp {
51 
52  namespace matlab {
53 
54  class MexHandler {
55  public:
56 
57  // Structure to encapsulate a mex array and the data pointer
58  // associated with it.
59 
60  struct MxArray {
61  mxArray* array_;
62  void* vPtr_;
63 
64  MxArray() {
65  array_ = 0;
66  vPtr_ = 0;
67  };
68 
69  // Constructor calls the asignment operator
70 
71  MxArray(mxArray* array) {
72  *this = array;
73  };
74 
75  // Assignment operator
76 
77  void operator=(mxArray* array) {
78  array_ = array;
79  vPtr_ = mxGetData(array);
80  };
81  };
82 
86  MexHandler();
87 
91  virtual ~MexHandler();
92 
93  static mxArray* createMatlabArray(int ndim, const int* dims, gcp::util::DataType::Type dataType);
94  static mxArray* createMatlabArray(int length, gcp::util::DataType::Type dataType);
95  static mxArray* createMatlabArray(int ndim, const int* dims, gcp::util::MonitorDataType& dataType);
96  static mxArray* createMatlabArray(int ndim, const int* dims,
97  gcp::util::MonitorDataType::FormatType formatType);
98 
99  // Assign a return mxArray and return a double pointer to it
100 
101  static double* createDoubleArray(mxArray** mxArray, int ndim, const int* dims);
102  static double* createDoubleArray(mxArray** mxArray, unsigned len);
103  static float* createFloatArray(mxArray** mxArray, int ndim, const int* dims);
104  static double* createDoubleArray(mxArray** mxArray, MexParser& parser);
105 
106  static mxClassID matlabTypeOf(gcp::util::DataType::Type dataType);
107  static mxClassID matlabTypeOf(gcp::util::MonitorDataType& dataType);
108  static mxClassID matlabTypeOf(gcp::util::MonitorDataType::FormatType formatType);
109 
110  static mxComplexity matlabComplexityOf(gcp::util::DataType::Type dataType);
111  static mxComplexity matlabComplexityOf(gcp::util::MonitorDataType& dataType);
112  static mxComplexity matlabComplexityOf(gcp::util::MonitorDataType::FormatType formatType);
113 
114  static mxArray* addRegisterField(mxArray* ptr, gcp::util::RegDescription& reg);
115  static mxArray* addRegisterField(mxArray* ptr, gcp::util::RegDescription& reg, unsigned nElements);
116  static mxArray* addRegisterField(mxArray* ptr, std::string regName, unsigned nElements);
117 
121  static mxArray* createRegValArray(mxArray* ptr,
123  gcp::util::MonitorDataType::FormatType formatType,
124  unsigned nFrame);
125 
126  static mxArray* addHierNamedStructField(mxArray* parentPtr,
127  std::string fieldName,
128  gcp::util::DataType::Type=gcp::util::DataType::NONE,
129  unsigned nDim=0,
130  int* dims=0);
131 
132  static mxArray* addNamedStructField(mxArray* parentPtr, std::string fieldName, unsigned nElement=1, unsigned index=0);
133  static mxArray* addNamedCellField(mxArray* parentPtr, std::string fieldName, unsigned iDim, unsigned index=0);
134 
135  static char* addNamedStringStructField(mxArray* parentPtr, std::string fieldName,
136  unsigned len, unsigned index=0);
137 
138  static char* addNamedStringStructField(mxArray* parentPtr, std::string fieldName,
139  std::string str, unsigned index=0);
140 
141  static mxArray* addNamedStructField(mxArray* parentPtr, std::string fieldName, int ndim, const int* dims, gcp::util::DataType::Type dataType, unsigned index=0);
142 
143  static double* addNamedDoubleStructField(mxArray* parentPtr,
144  std::string fieldName,
145  unsigned nElement, unsigned index=0);
146 
147  static double* addNamedDoubleStructField(mxArray* parentPtr,
148  std::string fieldName,
149  std::vector<int> dims, unsigned index=0);
150 
151  static float* addNamedFloatStructField(mxArray* parentPtr, std::string fieldName,
152  std::vector<int> dims, unsigned index=0);
153 
154  static float* addNamedFloatStructField(mxArray* parentPtr,
155  std::string fieldName,
156  unsigned nElement, unsigned index=0);
157 
158  static unsigned* addNamedUintStructField(mxArray* parentPtr,
159  std::string fieldName,
160  unsigned nElement, unsigned index=0);
161 
162  // Add a named double struct field that has the same dimensions
163  // as the field named in copyName
164 
165  static double* copyNamedDoubleStructField(mxArray* parentPtr, std::string fieldName, std::string copyName);
166 
167  // Create a matlab array appropriate for the numbered column
168  // from a FITS table
169 
170  // Add a named field to the passed structure, and create an
171  // properly-typed array for it
172 
173  static void checkArgs(int nlhsExpected, int nrhsExpected,
174  int nlhsActual, int nrhsActual);
175 
176  static LOG_HANDLER_FN(stdoutPrintFn);
177  static LOG_HANDLER_FN(stderrPrintFn);
178 
179  static ERR_HANDLER_FN(throwFn);
180  static ERR_HANDLER_FN(reportFn);
181  static ERR_HANDLER_FN(logFn);
182 
183  // Utility functions for converting from a "multi-dimensional"
184  // array coordinate into a one-dimensional representation.
185 
186  static unsigned indexStartingWithFastest(std::vector<unsigned>& coord,
187  std::vector<unsigned>& dims);
188 
189  static unsigned indexStartingWithSlowest(std::vector<unsigned>& coord,
190  std::vector<unsigned>& dims);
191 
192  // Return an array of C-order idices for the input dimensions.
193  // Assumes dims is in order from fastest to slowest changing
194  // indices
195 
196  static void getIndicesC(std::vector<unsigned>& cVec,
197  std::vector<unsigned>& cDims);
198 
199 
200  static unsigned getMatlabIndex(unsigned n1, unsigned n2,
201  unsigned i1, unsigned i2);
202 
203  static unsigned getMatlabIndex(unsigned n1, unsigned n2, unsigned n3,
204  unsigned i1, unsigned i2, unsigned i3);
205 
206  // Return an array of C-order idices for the input dimensions.
207  // rAssumes dims is in order from fastest to slowest changing
208  // indices
209 
210  static void getIndicesMatlab(std::vector<unsigned>& mVec,
211  std::vector<unsigned>& mDims);
212 
213  static void getIndicesMatlab(std::vector<unsigned>& mVec,
214  std::vector<int>& mDims);
215 
216  // Recursive function to return an array of C-order and
217  // Matlab-order idices for the input dimensions. Note that the
218  // input dimension array must be in C-style (fastest to slowest)
219  // dimension order
220 
221  static void getIndices(std::vector<unsigned>& cVec, std::vector<unsigned>& mVec,
222  std::vector<unsigned>& dims,
223  int iDim=0, unsigned indLast=0,
224  unsigned nLast=0, unsigned baseLast=0);
225 
226  private:
227 
228  static std::vector<mwSize> convertDims(int ndim, const int* dims);
229 
230  }; // End class MexHandler
231 
232  } // End namespace matlab
233 } // End namespace gcp
234 
235 
236 
237 #endif // End #ifndef GCP_MATLAB_MEXHANDLER_H
static double * addNamedDoubleStructField(mxArray *parentPtr, std::string fieldName, unsigned nElement, unsigned index=0)
Definition: MexHandler.cc:473
static mxComplexity matlabComplexityOf(gcp::util::DataType::Type dataType)
Definition: MexHandler.cc:94
static mxArray * addNamedStructField(mxArray *parentPtr, std::string fieldName, unsigned nElement=1, unsigned index=0)
Definition: MexHandler.cc:383
Definition: MonitorDataType.h:16
static char * addNamedStringStructField(mxArray *parentPtr, std::string fieldName, unsigned len, unsigned index=0)
Definition: MexHandler.cc:414
static mxArray * addRegisterField(mxArray *ptr, gcp::util::RegDescription &reg)
Definition: MexHandler.cc:215
static unsigned * addNamedUintStructField(mxArray *parentPtr, std::string fieldName, unsigned nElement, unsigned index=0)
Definition: MexHandler.cc:454
static mxArray * addNamedCellField(mxArray *parentPtr, std::string fieldName, unsigned iDim, unsigned index=0)
Definition: MexHandler.cc:537
static void getIndicesMatlab(std::vector< unsigned > &mVec, std::vector< unsigned > &mDims)
Definition: MexHandler.cc:691
Definition: MexHandler.h:60
static void getIndices(std::vector< unsigned > &cVec, std::vector< unsigned > &mVec, std::vector< unsigned > &dims, int iDim=0, unsigned indLast=0, unsigned nLast=0, unsigned baseLast=0)
Definition: MexHandler.cc:733
static float * addNamedFloatStructField(mxArray *parentPtr, std::string fieldName, std::vector< int > dims, unsigned index=0)
Definition: MexHandler.cc:525
virtual ~MexHandler()
Definition: MexHandler.cc:22
static unsigned indexStartingWithSlowest(std::vector< unsigned > &coord, std::vector< unsigned > &dims)
Definition: MexHandler.cc:653
Definition: MexParser.h:19
static mxArray * addHierNamedStructField(mxArray *parentPtr, std::string fieldName, gcp::util::DataType::Type=gcp::util::DataType::NONE, unsigned nDim=0, int *dims=0)
Definition: MexHandler.cc:301
static mxArray * createRegValArray(mxArray *ptr, gcp::util::RegDescription &reg, gcp::util::MonitorDataType::FormatType formatType, unsigned nFrame)
Definition: MexHandler.cc:266
static mxArray * createMatlabArray(int ndim, const int *dims, gcp::util::DataType::Type dataType)
Definition: MexHandler.cc:27
static unsigned indexStartingWithFastest(std::vector< unsigned > &coord, std::vector< unsigned > &dims)
Definition: MexHandler.cc:666
Definition: MexHandler.h:54
static double * copyNamedDoubleStructField(mxArray *parentPtr, std::string fieldName, std::string copyName)
Definition: MexHandler.cc:636
MexHandler()
Definition: MexHandler.cc:17
Definition: RegDescription.h:26
static void checkArgs(int nlhsExpected, int nrhsExpected, int nlhsActual, int nrhsActual)
Definition: MexHandler.cc:568
static void getIndicesC(std::vector< unsigned > &cVec, std::vector< unsigned > &cDims)
Definition: MexHandler.cc:680