Re: Conversion policies

David Abrahams <[email protected]>
Newsgroups gmane.comp.lib.boost.langbinding
Message-ID <[email protected]>
Daniel Wallin <[email protected]> writes:

> At 23:40 2003-08-07, David Abrahams wrote:
>>Daniel Wallin <[email protected]> writes:
>>
>> > At 14:51 2003-08-05, David Abrahams wrote:
>> >>Daniel Wallin <[email protected]> writes:
>> >>
>> >> > I've checked in a basic framework for conversion policies, like the
>> >> > one we have in luabind.
>> >> >
>> >> >    boost/langbinding/policy.hpp
>> >>
>> >>Q1: Why use a handbuilt cons-list in lieu of mpl::list?
>> >
>> > Because I want to overload operator+ to compose the list. Also I want to
>> > be able to have data in the policies.
>>
>>Oh, sounds like a tuple.
>
> Yeah, it is.
>
>> >>Q2: Conversion policies may carry data in them; it seems to me that
>> >>     you need a runtime identification mechanism.  How about CRTP?
>> >
>> > Elaborate, where does CRTP apply here?
>>
>>Never mind; I misinterpreted your code.  I think it's finally dawning
>>on me what it's intended to do... but a realistic usage example would
>>be a huge help.
>
> OK. Sorry for being vague. I'll try with some short examples:
>
> This is the policy system which handles the converter generators and
> precall/postcall. Consider a typical invoke-function:
>
> template<class R, class A0, class A1, class Policies>
> ret_type invoke(R(*fn)(A0, A1), const Policies& policies)
> {
>     // find the converter generators for the given parameter index
>     typedef typename find_conversion_policy<1, Policies>::type conversion_gen1;
>     typedef typename find_conversion_policy<2, Policies>::type conversion_gen2;
>
>     // generate a converter for the associated type
>     typename conversion_gen1::template generate_converter<A0,
>     xxx_to_cpp>::type c1;
>     typename conversion_gen2::template generate_converter<A1,
>     xxx_to_cpp>::type c2;
>
>     // the converter objects are later applied to the parameter passed from the
>     // interpreter state to get the actual parameters.
> }

OK, I understand now.

here's what I was thinking might make for a more efficient
implementation.  Instead of using all of that TMP inside of every
wrapped function implementation, arrange the policies type so that it
can do all the work with overloading:

template<class R, class A0, class A1, class Policies>
ret_type invoke(R(*fn)(A0, A1), const Policies& policies, ArgTuple t)
{
    if !(
         policies.check(_1, identity<A0>(), t[0])
       , policies.check(_2, identity<A1>(), t[1])
    )
    return kOverloadFailed;
        
    return policies.from_cxx(
        fn(
             policies.to_cxx(_1, identity<A0>(), t[0])
           , policies.to_cxx(_2, identity<A1>(), t[1])
        )
    );
}

Just a thought.

> The purpose of the xxx_to_cpp/cpp_to_xxx types is to have converter generators
> that can generate converters for both directions.

OK.

-- 
Dave Abrahams
Boost Consulting
www.boost-consulting.com



-------------------------------------------------------
This SF.Net email sponsored by: Free pre-built ASP.NET sites including
Data Reports, E-commerce, Portals, and Forums are available now.
Download today and enter to win an XBOX or Visual Studio .NET.
http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01
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.