30#ifndef INCLUDE_MEXPLUS_ARGUMENTS_H_
31#define INCLUDE_MEXPLUS_ARGUMENTS_H_
76 return tolower(c1) < tolower(c2);
79 bool operator() (
const std::string & s1,
const std::string & s2)
const {
80 return std::lexicographical_compare(s1.begin(),
88 typedef std::map<std::string, const mxArray*, CaseInsensitiveComparator>
92 typedef struct Definition_tag {
103 const mxArray* prhs[],
104 int mandatory_size = 1,
108 definition->
mandatories.resize(mandatory_size, NULL);
109 va_list variable_list;
110 va_start(variable_list, option_size);
112 va_end(variable_list);
124 va_list variable_list;
125 va_start(variable_list, option_size);
127 va_end(variable_list);
132 const mxArray* prhs[],
133 bool ignore_multi_signatures =
false) {
135 mexErrMsgIdAndTxt(
"mexplus:arguments:error",
"No format defined.");
136 std::map<std::string, Definition>::iterator entry;
137 std::vector<std::map<std::string, Definition>::iterator> delete_positions;
140 delete_positions.push_back(entry);
141 for (
size_t i = 0; i < delete_positions.size(); ++i)
144 mexErrMsgIdAndTxt(
"mexplus:arguments:error",
147 if (
definitions_.size() > 1 && !ignore_multi_signatures)
148 mexWarnMsgIdAndTxt(
"mexplus:arguments:warning",
149 "Input arguments match more than one signature.");
153 bool is(
const std::string& name)
const {
154 std::map<std::string, Definition>::const_iterator entry =
160 const mxArray*
get(
size_t index)
const {
162 mexErrMsgIdAndTxt(
"mexplus:arguments:error",
"No format defined.");
165 mexErrMsgIdAndTxt(
"mexplus:arguments:error",
"Index out of range.");
170 template <
typename T>
171 T
get(
size_t index)
const;
172 template <
typename T>
173 void get(
size_t index, T* value)
const;
176 const mxArray*
get(
const std::string& option_name)
const {
178 mexErrMsgIdAndTxt(
"mexplus:arguments:error",
"No format defined.");
180 OptionMap::const_iterator entry =
183 mexErrMsgIdAndTxt(
"mexplus:arguments:error",
184 "Unknown option %s.",
185 option_name.c_str());
186 return entry->second;
190 template <
typename T>
191 T
get(
const std::string& option_name,
const T& default_value)
const;
192 template <
typename T>
193 void get(
const std::string& option_name,
194 const T& default_value,
201 const mxArray*
operator[] (
const std::string& option_name)
const {
202 return get(option_name);
210 va_list variable_list) {
211 for (
int i = 0; i < option_size; ++i) {
212 const char* option_name = va_arg(variable_list,
const char*);
213 (*optionals)[std::string(option_name)] = NULL;
219 const mxArray* prhs[],
221 const size_t kMaxOptionNameSize = 64;
222 std::stringstream message;
223 std::string option_name;
224 if (nrhs < definition->mandatories.size()) {
225 message <<
"Too few arguments: " << nrhs <<
" for at least "
231 for (; index < definition->
mandatories.size(); ++index)
238 if (nrhs - index == 1 &&
239 mxIsStruct(prhs[index]) &&
240 mxGetNumberOfElements(prhs[index]) == 1) {
242 for (
int field_index = 0;
246 option_name = config.
fieldName(field_index);
247 if (option_name.size() > kMaxOptionNameSize) {
248 message <<
"Option name too long: " << option_name.size()
249 <<
" characters for " << kMaxOptionNameSize - 1;
253 OptionMap::iterator entry =
255 if (entry == definition->
optionals.end()) {
256 message <<
"Invalid option name: '" << option_name <<
"'.";
261 entry->second = config.
at(config.
fieldName(field_index));
266 if (index >= nrhs)
break;
268 MxArray option_name_array(prhs[index++]);
269 if (!option_name_array.
isChar()) {
270 message <<
"Option name must be char but is given "
275 option_name = option_name_array.
to<std::string>();
276 if (option_name.size() > kMaxOptionNameSize) {
277 message <<
"Option name too long: " << option_name.size()
278 <<
" characters for " << kMaxOptionNameSize - 1;
282 OptionMap::iterator entry =
284 if (entry == definition->
optionals.end()) {
285 message <<
"Invalid option name: '" << option_name <<
"'.";
291 message <<
"Missing option value for option '" << option_name
298 mexWarnMsgIdAndTxt(
"mexplus:arguments:warning",
299 "Option '%s' appeared more than once.",
300 option_name.c_str());
302 entry->second = prhs[index++];
329 const T& default_value)
const {
331 get<T>(option_name, default_value, &value);
337 const T& default_value,
343 *value = default_value;
365 int maximum_size = 1,
366 int mandatory_size = 0) :
nlhs_(nlhs),
plhs_(plhs) {
367 if (mandatory_size > nlhs)
368 mexErrMsgIdAndTxt(
"mexplus:arguments:error",
369 "Too few output: %d for %d.",
372 if (maximum_size < nlhs)
373 mexErrMsgIdAndTxt(
"mexplus:arguments:error",
374 "Too many output: %d for %d.",
380 void set(
size_t index, mxArray* value) {
382 plhs_[index] = value;
386 template <
typename T>
387 void set(
size_t index,
const T& value) {
397 mexErrMsgIdAndTxt(
"mexplus:arguments:error",
398 "Output index out of range: %d.",
406 mexErrMsgIdAndTxt(
"mexplus:arguments:error",
407 "Output index out of range: %d.",
mxArray object wrapper for data conversion and manipulation.
Definition mxarray.h:101
static void to(const mxArray *array, T *value)
mxArray* exporter methods.
Definition mxarray.h:315
static T at(const mxArray *array, mwIndex index)
mxArray* element reader methods.
Definition mxarray.h:327
static mxArray * from(const T &value)
mxArray* importer methods.
Definition mxarray.h:300
T to() const
Convert MxArray to a specified type.
Definition mxarray.h:402
std::string fieldName(int index) const
Get field name of a struct array.
Definition mxarray.h:591
int fieldSize() const
Number of fields in a struct array.
Definition mxarray.h:586
const std::string className() const
Class name of mxArray.
Definition mxarray.h:559
bool isChar() const
Determine whether input is string array.
Definition mxarray.h:634
Output arguments wrapper.
Definition arguments.h:359
size_t size() const
Size of the output.
Definition arguments.h:392
void set(size_t index, const T &value)
Safely assign T to the output.
Definition arguments.h:387
mxArray *const & operator[](size_t index) const
Const square bracket operator.
Definition arguments.h:395
void set(size_t index, mxArray *value)
Safely assign mxArray to the output.
Definition arguments.h:380
mxArray ** plhs_
Output argument array.
Definition arguments.h:418
size_t nlhs_
Number of output arguments.
Definition arguments.h:415
OutputArguments(int nlhs, mxArray **plhs, int maximum_size=1, int mandatory_size=0)
Construct output argument wrapper.
Definition arguments.h:363
MEX function arguments helper library.
Definition arguments.h:40
Definition of arguments.
Definition arguments.h:92
std::vector< const mxArray * > mandatories
Definition arguments.h:93
OptionMap optionals
Definition arguments.h:94