Re: [C++-sig] TypeError: No to_python (by-value) converter found for C++ type: class std::basic_ostream >

2010-09-29 Thread Jakub Zytka


> I get this error:
> *TypeError: No to_python (by-value) converter found for C++ type: class
> std::basic_ostream >*
>
> This is the python function
> *def serialise(self, gameobj, file):
>  if(gameobj in self.components):
>  file.write("HEY", 3)*
>
> What's the problem here? Is is because the ostream argument is an reference?
The problem is you are trying to copy a noncopyable object:


 return class_,
boost::noncopyable>("ostream", no_init)

ostream is noncopyable


 .def("write", write ,
return_value_policy())

but you define write to return copy (of ostream)

___
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig


[C++-sig] Read and write byte streams python<-->c++

2010-09-29 Thread Simon W
Hey,

I'm trying to serialise some data. I have a c++ class:
class ostream
{
std::ostream& stream;
public:
ostream(std::ostream& s) : stream(s) {}

void write(const char* bytes, Uint32 count)
{
stream.write(bytes, count);
}
};
As you can see, it only wraps std::ostream.

I call the python function like this:
ostream stream(file);
GameObject* obj = new GameObject(...);
if(boost::python::override f = get_override("serialise"))
return f(boost::python::object(boost::python::ptr(obj)),
boost::python::object(boost::python::ptr(&stream)));

Then in the python script:
def serialise(self, gameobj, file):
if(gameobj in self.components):
b = pickle.dumps(self.components[gameobj])
# this is some testing code and dont really make sense because I
don't know what to do...
file.write(str(len(str(b))), 10) # try to serialise an int that
tells the size of the byte-object
print(len(str(b)))
file.write(str(b), len(str(b))) # write the byte object
return len(str(b)) + 10 # return amount of bytes we wrote

First i "pickle" a python object. I convert that byte-object to a string
since my write() function in c++ takes a const char*. But i'd like to pass
the byte-object directly since const char* is basically a byte, right?

Also, the other problem, when im about to read the serialised data I need to
know the size of the previously serialised data to unpickle it. I thoght
that I could to the c++ way and add a integer before the byte stream that
reveal how big it is. But How can i serialise an int from python that takes
up constant "byte-size" for an integer between lets say 0-1!?

Any help on this one? Thanks!
___
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

Re: [C++-sig] TypeError: No to_python (by-value) converter found for C++ type: class std::basic_ostream >

2010-09-29 Thread Simon W
Thank you for the answer. Is there any way I can prevent it from copying the
stream object even though std::ostream::write() returns a std::ostream& ?

On Wed, Sep 29, 2010 at 11:38 AM, Jakub Zytka  wrote:

>
> > I get this error:
> > *TypeError: No to_python (by-value) converter found for C++ type: class
> > std::basic_ostream >*
> >
> > This is the python function
> > *def serialise(self, gameobj, file):
> >  if(gameobj in self.components):
> >  file.write("HEY", 3)*
> >
> > What's the problem here? Is is because the ostream argument is an
> reference?
> The problem is you are trying to copy a noncopyable object:
>
>
>  return class_,
>> boost::noncopyable>("ostream", no_init)
>>
> ostream is noncopyable
>
>
>  .def("write", write ,
>> return_value_policy())
>>
> but you define write to return copy (of ostream)
>
> ___
> Cplusplus-sig mailing list
> Cplusplus-sig@python.org
> http://mail.python.org/mailman/listinfo/cplusplus-sig
>
___
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

Re: [C++-sig] TypeError: No to_python (by-value) converter found for C++ type: class std::basic_ostream >

2010-09-29 Thread Jakub Zytka

On 09/29/10 14:11, Simon W wrote:

Thank you for the answer. Is there any way I can prevent it from copying the
stream object even though std::ostream::write() returns a std::ostream& ?

You can use other return policy, or define one on your own.

http://www.boost.org/doc/libs/1_44_0/libs/python/doc/tutorial/doc/html/python/functions.html#python.call_policies

But honestly, I do not think it is the correct way to go. Read below.

> I'm trying to serialise some data. I have a c++ class:
>  class ostream
>  {
> ...
> could to the c++ way and add a integer before the byte stream that reveal how
> big it is. But How can i serialise an int from python that takes up constant
> "byte-size" for an integer between lets say 0-1!?
Everything can be done, but I have a different question:
I haven't followed all your previous emails, but do you *really* need to 
implement serialization code in python?
Somehow I feel it is very weird that on one hand you want to have serialization 
code in python, and yet use ostream.


What would be wrong with coding serialization purely in C++, and then providing 
appropriate pickle suite to python:

struct MyPickleSuite
{
// ...
boost::python::tuple MyPickleSuite::getstate(MyClass & object)
{
std::ostringstream oStream(ios_base::binary);
serialize(oStream, object);
return boost::python::make_tuple(oStream.str());
}

void MyPickleSuite::setstate(MyClass & object, boost::python::tuple state)
{
// verify tuple correctness etc.
std::string serializedData = extract(state[0]);
std::istringstream iStream(serializedData, ios_base::binary);
serialize(iStream, object); // NOTE: you can use the same code for serialization 
and deserialization. stream type should determine actual behavior

}
}

That way you do not have to expose ostream to python at all. In fact if you 
wanted to switch to another type of stream (imagine that you have a custom 
stream implementation, which provides eg. type checking) it is cheap. You only 
change a few functions in your pickle suite, nothing more.


Even if you do really need to define serialization in python I see no reason to 
play with streams. I'd rather had a wrapper which hides underlying 
implementation (eg. std::streams) and operates on strings.


Please reconsider your design.
___
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig


[C++-sig] Derivation from Python str

2010-09-29 Thread Willi Karel
I'd like to derive from either Python's built-in 'str' or
boost::python::str, resulting in a class that provides additional
methods / member functions / attributes. The definitions of these
additional methods are implemented in C++. Is there any way to achieve
that? Please note that implicit conversions don't serve this goal, as
methods of 'str' should be part of the derived classes set of attributes
- e.g. the following Python code should be ok ('Derived' being the class
derived from Python's 'str'):

>>> Derived d
>>> d.startswith('prefix')

I see that Python's 'str' is immutable, which is acceptable for my purpose.

What I tried:

Including e.g. boost::python::str in the list of base classes yields a
run-time error in python:
boost::python::class_ >("Derived")
.def("foo",&Derived::foo)
;

Including std::string (which is built-in-converted to Python's 'str') in
the list of base classes yields a run-time assertion complaining about
the base class not having been wrapped. What I'd like to achieve anyway,
is derivation from Python's 'str', not std::string.

Thanks for any help!
Cheers, Willi.
___
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig


Re: [C++-sig] Derivation from Python str

2010-09-29 Thread Hans Meine
Am Mittwoch 29 September 2010, 17:02:57 schrieb Willi Karel:
> I'd like to derive from either Python's built-in 'str' or
> boost::python::str, resulting in a class that provides additional
> methods / member functions / attributes. [...]

AFAIK this is just an unsupported feature of the BPL.  I was (and would still 
be) interested in the same thing, only with list/dict being the base classes, 
but this does not seem to be possible.

>From the outside, I would guess/hope that it's not too hard to fix, but having 
looked at various parts of boost::python in the past, I don't think that I 
will try it myself in the near future.

> Including e.g. boost::python::str in the list of base classes yields a
> run-time error in python: [...]

If it was supported, I would say that this would be the right approach/API.

Have a nice day,
  Hans
___
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig


Re: [C++-sig] Derivation from Python str

2010-09-29 Thread Jim Bosch

On 09/29/2010 09:01 AM, Hans Meine wrote:

Am Mittwoch 29 September 2010, 17:02:57 schrieb Willi Karel:

I'd like to derive from either Python's built-in 'str' or
boost::python::str, resulting in a class that provides additional
methods / member functions / attributes. [...]


AFAIK this is just an unsupported feature of the BPL.  I was (and would still
be) interested in the same thing, only with list/dict being the base classes,
but this does not seem to be possible.


From the outside, I would guess/hope that it's not too hard to fix, but having

looked at various parts of boost::python in the past, I don't think that I
will try it myself in the near future.


Including e.g. boost::python::str in the list of base classes yields a
run-time error in python: [...]


If it was supported, I would say that this would be the right approach/API.



If you *really* need to subclass Python's str type (so your objects pass 
an "isinstance(obj, str)" check, it is possible to do that in a way that 
is interoperable with Boost.Python (you'd be able to hold such an object 
in boost::python::str, for instance), but you'd have to use a lot of the 
raw Python C API to do it.  It would certainly be harder than just 
adding str-like methods to a regular Boost.Python class.


Jim Bosch
___
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig


Re: [C++-sig] Derivation from Python str

2010-09-29 Thread Willi Karel
Dear Hans and Jim,

thanks a lot for your replies!

I tried to wrap/def boost::python::str's methods for my derived class,
which is possible in a quite compact way using boost::function_types and
some templates. However, I quit my attempt when it came to operators -
too much work for now.

Cheers, Willi.

Jim Bosch wrote:
> On 09/29/2010 09:01 AM, Hans Meine wrote:
>> Am Mittwoch 29 September 2010, 17:02:57 schrieb Willi Karel:
>>> I'd like to derive from either Python's built-in 'str' or
>>> boost::python::str, resulting in a class that provides additional
>>> methods / member functions / attributes. [...]
>>
>> AFAIK this is just an unsupported feature of the BPL.  I was (and
>> would still
>> be) interested in the same thing, only with list/dict being the base
>> classes,
>> but this does not seem to be possible.
>>
>>> From the outside, I would guess/hope that it's not too hard to fix,
>>> but having
>> looked at various parts of boost::python in the past, I don't think
>> that I
>> will try it myself in the near future.
>>
>>> Including e.g. boost::python::str in the list of base classes yields a
>>> run-time error in python: [...]
>>
>> If it was supported, I would say that this would be the right
>> approach/API.
>>
> 
> If you *really* need to subclass Python's str type (so your objects pass
> an "isinstance(obj, str)" check, it is possible to do that in a way that
> is interoperable with Boost.Python (you'd be able to hold such an object
> in boost::python::str, for instance), but you'd have to use a lot of the
> raw Python C API to do it.  It would certainly be harder than just
> adding str-like methods to a regular Boost.Python class.
> 
> Jim Bosch
> ___
> Cplusplus-sig mailing list
> Cplusplus-sig@python.org
> http://mail.python.org/mailman/listinfo/cplusplus-sig

-- 
  __     Technische Universität Wien
   DI Wilfried Karel /_//   // __/  Institut für Photogrammetrie
/ // / // /_   und Fernerkundung (E122)
 w...@ipf.tuwien.ac.at   / // __// __/  Gußhausstraße 27-29
+43 1 58801 12244 /_//_/  /_/A-1040 Wien
___
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig