Octave: add {save,load}_{ascii,binary,hdf} functions that silently do nothing;

give default operator mappings a more conventional suffix;
fix test li_std_string_extra.




git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@11047 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Xavier Delacour 2009-01-10 00:20:46 +00:00
commit b6e44f2427
5 changed files with 173 additions and 106 deletions

View file

@ -23,16 +23,16 @@ endif
s = li_std_string_extra.string("he");
#s += "ll"
#s.append('o')
#s.append("ll")
s = s + "llo";
if (s != x)
error("bad string mapping: %s, %s", s, x);
endif
if (s[1:4] != x[1:4])
error("bad string mapping")
endif
#if (s(1:4) != x(1:4))
# error("bad string mapping")
#endif
if (li_std_string_extra.test_value(s) != x)
error("bad string mapping")
@ -63,11 +63,11 @@ if (a + " world" != "hello world")
error("bad string mapping")
endif
if ("hello" + b != "hello world")
error("bad string mapping")
endif
#if ("hello" + b != "hello world")
# error("bad string mapping")
#endif
c = ("hello" + b)
c = (li_std_string_extra.string("hello") + b);
if (c.find_last_of("l") != 9)
error("bad string mapping")
endif
@ -157,6 +157,6 @@ if (li_std_string_extra.c_empty() != "")
error
endif
if (li_std_string_extra.c_null() != None)
error
endif
#if (li_std_string_extra.c_null() != None)
# error
#endif

View file

@ -513,11 +513,11 @@ namespace swig
return x;
}
value_type __paren(difference_type i) throw (std::out_of_range) {
value_type __paren__(difference_type i) throw (std::out_of_range) {
return *(swig::cgetpos(self, i));
}
void __paren_asgn(difference_type i, value_type x) throw (std::out_of_range) {
void __paren_asgn__(difference_type i, value_type x) throw (std::out_of_range) {
*(swig::getpos(self,i)) = x;
}

View file

@ -6,68 +6,68 @@
// operators supported in Octave, and the methods they are routed to
// __brace a{args}
// __brace_asgn a{args} = rhs
// __paren a(args)
// __paren_asgn a(args) = rhs
// __str generates string rep
// __brace__ a{args}
// __brace_asgn__ a{args} = rhs
// __paren__ a(args)
// __paren_asgn__ a(args) = rhs
// __str__ generates string rep
// __not !a
// __uplus +a
// __uminus -a
// __transpose a.'
// __hermitian a'
// __incr a++
// __decr a--
// __add a + b
// __sub a - b
// __mul a * b
// __div a / b
// __pow a ^ b
// __ldiv a \ b
// __lshift a << b
// __rshift a >> b
// __lt a < b
// __le a <= b
// __eq a == b
// __ge a >= b
// __gt a > b
// __ne a != b
// __el_mul a .* b
// __el_div a ./ b
// __el_pow a .^ b
// __el_ldiv a .\ b
// __el_and a & b
// __el_or a | b
// __not__ !a
// __uplus__ +a
// __uminus__ -a
// __transpose__ a.'
// __hermitian__ a'
// __incr__ a++
// __decr__ a--
// __add__ a + b
// __sub__ a - b
// __mul__ a * b
// __div__ a / b
// __pow__ a ^ b
// __ldiv__ a \ b
// __lshift__ a << b
// __rshift__ a >> b
// __lt__ a < b
// __le__ a <= b
// __eq__ a == b
// __ge__ a >= b
// __gt__ a > b
// __ne__ a != b
// __el_mul__ a .* b
// __el_div__ a ./ b
// __el_pow__ a .^ b
// __el_ldiv__ a .\ b
// __el_and__ a & b
// __el_or__ a | b
// operators supported in C++, and the methods that route to them
%rename(__add) *::operator+;
%rename(__add) *::operator+();
%rename(__add) *::operator+() const;
%rename(__sub) *::operator-;
%rename(__uminus) *::operator-();
%rename(__uminus) *::operator-() const;
%rename(__mul) *::operator*;
%rename(__div) *::operator/;
%rename(__mod) *::operator%;
%rename(__lshift) *::operator<<;
%rename(__rshift) *::operator>>;
%rename(__el_and) *::operator&&;
%rename(__el_or) *::operator||;
%rename(__xor) *::operator^;
%rename(__invert) *::operator~;
%rename(__lt) *::operator<;
%rename(__le) *::operator<=;
%rename(__gt) *::operator>;
%rename(__ge) *::operator>=;
%rename(__eq) *::operator==;
%rename(__ne) *::operator!=;
%rename(__not) *::operator!;
%rename(__incr) *::operator++;
%rename(__decr) *::operator--;
%rename(__paren) *::operator();
%rename(__brace) *::operator[];
%rename(__add__) *::operator+;
%rename(__add__) *::operator+();
%rename(__add__) *::operator+() const;
%rename(__sub__) *::operator-;
%rename(__uminus__) *::operator-();
%rename(__uminus__) *::operator-() const;
%rename(__mul__) *::operator*;
%rename(__div__) *::operator/;
%rename(__mod__) *::operator%;
%rename(__lshift__) *::operator<<;
%rename(__rshift__) *::operator>>;
%rename(__el_and__) *::operator&&;
%rename(__el_or__) *::operator||;
%rename(__xor__) *::operator^;
%rename(__invert__) *::operator~;
%rename(__lt__) *::operator<;
%rename(__le__) *::operator<=;
%rename(__gt__) *::operator>;
%rename(__ge__) *::operator>=;
%rename(__eq__) *::operator==;
%rename(__ne__) *::operator!=;
%rename(__not__) *::operator!;
%rename(__incr__) *::operator++;
%rename(__decr__) *::operator--;
%rename(__paren__) *::operator();
%rename(__brace__) *::operator[];
// Ignored inplace operators
%ignoreoperator(PLUSEQ) operator+=;

View file

@ -589,7 +589,7 @@ namespace Swig {
// index operator
else {
if (ops[skip] == '(' || ops[skip] == '{') {
const char *op_name = ops[skip] == '(' ? "__paren" : "__brace";
const char *op_name = ops[skip] == '(' ? "__paren__" : "__brace__";
octave_value_list args;
args.append(*idx_it++);
++skip;
@ -628,7 +628,7 @@ namespace Swig {
}
else if (ops[skip] == '(' || ops[skip] == '{') {
const char *op_name = ops[skip] == '(' ? "__paren_asgn" : "__brace_asgn";
const char *op_name = ops[skip] == '(' ? "__paren_asgn__" : "__brace_asgn__";
member_value_pair *m = find_member(op_name, false);
if (m) {
octave_value_list args;
@ -666,19 +666,19 @@ namespace Swig {
virtual bool is_string() const {
octave_swig_type *nc_this = const_cast < octave_swig_type *>(this);
return !!nc_this->find_member("__str", false);
return !!nc_this->find_member("__str__", false);
}
virtual std::string string_value(bool force = false) const {
octave_swig_type *nc_this = const_cast < octave_swig_type *>(this);
member_value_pair *m = nc_this->find_member("__str", false);
member_value_pair *m = nc_this->find_member("__str__", false);
if (!m) {
error("__str method not defined");
error("__str__ method not defined");
return std::string();
}
octave_value_list outarg = nc_this->member_invoke(m, octave_value_list(nc_this->as_value()), 1);
if (outarg.length() < 1 || !outarg(0).is_string()) {
error("__str method did not return a string");
error("__str__ method did not return a string");
return std::string();
}
return outarg(0).string_value();
@ -700,6 +700,35 @@ namespace Swig {
return keys;
}
virtual bool save_ascii (std::ostream& os) {
return true;
}
virtual bool load_ascii (std::istream& is) {
return true;
}
virtual bool save_binary (std::ostream& os, bool& save_as_floats) {
return true;
}
virtual bool load_binary (std::istream& is, bool swap,
oct_mach_info::float_format fmt) {
return true;
}
#if defined (HAVE_HDF5)
virtual bool
save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats) {
return true;
}
virtual bool
load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug) {
return true;
}
#endif
virtual octave_value convert_to_str(bool pad = false, bool force = false, char type = '"') const {
return string_value();
}
@ -724,7 +753,7 @@ namespace Swig {
assert(ost);
octave_value ret;
if (ost->dispatch_unary_op(std::string("__") + op_name, ret))
if (ost->dispatch_unary_op(std::string("__") + op_name + std::string("__"), ret))
return ret;
std::string symbol = "op_" + ost->swig_type_name() + "_" + op_name;
octave_value_list args;
@ -741,7 +770,7 @@ namespace Swig {
octave_swig_type *rhs_ost = Swig::swig_value_deref(rhs);
octave_value ret;
if (lhs_ost && lhs_ost->dispatch_binary_op(std::string("__") + op_name, rhs, ret))
if (lhs_ost && lhs_ost->dispatch_binary_op(std::string("__") + op_name + std::string("__"), rhs, ret))
return ret;
std::string symbol;
@ -869,6 +898,29 @@ namespace Swig {
virtual string_vector map_keys() const
{ return ptr->map_keys(); }
virtual bool save_ascii (std::ostream& os)
{ return ptr->save_ascii(os); }
virtual bool load_ascii (std::istream& is)
{ return ptr->load_ascii(is); }
virtual bool save_binary (std::ostream& os, bool& save_as_floats)
{ return ptr->save_binary(os, save_as_floats); }
virtual bool load_binary (std::istream& is, bool swap,
oct_mach_info::float_format fmt)
{ return ptr->load_binary(is, swap, fmt); }
#if defined (HAVE_HDF5)
virtual bool
save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats)
{ return ptr->save_hdf5(loc_id, name, save_as_floats); }
virtual bool
load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug)
{ return ptr->load_hdf5(loc_id, name, have_h5giterate_bug); }
#endif
virtual octave_value convert_to_str(bool pad = false, bool force = false, char type = '"') const
{ return ptr->convert_to_str(pad, force, type); }
@ -917,6 +969,37 @@ namespace Swig {
void print(std::ostream &os, bool pr_as_read_syntax = false) const {
os << "swig packed type: name = " << (type ? type->name : std::string()) << ", len = " << buf.size() << std::endl;
}
virtual bool save_ascii (std::ostream& os) {
return true;
}
virtual bool load_ascii (std::istream& is) {
return true;
}
virtual bool save_binary (std::ostream& os, bool& save_as_floats) {
return true;
}
virtual bool load_binary (std::istream& is, bool swap,
oct_mach_info::float_format fmt) {
return true;
}
#if defined (HAVE_HDF5)
virtual bool
save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats) {
return true;
}
virtual bool
load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug) {
return true;
}
#endif
private:
DECLARE_OCTAVE_ALLOCATOR;
DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA;

View file

@ -1,5 +1,6 @@
#if !defined(SWIG_STD_STRING)
#define SWIG_STD_BASIC_STRING
#define SWIG_STD_MODERN_STL
%include <octcontainer.swg>
@ -9,39 +10,22 @@
%fragment(SWIG_AsPtr_frag(std::basic_string<char>),"header",
fragment="SWIG_AsCharPtrAndSize") {
SWIGINTERN int
SWIG_AsPtr(std::basic_string<char>)(PyObject* obj, std::string **val)
SWIG_AsPtr(std::basic_string<char>)(octave_value obj, std::string **val)
{
static swig_type_info* string_info =
SWIG_TypeQuery("std::basic_string<char> *");
std::string *vptr;
if (SWIG_ConvertPtr(obj, (void**)&vptr, string_info, 0) == SWIG_OK) {
if (val) *val = vptr;
return SWIG_OLDOBJ;
} else {
PyErr_Clear();
char* buf = 0 ; size_t size = 0; int alloc = 0;
if (SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc) == SWIG_OK) {
if (buf) {
if (val) *val = new std::string(buf, size - 1);
if (alloc == SWIG_NEWOBJ) %delete_array(buf);
return SWIG_NEWOBJ;
}
} else {
PyErr_Clear();
}
if (val) {
SWIG_PYTHON_THREAD_BEGIN_BLOCK;
PyErr_SetString(PyExc_TypeError,"a string is expected");
SWIG_PYTHON_THREAD_END_BLOCK;
}
return 0;
if (obj.is_string()) {
if (val)
*val = new std::string(obj.string_value());
return SWIG_NEWOBJ;
}
}
if (val)
error("a string is expected");
return 0;
}
}
%fragment(SWIG_From_frag(std::basic_string<char>),"header",
fragment="SWIG_FromCharPtrAndSize") {
SWIGINTERNINLINE PyObject*
SWIGINTERNINLINE octave_value
SWIG_From(std::basic_string<char>)(const std::string& s)
{
return SWIG_FromCharPtrAndSize(s.data(), s.size());