16f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/*
26f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Copyright (C) 2015 The Android Open Source Project
36f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
46f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
56f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * you may not use this file except in compliance with the License.
66f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * You may obtain a copy of the License at
76f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
86f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
96f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Unless required by applicable law or agreed to in writing, software
116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * See the License for the specific language governing permissions and
146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * limitations under the License.
156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */
166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
176f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#ifndef AAPT_CONFIG_DESCRIPTION_H
186f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#define AAPT_CONFIG_DESCRIPTION_H
196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
201ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "util/StringPiece.h"
216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <androidfw/ResourceTypes.h>
236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <ostream>
246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt {
266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/*
286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Subclass of ResTable_config that adds convenient
296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * initialization and comparison methods.
306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */
316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct ConfigDescription : public android::ResTable_config {
3252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    /**
3352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski     * Returns an immutable default config.
3452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski     */
3552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    static const ConfigDescription& defaultConfig();
3652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    /*
386f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski     * Parse a string of the form 'fr-sw600dp-land' and fill in the
396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski     * given ResTable_config with resulting configuration parameters.
406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski     *
416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski     * The resulting configuration has the appropriate sdkVersion defined
426f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski     * for backwards compatibility.
436f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski     */
446f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    static bool parse(const StringPiece& str, ConfigDescription* out = nullptr);
456f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
466f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    /**
476f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski     * If the configuration uses an axis that was added after
486f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski     * the original Android release, make sure the SDK version
496f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski     * is set accordingly.
506f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski     */
516f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    static void applyVersionForCompatibility(ConfigDescription* config);
526f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
536f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    ConfigDescription();
546f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    ConfigDescription(const android::ResTable_config& o);
556f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    ConfigDescription(const ConfigDescription& o);
566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    ConfigDescription(ConfigDescription&& o);
576f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
586f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    ConfigDescription& operator=(const android::ResTable_config& o);
596f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    ConfigDescription& operator=(const ConfigDescription& o);
606f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    ConfigDescription& operator=(ConfigDescription&& o);
616f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
626f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    bool operator<(const ConfigDescription& o) const;
636f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    bool operator<=(const ConfigDescription& o) const;
646f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    bool operator==(const ConfigDescription& o) const;
656f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    bool operator!=(const ConfigDescription& o) const;
666f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    bool operator>=(const ConfigDescription& o) const;
676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    bool operator>(const ConfigDescription& o) const;
686f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski};
696f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
706f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ConfigDescription::ConfigDescription() {
716f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    memset(this, 0, sizeof(*this));
726f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    size = sizeof(android::ResTable_config);
736f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
746f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
756f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ConfigDescription::ConfigDescription(const android::ResTable_config& o) {
766f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    *static_cast<android::ResTable_config*>(this) = o;
776f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    size = sizeof(android::ResTable_config);
786f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
796f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
806f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ConfigDescription::ConfigDescription(const ConfigDescription& o) {
816f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    *static_cast<android::ResTable_config*>(this) = o;
826f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
836f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
846f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ConfigDescription::ConfigDescription(ConfigDescription&& o) {
856f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    *this = o;
866f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
876f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
886f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ConfigDescription& ConfigDescription::operator=(const android::ResTable_config& o) {
896f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    *static_cast<android::ResTable_config*>(this) = o;
906f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    size = sizeof(android::ResTable_config);
916f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return *this;
926f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
936f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
946f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ConfigDescription& ConfigDescription::operator=(const ConfigDescription& o) {
956f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    *static_cast<android::ResTable_config*>(this) = o;
966f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return *this;
976f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
986f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
996f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ConfigDescription& ConfigDescription::operator=(ConfigDescription&& o) {
1006f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    *this = o;
1016f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return *this;
1026f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
1036f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
1046f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline bool ConfigDescription::operator<(const ConfigDescription& o) const {
1056f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return compare(o) < 0;
1066f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
1076f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
1086f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline bool ConfigDescription::operator<=(const ConfigDescription& o) const {
1096f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return compare(o) <= 0;
1106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
1116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
1126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline bool ConfigDescription::operator==(const ConfigDescription& o) const {
1136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return compare(o) == 0;
1146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
1156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
1166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline bool ConfigDescription::operator!=(const ConfigDescription& o) const {
1176f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return compare(o) != 0;
1186f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
1196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
1206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline bool ConfigDescription::operator>=(const ConfigDescription& o) const {
1216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return compare(o) >= 0;
1226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
1236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
1246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline bool ConfigDescription::operator>(const ConfigDescription& o) const {
1256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return compare(o) > 0;
1266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
1276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
1286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ::std::ostream& operator<<(::std::ostream& out, const ConfigDescription& o) {
1296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return out << o.toString().string();
1306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
1316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
1326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} // namespace aapt
1336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
1346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#endif // AAPT_CONFIG_DESCRIPTION_H
135