1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
// Pairs
%include <octstdcommon.swg>
//#define SWIG_STD_PAIR_ASVAL
%fragment("StdPairTraits","header",fragment="StdTraits") {
namespace swig {
#ifdef SWIG_STD_PAIR_ASVAL
template <class T, class U >
struct traits_asval<std::pair<T,U> > {
typedef std::pair<T,U> value_type;
static int get_pair(const octave_value& first, octave_value second,
std::pair<T,U> *val)
{
if (val) {
T *pfirst = &(val->first);
int res1 = swig::asval(first, pfirst);
if (!SWIG_IsOK(res1))
return res1;
U *psecond = &(val->second);
int res2 = swig::asval(second, psecond);
if (!SWIG_IsOK(res2))
return res2;
return res1 > res2 ? res1 : res2;
} else {
T *pfirst = 0;
int res1 = swig::asval(first, pfirst);
if (!SWIG_IsOK(res1))
return res1;
U *psecond = 0;
int res2 = swig::asval((PyObject*)second, psecond);
if (!SWIG_IsOK(res2))
return res2;
return res1 > res2 ? res1 : res2;
}
}
static int asval(const octave_value& obj, std::pair<T,U> *val) {
if (obj.is_cell()) {
Cell c=obj.cell_value();
if (c.numel()<2) {
error("pair from Cell array requires at least two elements");
return SWIG_ERROR;
}
return get_pair(c(0),c(1),val);
} else {
value_type *p;
swig_type_info *descriptor = swig::type_info<value_type>();
int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR;
if (SWIG_IsOK(res) && val)
*val = *p;
return res;
}
return SWIG_ERROR;
}
};
#else
template <class T, class U >
struct traits_asptr<std::pair<T,U> > {
typedef std::pair<T,U> value_type;
static int get_pair(const octave_value& first, octave_value second,
std::pair<T,U> **val)
{
if (val) {
value_type *vp = %new_instance(std::pair<T,U>);
T *pfirst = &(vp->first);
int res1 = swig::asval(first, pfirst);
if (!SWIG_IsOK(res1)) {
%delete(vp);
return res1;
}
U *psecond = &(vp->second);
int res2 = swig::asval(second, psecond);
if (!SWIG_IsOK(res2)) {
%delete(vp);
return res2;
}
*val = vp;
return SWIG_AddNewMask(res1 > res2 ? res1 : res2);
} else {
T *pfirst = 0;
int res1 = swig::asval(first, pfirst);
if (!SWIG_IsOK(res1))
return res1;
U *psecond = 0;
int res2 = swig::asval(second, psecond);
if (!SWIG_IsOK(res2))
return res2;
return res1 > res2 ? res1 : res2;
}
return SWIG_ERROR;
}
static int asptr(const octave_value& obj, std::pair<T,U> **val) {
if (obj.is_cell()) {
Cell c=obj.cell_value();
if (c.numel()<2) {
error("pair from Cell array requires at least two elements");
return SWIG_ERROR;
}
return get_pair(c(0),c(1),val);
} else {
value_type *p;
swig_type_info *descriptor = swig::type_info<value_type>();
int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR;
if (SWIG_IsOK(res) && val)
*val = p;
return res;
}
return SWIG_ERROR;
}
};
#endif
template <class T, class U >
struct traits_from<std::pair<T,U> > {
static octave_value from(const std::pair<T,U>& val) {
Cell c(1,2);
c(0)=swig::from(val.first);
c(1)=swig::from(val.second);
return c;
}
};
}
}
%define %swig_pair_methods(pair...)
%enddef
%include <std/std_pair.i>
|