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