1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Worker #ifndef AAPT_UTIL_IMMUTABLEMAP_H 18*d57664e9SAndroid Build Coastguard Worker #define AAPT_UTIL_IMMUTABLEMAP_H 19*d57664e9SAndroid Build Coastguard Worker 20*d57664e9SAndroid Build Coastguard Worker #include <utility> 21*d57664e9SAndroid Build Coastguard Worker #include <vector> 22*d57664e9SAndroid Build Coastguard Worker 23*d57664e9SAndroid Build Coastguard Worker #include "util/TypeTraits.h" 24*d57664e9SAndroid Build Coastguard Worker 25*d57664e9SAndroid Build Coastguard Worker namespace aapt { 26*d57664e9SAndroid Build Coastguard Worker 27*d57664e9SAndroid Build Coastguard Worker template <typename TKey, typename TValue> 28*d57664e9SAndroid Build Coastguard Worker class ImmutableMap { 29*d57664e9SAndroid Build Coastguard Worker static_assert(is_comparable<TKey, TKey>::value, "key is not comparable"); 30*d57664e9SAndroid Build Coastguard Worker 31*d57664e9SAndroid Build Coastguard Worker public: 32*d57664e9SAndroid Build Coastguard Worker using const_iterator = 33*d57664e9SAndroid Build Coastguard Worker typename std::vector<std::pair<TKey, TValue>>::const_iterator; 34*d57664e9SAndroid Build Coastguard Worker 35*d57664e9SAndroid Build Coastguard Worker ImmutableMap(ImmutableMap&&) noexcept = default; 36*d57664e9SAndroid Build Coastguard Worker ImmutableMap& operator=(ImmutableMap&&) noexcept = default; 37*d57664e9SAndroid Build Coastguard Worker CreatePreSorted(std::initializer_list<std::pair<TKey,TValue>> list)38*d57664e9SAndroid Build Coastguard Worker static ImmutableMap<TKey, TValue> CreatePreSorted( 39*d57664e9SAndroid Build Coastguard Worker std::initializer_list<std::pair<TKey, TValue>> list) { 40*d57664e9SAndroid Build Coastguard Worker return ImmutableMap( 41*d57664e9SAndroid Build Coastguard Worker std::vector<std::pair<TKey, TValue>>(list.begin(), list.end())); 42*d57664e9SAndroid Build Coastguard Worker } 43*d57664e9SAndroid Build Coastguard Worker CreateAndSort(std::initializer_list<std::pair<TKey,TValue>> list)44*d57664e9SAndroid Build Coastguard Worker static ImmutableMap<TKey, TValue> CreateAndSort( 45*d57664e9SAndroid Build Coastguard Worker std::initializer_list<std::pair<TKey, TValue>> list) { 46*d57664e9SAndroid Build Coastguard Worker std::vector<std::pair<TKey, TValue>> data(list.begin(), list.end()); 47*d57664e9SAndroid Build Coastguard Worker std::sort(data.begin(), data.end()); 48*d57664e9SAndroid Build Coastguard Worker return ImmutableMap(std::move(data)); 49*d57664e9SAndroid Build Coastguard Worker } 50*d57664e9SAndroid Build Coastguard Worker 51*d57664e9SAndroid Build Coastguard Worker template <typename TKey2, typename = typename std::enable_if< 52*d57664e9SAndroid Build Coastguard Worker is_comparable<TKey, TKey2>::value>::type> find(const TKey2 & key)53*d57664e9SAndroid Build Coastguard Worker const_iterator find(const TKey2& key) const { 54*d57664e9SAndroid Build Coastguard Worker auto cmp = [](const std::pair<TKey, TValue>& candidate, 55*d57664e9SAndroid Build Coastguard Worker const TKey2& target) -> bool { 56*d57664e9SAndroid Build Coastguard Worker return candidate.first < target; 57*d57664e9SAndroid Build Coastguard Worker }; 58*d57664e9SAndroid Build Coastguard Worker 59*d57664e9SAndroid Build Coastguard Worker const_iterator end_iter = end(); 60*d57664e9SAndroid Build Coastguard Worker auto iter = std::lower_bound(data_.begin(), end_iter, key, cmp); 61*d57664e9SAndroid Build Coastguard Worker if (iter == end_iter || iter->first == key) { 62*d57664e9SAndroid Build Coastguard Worker return iter; 63*d57664e9SAndroid Build Coastguard Worker } 64*d57664e9SAndroid Build Coastguard Worker return end_iter; 65*d57664e9SAndroid Build Coastguard Worker } 66*d57664e9SAndroid Build Coastguard Worker begin()67*d57664e9SAndroid Build Coastguard Worker const_iterator begin() const { return data_.begin(); } 68*d57664e9SAndroid Build Coastguard Worker end()69*d57664e9SAndroid Build Coastguard Worker const_iterator end() const { return data_.end(); } 70*d57664e9SAndroid Build Coastguard Worker 71*d57664e9SAndroid Build Coastguard Worker private: 72*d57664e9SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(ImmutableMap); 73*d57664e9SAndroid Build Coastguard Worker ImmutableMap(std::vector<std::pair<TKey,TValue>> data)74*d57664e9SAndroid Build Coastguard Worker explicit ImmutableMap(std::vector<std::pair<TKey, TValue>> data) 75*d57664e9SAndroid Build Coastguard Worker : data_(std::move(data)) {} 76*d57664e9SAndroid Build Coastguard Worker 77*d57664e9SAndroid Build Coastguard Worker std::vector<std::pair<TKey, TValue>> data_; 78*d57664e9SAndroid Build Coastguard Worker }; 79*d57664e9SAndroid Build Coastguard Worker 80*d57664e9SAndroid Build Coastguard Worker } // namespace aapt 81*d57664e9SAndroid Build Coastguard Worker 82*d57664e9SAndroid Build Coastguard Worker #endif /* AAPT_UTIL_IMMUTABLEMAP_H */ 83