Re: boost bind/lambda
beo wulf <[email protected]>
| Newsgroups | gmane.comp.lang.lua.bind.user |
|---|---|
| Message-ID | <[email protected]> |
I like to take this moment to thank everyone for their insights into luabind, boost, and OpenGL issues. I've managed to luabind all the constants/functions I need. Thanks again! On Wed, Jan 5, 2011 at 4:25 PM, Nigel Atkinson <[email protected]> wrote: > 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 > ------------------------------------------------------------------------------ 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