142eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski/* 242eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski * Copyright (C) 2014 The Android Open Source Project 342eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski * 442eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 542eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski * you may not use this file except in compliance with the License. 642eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski * You may obtain a copy of the License at 742eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski * 842eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 942eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski * 1042eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski * Unless required by applicable law or agreed to in writing, software 1142eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 1242eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1342eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski * See the License for the specific language governing permissions and 1442eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski * limitations under the License. 1542eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski */ 1642eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski 1742eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski#include <utils/KeyedVector.h> 1842eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski#include <utils/SortedVector.h> 1942eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski#include <utils/Vector.h> 2042eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski 2142eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski#include "Grouper.h" 2242eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski#include "Rule.h" 2342eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski#include "RuleGenerator.h" 2442eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski#include "SplitSelector.h" 2542eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski 2642eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinskinamespace split { 2742eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski 2842eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinskiusing namespace android; 2942eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski 3042eea270a0a2bc54f454312817c41ac357e3a884Adam LesinskiSplitSelector::SplitSelector() { 3142eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski} 3242eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski 3342eea270a0a2bc54f454312817c41ac357e3a884Adam LesinskiSplitSelector::SplitSelector(const Vector<SplitDescription>& splits) 3442eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski : mGroups(groupByMutualExclusivity(splits)) { 3542eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski} 3642eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski 3742eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinskistatic void selectBestFromGroup(const SortedVector<SplitDescription>& splits, 3842eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski const SplitDescription& target, Vector<SplitDescription>& splitsOut) { 3942eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski SplitDescription bestSplit; 4042eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski bool isSet = false; 4142eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski const size_t splitCount = splits.size(); 4242eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski for (size_t j = 0; j < splitCount; j++) { 4342eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski const SplitDescription& thisSplit = splits[j]; 4442eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski if (!thisSplit.match(target)) { 4542eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski continue; 4642eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski } 4742eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski 4842eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski if (!isSet || thisSplit.isBetterThan(bestSplit, target)) { 4942eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski isSet = true; 5042eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski bestSplit = thisSplit; 5142eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski } 5242eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski } 5342eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski 5442eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski if (isSet) { 5542eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski splitsOut.add(bestSplit); 5642eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski } 5742eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski} 5842eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski 5942eea270a0a2bc54f454312817c41ac357e3a884Adam LesinskiVector<SplitDescription> SplitSelector::getBestSplits(const SplitDescription& target) const { 6042eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski Vector<SplitDescription> bestSplits; 6142eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski const size_t groupCount = mGroups.size(); 6242eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski for (size_t i = 0; i < groupCount; i++) { 6342eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski selectBestFromGroup(mGroups[i], target, bestSplits); 6442eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski } 6542eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski return bestSplits; 6642eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski} 6742eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski 6842eea270a0a2bc54f454312817c41ac357e3a884Adam LesinskiKeyedVector<SplitDescription, sp<Rule> > SplitSelector::getRules() const { 6942eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski KeyedVector<SplitDescription, sp<Rule> > rules; 7042eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski 7142eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski const size_t groupCount = mGroups.size(); 7242eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski for (size_t i = 0; i < groupCount; i++) { 7342eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski const SortedVector<SplitDescription>& splits = mGroups[i]; 7442eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski const size_t splitCount = splits.size(); 7542eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski for (size_t j = 0; j < splitCount; j++) { 7642eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski sp<Rule> rule = Rule::simplify(RuleGenerator::generate(splits, j)); 7742eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski if (rule != NULL) { 7842eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski rules.add(splits[j], rule); 7942eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski } 8042eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski } 8142eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski } 8242eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski return rules; 8342eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski} 8442eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski 8542eea270a0a2bc54f454312817c41ac357e3a884Adam Lesinski} // namespace split 86