18338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar/*
28338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar * Copyright 2016 The Android Open Source Project
38338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar *
48338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar * Licensed under the Apache License, Version 2.0 (the "License");
58338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar * you may not use this file except in compliance with the License.
68338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar * You may obtain a copy of the License at
78338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar *
88338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar *      http://www.apache.org/licenses/LICENSE-2.0
98338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar *
108338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar * Unless required by applicable law or agreed to in writing, software
118338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar * distributed under the License is distributed on an "AS IS" BASIS,
128338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar * See the License for the specific language governing permissions and
148338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar * limitations under the License.
158338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar */
168338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
178338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar#ifndef A_LOOKUP_H_
188338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
198338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar#define A_LOOKUP_H_
208338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
218338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar#include <utility>
228338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar#include <vector>
238338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
248338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnarnamespace android {
258338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
268338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnartemplate<typename T, typename U>
278338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnarstruct ALookup {
288338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar    ALookup(std::initializer_list<std::pair<T, U>> list);
298338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
3058fb7c6e1a9244dd7215a647388c440d8d75851bLajos Molnar    bool lookup(const T& from, U *to) const;
3158fb7c6e1a9244dd7215a647388c440d8d75851bLajos Molnar    bool rlookup(const U& from, T *to) const;
325771a0bc0c44956940564631026e17f2a9c1f32dLajos Molnar
335771a0bc0c44956940564631026e17f2a9c1f32dLajos Molnar    template<typename V, typename = typename std::enable_if<!std::is_same<T, V>::value>::type>
3458fb7c6e1a9244dd7215a647388c440d8d75851bLajos Molnar    inline bool map(const T& from, V *to) const { return lookup(from, to); }
355771a0bc0c44956940564631026e17f2a9c1f32dLajos Molnar
365771a0bc0c44956940564631026e17f2a9c1f32dLajos Molnar    template<typename V, typename = typename std::enable_if<!std::is_same<T, V>::value>::type>
3758fb7c6e1a9244dd7215a647388c440d8d75851bLajos Molnar    inline bool map(const V& from, T *to) const { return rlookup(from, to); }
388338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
398338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnarprivate:
408338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar    std::vector<std::pair<T, U>> mTable;
418338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar};
428338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
438338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnartemplate<typename T, typename U>
448338519ba2d8d731072c4edf7b9953787ce834cfLajos MolnarALookup<T, U>::ALookup(std::initializer_list<std::pair<T, U>> list)
458338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar    : mTable(list) {
468338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar}
478338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
488338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnartemplate<typename T, typename U>
4958fb7c6e1a9244dd7215a647388c440d8d75851bLajos Molnarbool ALookup<T, U>::lookup(const T& from, U *to) const {
508338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar    for (auto elem : mTable) {
518338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar        if (elem.first == from) {
528338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar            *to = elem.second;
538338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar            return true;
548338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar        }
558338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar    }
568338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar    return false;
578338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar}
588338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
598338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnartemplate<typename T, typename U>
6058fb7c6e1a9244dd7215a647388c440d8d75851bLajos Molnarbool ALookup<T, U>::rlookup(const U& from, T *to) const {
618338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar    for (auto elem : mTable) {
628338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar        if (elem.second == from) {
638338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar            *to = elem.first;
648338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar            return true;
658338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar        }
668338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar    }
678338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar    return false;
688338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar}
698338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
708338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar} // namespace android
718338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar
728338519ba2d8d731072c4edf7b9953787ce834cfLajos Molnar#endif  // A_UTILS_H_
73