Re: boost bind/lambda

beo wulf <[email protected]>
Newsgroups gmane.comp.lang.lua.bind.user
Message-ID <[email protected]>
Admittedly, function pointers are currently not planned. I just wanted
to avoid hand wrapping all GLint* GLfloat* GL...* functions.

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
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.