|
Boost : |
Subject: Re: [boost] [Hana] Announcing Hana's formal review next week (June 10th)
From: Louis Dionne (ldionne.2_at_[hidden])
Date: 2015-06-17 08:36:47
Larry Evans <cppljevans <at> suddenlink.net> writes:
>
> On 06/13/2015 09:52 AM, Louis Dionne wrote:
> > Larry Evans <cppljevans <at> suddenlink.net> writes:
> >
> >>
> >> On 06/09/2015 11:00 AM, Louis Dionne wrote:
> >> [snip]
> >>>
> >>> Indeed, you are using a Map when what you really want is a Tuple, since
> >>> your keys are integers. Here's the version I would have written:
> >>>
> >>> [...]
> >>>
> >>> However, I can easily imagine another example where you actually need
> >>> the functionality of a Map. See below for performance comments.
> >>>
> >> [snip]
> >> Why couldn't map be implemented as a tuple, as shown here:
> >>
> >> https://gist.github.com/cppljevans/8e545e8d83946cd74311
> >>
> >> Wouldn't that eliminate the difference in performance between
> >> map and tuple?
> >
> > The problem with this approach is that equality of keys can't be more
> > general than type identity. In other words, in your example, writing
> >
> > get<_ulong<1>>(mud)
> >
> > would fail because there is no _ulong<1> key, but only a _uint<1>, even
> > though they compare equal. I want to determine the equality of keys with
> > the `equal` function, which is more general. Of course, in the specific
> > case of a Map mapping types (and only types) to values, then your approach
> > could be used, and it is in fact exactly what I had in mind.
> >
>
> OK. I hadn't thought of that. OTOH, why not just patch the gist map
> with a method for doing the get_key using the more general `equal`
> function. Then you could have both the fast find with get, and the
> more general get_key using the `equal` function?
That's an idea. My initial idea was to simply detect when a map is created
with all the keys being Types. In that case, lookup by == is just lookup
by is_same, and you can use an optimized representation for the Map, and
an optimized version of the lookup algorithm. Such a Map might be created
with map_t<...> or something, I haven't figured that one out yet. It's
similar to the way you can use tuple_t<...> to create a tuple optimized
for types.
> BTW, I'm trying to do this at the moment; however, I'm having
> a tough time figuring out how to do it. I've looked at:
>
> https://github.com/ldionne/hana/blob/master/include/boost/hana/map.hpp#L44
>
> and guessed that maybe I can start by using superclasses for
> my gist map the same as the at map.hpp#L44, and then maybe
> reading http://ldionne.com/hana/index.html#tutorial-extending.
> Is that what you'd recommend?
Yes, that is what I would recommend. There's a new, extended version of this
section in the develop branch, but you'd have to read the source if you wanted
to see it. See [1] if you're interested. Otherwise, the section on the master
branch might be enough to get you started.
Regards,
Louis
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk