Re: [C++-sig] Define class in 2 scopes without re-exposing

2012-04-16 Thread John Reid



On 15/04/12 03:23, Dave Abrahams wrote:


You can't do this; don't even try.  Each C++ class has to have a unique
Python identity.  If you just want to refer to the same class by a
different name, you can of course:

BOOST_PYTHON_MODULE( _sandbox )
{
 namespace bp = ::boost::python;
 object inner;
 {
 bp::scope scope = bp::class_<  Outer1>( "Outer1" );
 inner = bp::class_<  Inner>( "Inner" );
 }

 {
 object outer2 = bp::class_<  Outer2>( "Outer2" );
 outer2.attr("Inner") = inner;
 }
}



I didn't know you could do that and it is useful but it is not quite 
what I had in mind. I would rather not pass the inner object around all 
the parts of my code that might need it. Is it possible to get it out of 
the registry in the second block? I'm guessing it must be in there 
somewhere as I get exactly the same behaviour (plus the warning message) 
if I just register the class in both blocks.


Thanks,
John.

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


Re: [C++-sig] Define class in 2 scopes without re-exposing

2012-04-16 Thread Jim Bosch

On 04/16/2012 03:15 AM, John Reid wrote:



On 15/04/12 03:23, Dave Abrahams wrote:


You can't do this; don't even try. Each C++ class has to have a unique
Python identity. If you just want to refer to the same class by a
different name, you can of course:

BOOST_PYTHON_MODULE( _sandbox )
{
namespace bp = ::boost::python;
object inner;
{
bp::scope scope = bp::class_< Outer1>( "Outer1" );
inner = bp::class_< Inner>( "Inner" );
}

{
object outer2 = bp::class_< Outer2>( "Outer2" );
outer2.attr("Inner") = inner;
}
}



I didn't know you could do that and it is useful but it is not quite
what I had in mind. I would rather not pass the inner object around all
the parts of my code that might need it. Is it possible to get it out of
the registry in the second block? I'm guessing it must be in there
somewhere as I get exactly the same behaviour (plus the warning message)
if I just register the class in both blocks.



You can get it from the registry (see below), but it requires relying on 
what I'd consider implementation details of the library.


If you can, I'd recommend just importing the module that contains outer1 
and doing the above trick with that:


bp::object mod1 = bp::import("module1");
bp::object outer2 = bp::class_< Outer2 >("Outer2");
outer2.attr("Inner") = mod1.attr("Outer1").attr("Inner");

If you do really want to use the registry, I think you want something 
like this:


bp::converter::registration const * reg =
bp::converter::registry::query(bp::type_id());
assert(reg); // 0 if you haven't wrapped Inner yet
bp::object inner(bp::handle<>(bp::borrowed(
reinterpret_cast(reg.get_class_object())
)));



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


Re: [C++-sig] Define class in 2 scopes without re-exposing

2012-04-16 Thread Dave Abrahams

on Mon Apr 16 2012, John Reid  wrote:

> On 15/04/12 03:23, Dave Abrahams wrote:
>>
>> You can't do this; don't even try.  Each C++ class has to have a unique
>> Python identity.  If you just want to refer to the same class by a
>> different name, you can of course:
>>
>
>> BOOST_PYTHON_MODULE( _sandbox )
>> {
>>  namespace bp = ::boost::python;
>>  object inner;
>>  {
>>  bp::scope scope = bp::class_<  Outer1>( "Outer1" );
>>  inner = bp::class_<  Inner>( "Inner" );
>>  }
>>
>>  {
>>  object outer2 = bp::class_<  Outer2>( "Outer2" );
>>  outer2.attr("Inner") = inner;
>>  }
>> }
>>
>
> I didn't know you could do that and it is useful but it is not quite
> what I had in mind. I would rather not pass the inner object around
> all the parts of my code that might need it. Is it possible to get it
> out of the registry in the second block? 

Why don't you read to the end of my posting?  The answer's there at the
bottom :-)

-- 
Dave Abrahams
BoostPro Computing
http://www.boostpro.com

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


Re: [C++-sig] Define class in 2 scopes without re-exposing

2012-04-16 Thread John Reid


On 16/04/12 19:13, Dave Abrahams wrote:
> 
> on Mon Apr 16 2012, John Reid  wrote:
> 
>> On 15/04/12 03:23, Dave Abrahams wrote:
>>>
>>> You can't do this; don't even try.  Each C++ class has to have a unique
>>> Python identity.  If you just want to refer to the same class by a
>>> different name, you can of course:
>>>
>>
>>> BOOST_PYTHON_MODULE( _sandbox )
>>> {
>>>  namespace bp = ::boost::python;
>>>  object inner;
>>>  {
>>>  bp::scope scope = bp::class_<  Outer1>( "Outer1" );
>>>  inner = bp::class_<  Inner>( "Inner" );
>>>  }
>>>
>>>  {
>>>  object outer2 = bp::class_<  Outer2>( "Outer2" );
>>>  outer2.attr("Inner") = inner;
>>>  }
>>> }
>>>
>>
>> I didn't know you could do that and it is useful but it is not quite
>> what I had in mind. I would rather not pass the inner object around
>> all the parts of my code that might need it. Is it possible to get it
>> out of the registry in the second block? 
> 
> Why don't you read to the end of my posting?  The answer's there at the
> bottom :-)
> 

Thanks! I was guilty of reading your post too quickly. And thx to Jim
too for what looks like a similar method.

John.

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


[C++-sig] Assign ownership of Python-constructed object to C++ runtime

2012-04-16 Thread Adam Preble
I am pondering trying to eliminate some usages of shared pointers in my
code since I have finally completed enough of it that I have good ownership
rules for things in place.  I still have one spot, which is basically the
main door to the C++ runtime, where I have a problem.  I've been creating
instances of some objects in Python, with the purpose of assigning to
another object for safekeeping.  Really that other object is what I have in
mind for managing everything about these objects--including their runtimes.
 But I see the objects get destroyed when the Python declaration for them
go out of scope.  That would normally be the right thing.  I'm trying to
think of alternatives.  The best I can think of is to use a static factory
method instead that returns an internal reference.  I'm intend to
experiment with that now but I am wondering if there are some other things
to consider instead.

Inevitably somebody will ask why I'm doing away with the shared pointers.
 I have some cycles due to communication that means a lot of stuff never
actually gets deleted due to the reference-counting methodology in them.
 When I used weak references, I found they were getting deleted too
eagerly.  And by this point, I otherwise have gotten an ownership hierarchy
down.
___
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig