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