| #ifndef METAL_MAP_AT_KEY_HPP |
| #define METAL_MAP_AT_KEY_HPP |
|
|
| #include "../config.hpp" |
|
|
| namespace metal { |
| |
| namespace detail { |
| template <class seq, class key> |
| struct _at_key; |
| } |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| template <class seq, class key> |
| using at_key = typename detail::_at_key<seq, key>::type; |
| } |
|
|
| #include "../detail/declptr.hpp" |
| #include "../list/list.hpp" |
| #include "../number/number.hpp" |
| #include "../value/distinct.hpp" |
| #include "../value/value.hpp" |
|
|
| namespace metal { |
| |
| namespace detail { |
| template <class, class = true_> |
| struct table { |
| }; |
|
|
| template <class... keys, class... vals> |
| struct table<list<list<keys, vals>...>, distinct<list<keys, vals>...>> |
| : list<keys, vals>... { |
| }; |
|
|
| template <> |
| struct table<list<>> { |
| }; |
|
|
| template <class key, class val> |
| value<val> lookup(list<key, val>*); |
|
|
| template <class> |
| value<> lookup(...); |
|
|
| template <class seq, class key> |
| struct _at_key : decltype(lookup<key>(declptr<table<seq>>())) { |
| }; |
| } |
| |
| } |
|
|
| #endif |
|
|