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