Re: boost bind/lambda

"Nigel Atkinson" <[email protected]>
Newsgroups gmane.comp.lang.lua.bind.user
Message-ID <[email protected]>
If you want to manage the life time of the data manually (or elsewhere in
code), it's probably easiest to simply not use a shared pointer at all,
and a raw one instead:

GLfloat* givemefloat( .... etc

class_<GLfloat>("GLfloat")

If you really want to use a smart pointer for whatever reason, you can use
a 'null deleter'. See
http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/sp_techniques.html#static
which explains it.

As said previously by others it would be much better to use
boost::shared_array rather than shared_ptr, which you can use a null
deleter with.

Nigel


On Thu, January 6, 2011 6:27 am, beo wulf wrote:
> This is _almost_ perfect, the only thing I can't figure out is:
>
> #typedef P boost::shared_ptr
> #typedef V std::vector
>
> P<GLfloat> givemefloat(P<V<GLfloat> > p) {
>   return P( & (*v) [0] );
> }
>
> is bad in my case since I don't want the data to be tried to be freed
> when the pointer returned by givemefloat expires. Is there a way to
> have a boost pointer that doesn't reference count? (or if it must
> reference count, reference count on the P<V<GLfloat>> object ?
>
> Thanks!
>
> On Wed, Jan 5, 2011 at 2:55 AM, Nigel Atkinson <[email protected]>
> wrote:
>> You're on the right track. �Perhaps an example will help (and let me
>> make sure it works as advertised!) Attached is a little program which
>> I've tested with gcc 4 and luabind 0.9. �I've added a couple of
>> comments.
>>
>> It should work if GLfloat is a #define rather than a typedef, but I've
>> just checked on my machine (Linux), and it is a typedef.
>>
>> On another note, if you are binding all of OpenGL, are you going to do
>> extensions? �That could be curly! Bound function pointers? That *might*
>> work perhaps. Hmmm.
>>
>> Nigel
>>
>> On Tue, 2011-01-04 at 23:44 -0800, beo wulf wrote:
>>> I've tried
>>>
>>> class_<GLfloat, boost::shared_ptr<GLfloat> > ....
>>>
>>> but I'm not sure what to do with this. Can you explain? (Luabind's
>>> template blackmagicery is a couple levels above my paygrade).
>>> Thanks!
>>>
>>> On Tue, Jan 4, 2011 at 11:26 PM, Nigel Atkinson <[email protected]>
>>> wrote:
>>> > You could bind GLfloat as a class. �I've done this in the past with
>>> > Ogre3d's "Real" witch is a typedef for float or double. �Depending on
>>> > how your using in your scripts, that's all you may need to do, i.e
>>> > without any defined methods. This makes GLfloat in scripts similar to
>>> an
>>> > opaque pointer, where it's allways come from C++ and only really used
>>> by
>>> > C++. You can also add operators and a constructor as well, to get
>>> more
>>> > scripting use out of it.
>>> >
>>> > Using it this way as with pointers (arrays) make take a little
>>> tweaking,
>>> > I'll have to have a play around when I have time.
>>> >
>>> > Nigel
>>> >
>>> > On Wed, 2011-01-05 at 06:17 +0000, Tony Kostanjsek wrote:
>>> >> I might've been mistaken on the function pointer issue, but I've
>>> only used it
>>> >> that way.
>>> >>
>>> >>
>>> >>
>>> >> ----- Urspr�ngliche Mail ----
>>> >> Von: beo wulf <[email protected]>
>>> >> An: [email protected]
>>> >> Gesendet: Mittwoch, den 5. Januar 2011, 6:55:19 Uhr
>>> >> Betreff: Re: [luabind] boost bind/lambda
>>> >>
>>> >> Why does wrapping it on a tag_function work then?
>>> >>
>>> >> Writing wrappers is out of the question -- there are too many
>>> functions.
>>> >>
>>> >> On Tue, Jan 4, 2011 at 9:51 PM, Tony Kostanjsek
>>> <[email protected]> wrote:
>>> >> > "def" requires an address or function pointer, but bind returns a
>>> temporary
>>> >> > functor instance. Try to use a static instance or write a wrapper
>>> function
>>> >> > implementation and pass that.
>>> >> >
>>> >> > Something like <type> func = bind(...)
>>> >> > .def("glLightfv", &func)
>>> >> > I'm not sure what <type> would look like though.
>>> >> >
>>> >> > Alternatively, something like this might work:
>>> >> > void wrappedGlLightfv(GLenum light, GLenum pname, const
>>> >> > boost::shared_ptr<std::vector<GLfloat>> fv)
>>> >> > {
>>> >> > �glLightfv(light, pname, &fv->get()->front()); // not quite sure
>>> about
>>> >> front(),
>>> >> > but you get the idea
>>> >> > }
>>> >> >
>>> >> > ...
>>> >> > .def("glLightfv", wrappedGlLightfv)
>>> >> > ...
>>> >> >
>>> >> > ----- Urspr�ngliche Mail ----
>>> >> > Von: beo wulf <[email protected]>
>>> >> > An: [email protected]
>>> >> > Gesendet: Mittwoch, den 5. Januar 2011, 6:35:09 Uhr
>>> >> > Betreff: [luabind] boost bind/lambda
>>> >> >
>>> >> > Goal: I want to luabind all of OpenGL.
>>> >> > Problem: glLightfv( int, int, GLfloat*)
>>> >> >
>>> >> > Almost solution: �boost::bind
>>> >> >
>>> >> > The following code almost works -- it can use boost::bind to
>>> convert
>>> >> > functions that take arg GLfloat* to take an arg of
>>> >> > boost::shared_ptr<std::vector<GLfloat>> instead. However,
>>> boost::bind
>>> >> > and luabind seem to not work with each other (in particular, the
>>> line
>>> >> >
>>> >> > , def("glLightfv2", bind(glLightfv, _1, _2, _3)) // ths line does
>>> not compile
>>> >> >
>>> >> > Why?
>>> >> >
>>> >> > Full code below:
>>> >> >
>>> >> >
>>> >> >
>>> >> > #include <boost/shared_ptr.hpp>
>>> >> > #include <boost/bind.hpp>
>>> >> >
>>> >> > #include <vector>
>>> >> > #include <iostream>
>>> >> >
>>> >> > #include <luabind/luabind.hpp>
>>> >> > #include <luabind/operator.hpp>
>>> >> > #include <luabind/adopt_policy.hpp>
>>> >> > #include <luabind/copy_policy.hpp>
>>> >> > #include <luabind/class_info.hpp>
>>> >> >
>>> >> > #include <GL/gl.h>
>>> >> >
>>> >> >
>>> >> >
>>> >> > #define P boost::shared_ptr
>>> >> > #define V std::vector
>>> >> >
>>> >> > float foo(int x, int y, float* f) {
>>> >> > �float ans = 0;
>>> >> > �ans = x + y + f[0] + f[1] + f[2];
>>> >> > �return ans;
>>> >> > }
>>> >> >
>>> >> > float* get_raw(P<V<float> > p) {
>>> >> > �return &((*p)[0]);
>>> >> > }
>>> >> >
>>> >> > void test() { // works fine
>>> >> > �P<V<float> > p(new V<float>());
>>> >> > �p->push_back(1);
>>> >> > �p->push_back(2);
>>> >> > �p->push_back(3);
>>> >> >
>>> >> > �// I want this to output 9
>>> >> > �std::cout << bind(foo, _1, _2, bind(get_raw, _3))(1, 2, p) <<
>>> std::endl;
>>> >> > }
>>> >> >
>>> >> >
>>> >> > int main() {
>>> >> > �using namespace luabind;
>>> >> >
>>> >> > �lua_State *L;
>>> >> >
>>> >> > �module( L )
>>> >> > � �[
>>> >> > � �namespace_("gl") [
>>> >> > � � �def( "glLightfv", glLightfv)
>>> >> > � � �// Why do these two lines not compile?
>>> >> > // � �, def( "glLightfv2", bind(glLightfv, _1, _2, _3))
>>> >> > // � �, def( "glLightfv3", bind(glLightfv, _1, _2, bind(get_raw,
>>> _3)))
>>> >> > � �]
>>> >> > � �]
>>> >> >
>>> >> > � �;
>>> >> > }
>>> >> >
>>> >> > ------------------------------------------------------------------------------
>>> >> > Learn how Oracle Real Application Clusters (RAC) One Node allows
>>> customers
>>> >> > to consolidate database storage, standardize their database
>>> environment, and,
>>> >> > should the need arise, upgrade to a full multi-node Oracle RAC
>>> database
>>> >> > without downtime or disruption
>>> >> > http://p.sf.net/sfu/oracle-sfdevnl
>>> >> > _______________________________________________
>>> >> > luabind-user mailing list
>>> >> > [email protected]
>>> >> > https://lists.sourceforge.net/lists/listinfo/luabind-user
>>> >> >
>>> >> >
>>> >> >
>>> >> >
>>> >> > ------------------------------------------------------------------------------
>>> >> > Learn how Oracle Real Application Clusters (RAC) One Node allows
>>> customers
>>> >> > to consolidate database storage, standardize their database
>>> environment, and,
>>> >> > should the need arise, upgrade to a full multi-node Oracle RAC
>>> database
>>> >> > without downtime or disruption
>>> >> > http://p.sf.net/sfu/oracle-sfdevnl
>>> >> > _______________________________________________
>>> >> > luabind-user mailing list
>>> >> > [email protected]
>>> >> > https://lists.sourceforge.net/lists/listinfo/luabind-user
>>> >> >
>>> >>
>>> >> ------------------------------------------------------------------------------
>>> >> Learn how Oracle Real Application Clusters (RAC) One Node allows
>>> customers
>>> >> to consolidate database storage, standardize their database
>>> environment, and,
>>> >> should the need arise, upgrade to a full multi-node Oracle RAC
>>> database
>>> >> without downtime or disruption
>>> >> http://p.sf.net/sfu/oracle-sfdevnl
>>> >> _______________________________________________
>>> >> luabind-user mailing list
>>> >> [email protected]
>>> >> https://lists.sourceforge.net/lists/listinfo/luabind-user
>>> >>
>>> >>
>>> >>
>>> >>
>>> >> ------------------------------------------------------------------------------
>>> >> Learn how Oracle Real Application Clusters (RAC) One Node allows
>>> customers
>>> >> to consolidate database storage, standardize their database
>>> environment, and,
>>> >> should the need arise, upgrade to a full multi-node Oracle RAC
>>> database
>>> >> without downtime or disruption
>>> >> http://p.sf.net/sfu/oracle-sfdevnl
>>> >> _______________________________________________
>>> >> luabind-user mailing list
>>> >> [email protected]
>>> >> https://lists.sourceforge.net/lists/listinfo/luabind-user
>>> >
>>> >
>>> >
>>> > ------------------------------------------------------------------------------
>>> > Learn how Oracle Real Application Clusters (RAC) One Node allows
>>> customers
>>> > to consolidate database storage, standardize their database
>>> environment, and,
>>> > should the need arise, upgrade to a full multi-node Oracle RAC
>>> database
>>> > without downtime or disruption
>>> > http://p.sf.net/sfu/oracle-sfdevnl
>>> > _______________________________________________
>>> > luabind-user mailing list
>>> > [email protected]
>>> > https://lists.sourceforge.net/lists/listinfo/luabind-user
>>> >
>>>
>>> ------------------------------------------------------------------------------
>>> Learn how Oracle Real Application Clusters (RAC) One Node allows
>>> customers
>>> to consolidate database storage, standardize their database
>>> environment, and,
>>> should the need arise, upgrade to a full multi-node Oracle RAC database
>>> without downtime or disruption
>>> http://p.sf.net/sfu/oracle-sfdevnl
>>> _______________________________________________
>>> luabind-user mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/luabind-user
>>
>>
>> ------------------------------------------------------------------------------
>> Learn how Oracle Real Application Clusters (RAC) One Node allows
>> customers
>> to consolidate database storage, standardize their database environment,
>> and,
>> should the need arise, upgrade to a full multi-node Oracle RAC database
>> without downtime or disruption
>> http://p.sf.net/sfu/oracle-sfdevnl
>> _______________________________________________
>> luabind-user mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/luabind-user
>>
>>
>
> ------------------------------------------------------------------------------
> Learn how Oracle Real Application Clusters (RAC) One Node allows customers
> to consolidate database storage, standardize their database environment,
> and,
> should the need arise, upgrade to a full multi-node Oracle RAC database
> without downtime or disruption
> http://p.sf.net/sfu/oracle-sfdevnl
> _______________________________________________
> luabind-user mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/luabind-user
>



------------------------------------------------------------------------------
Learn how Oracle Real Application Clusters (RAC) One Node allows customers
to consolidate database storage, standardize their database environment, and, 
should the need arise, upgrade to a full multi-node Oracle RAC database 
without downtime or disruption
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
luabind-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/luabind-user
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.