summaryrefslogtreecommitdiffstats
path: root/tools/split-select/SplitSelector.cpp
diff options
context:
space:
mode:
authorAdam Lesinski <adamlesinski@google.com>2015-01-20 21:41:45 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-01-20 21:41:46 +0000
commitaee7225e34376a90e8c25e5df53604085cc1b712 (patch)
tree1db2646e1368400bcba92a44e9a3e6c2cef0a0ea /tools/split-select/SplitSelector.cpp
parent7651dcb92193a5a970a2554e067ec14d6fcad802 (diff)
parent42eea270a0a2bc54f454312817c41ac357e3a884 (diff)
downloadframeworks_base-aee7225e34376a90e8c25e5df53604085cc1b712.zip
frameworks_base-aee7225e34376a90e8c25e5df53604085cc1b712.tar.gz
frameworks_base-aee7225e34376a90e8c25e5df53604085cc1b712.tar.bz2
Merge "Process base APK" into lmp-mr1-dev
Diffstat (limited to 'tools/split-select/SplitSelector.cpp')
-rw-r--r--tools/split-select/SplitSelector.cpp85
1 files changed, 85 insertions, 0 deletions
diff --git a/tools/split-select/SplitSelector.cpp b/tools/split-select/SplitSelector.cpp
new file mode 100644
index 0000000..567e057
--- /dev/null
+++ b/tools/split-select/SplitSelector.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <utils/KeyedVector.h>
+#include <utils/SortedVector.h>
+#include <utils/Vector.h>
+
+#include "Grouper.h"
+#include "Rule.h"
+#include "RuleGenerator.h"
+#include "SplitSelector.h"
+
+namespace split {
+
+using namespace android;
+
+SplitSelector::SplitSelector() {
+}
+
+SplitSelector::SplitSelector(const Vector<SplitDescription>& splits)
+ : mGroups(groupByMutualExclusivity(splits)) {
+}
+
+static void selectBestFromGroup(const SortedVector<SplitDescription>& splits,
+ const SplitDescription& target, Vector<SplitDescription>& splitsOut) {
+ SplitDescription bestSplit;
+ bool isSet = false;
+ const size_t splitCount = splits.size();
+ for (size_t j = 0; j < splitCount; j++) {
+ const SplitDescription& thisSplit = splits[j];
+ if (!thisSplit.match(target)) {
+ continue;
+ }
+
+ if (!isSet || thisSplit.isBetterThan(bestSplit, target)) {
+ isSet = true;
+ bestSplit = thisSplit;
+ }
+ }
+
+ if (isSet) {
+ splitsOut.add(bestSplit);
+ }
+}
+
+Vector<SplitDescription> SplitSelector::getBestSplits(const SplitDescription& target) const {
+ Vector<SplitDescription> bestSplits;
+ const size_t groupCount = mGroups.size();
+ for (size_t i = 0; i < groupCount; i++) {
+ selectBestFromGroup(mGroups[i], target, bestSplits);
+ }
+ return bestSplits;
+}
+
+KeyedVector<SplitDescription, sp<Rule> > SplitSelector::getRules() const {
+ KeyedVector<SplitDescription, sp<Rule> > rules;
+
+ const size_t groupCount = mGroups.size();
+ for (size_t i = 0; i < groupCount; i++) {
+ const SortedVector<SplitDescription>& splits = mGroups[i];
+ const size_t splitCount = splits.size();
+ for (size_t j = 0; j < splitCount; j++) {
+ sp<Rule> rule = Rule::simplify(RuleGenerator::generate(splits, j));
+ if (rule != NULL) {
+ rules.add(splits[j], rule);
+ }
+ }
+ }
+ return rules;
+}
+
+} // namespace split