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