Grouper.cpp revision 40e8eefbedcafc51948945647d746daaee092f16
140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski/* 240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * Copyright (C) 2014 The Android Open Source Project 340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * 440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * you may not use this file except in compliance with the License. 640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * You may obtain a copy of the License at 740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * 840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * 1040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * Unless required by applicable law or agreed to in writing, software 1140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 1240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * See the License for the specific language governing permissions and 1440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * limitations under the License. 1540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski */ 1640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 1740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include "Grouper.h" 1840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 1940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include "SplitDescription.h" 2040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 2140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include <utils/KeyedVector.h> 2240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include <utils/Vector.h> 2340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 2440e8eefbedcafc51948945647d746daaee092f16Adam Lesinskiusing namespace android; 2540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 2640e8eefbedcafc51948945647d746daaee092f16Adam Lesinskinamespace split { 2740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 2840e8eefbedcafc51948945647d746daaee092f16Adam Lesinskitemplate <typename Key, typename Value> 2940e8eefbedcafc51948945647d746daaee092f16Adam Lesinskistatic void addToVector(KeyedVector<Key, SortedVector<Value> >& group, 3040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski const Key& key, const Value& value) { 3140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski ssize_t idx = group.indexOfKey(key); 3240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski if (idx < 0) { 3340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski idx = group.add(key, SortedVector<Value>()); 3440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 3540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski group.editValueAt(idx).add(value); 3640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} 3740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 3840e8eefbedcafc51948945647d746daaee092f16Adam LesinskiVector<SortedVector<SplitDescription> > 3940e8eefbedcafc51948945647d746daaee092f16Adam LesinskigroupByMutualExclusivity(const Vector<SplitDescription>& splits) { 4040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski Vector<SortedVector<SplitDescription> > groups; 4140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 4240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski // Find mutually exclusive splits and group them. 4340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski KeyedVector<SplitDescription, SortedVector<SplitDescription> > densityGroups; 4440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski KeyedVector<SplitDescription, SortedVector<SplitDescription> > abiGroups; 4540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski KeyedVector<SplitDescription, SortedVector<SplitDescription> > localeGroups; 4640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski for (const SplitDescription& split : splits) { 4740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski if (split.config.density != 0) { 4840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski SplitDescription key(split); 4940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski key.config.density = 0; 5040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski key.config.sdkVersion = 0; // Ignore density so we can support anydpi. 5140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addToVector(densityGroups, key, split); 5240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } else if (split.abi != abi::Variant::none) { 5340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski SplitDescription key(split); 5440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski key.abi = abi::Variant::none; 5540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addToVector(abiGroups, key, split); 5640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } else if (split.config.locale != 0) { 5740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski SplitDescription key(split); 5840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski key.config.clearLocale(); 5940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski addToVector(localeGroups, key, split); 6040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } else { 6140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski groups.add(); 6240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski groups.editTop().add(split); 6340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 6440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 6540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 6640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski const size_t densityCount = densityGroups.size(); 6740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski for (size_t i = 0; i < densityCount; i++) { 6840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski groups.add(densityGroups[i]); 6940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 7040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 7140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski const size_t abiCount = abiGroups.size(); 7240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski for (size_t i = 0; i < abiCount; i++) { 7340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski groups.add(abiGroups[i]); 7440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 7540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 7640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski const size_t localeCount = localeGroups.size(); 7740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski for (size_t i = 0; i < localeCount; i++) { 7840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski groups.add(localeGroups[i]); 7940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 8040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski return groups; 8140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} 8240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 8340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} // namespace split 84