Re: boost bind/lambda
beo wulf <[email protected]>
| Newsgroups | gmane.comp.lang.lua.bind.user |
|---|---|
| Message-ID | <[email protected]> |
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