1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2013 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef SK_COMMAND_LINE_FLAGS_H 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define SK_COMMAND_LINE_FLAGS_H 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "../private/SkTArray.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "../private/SkTDArray.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkString.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Including this file (and compiling SkCommandLineFlags.cpp) provides command line 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * parsing. In order to use it, use the following macros in global 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * namespace: 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * DEFINE_bool(name, defaultValue, helpString); 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * DEFINE_string(name, defaultValue, helpString); 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * DEFINE_int32(name, defaultValue, helpString); 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * DEFINE_double(name, defaultValue, helpString); 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Then, in main, call SkCommandLineFlags::SetUsage() to describe usage and call 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * SkCommandLineFlags::Parse() to parse the flags. Henceforth, each flag can 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * be referenced using 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * FLAGS_name 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * For example, the line 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * DEFINE_bool(boolean, false, "The variable boolean does such and such"); 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * will create the following variable: 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * bool FLAGS_boolean; 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * which will initially be set to false, and can be set to true by using the 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * flag "--boolean" on the commandline. "--noboolean" will set FLAGS_boolean 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * to false. FLAGS_boolean can also be set using "--boolean=true" or 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * "--boolean true" (where "true" can be replaced by "false", "TRUE", "FALSE", 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * "1" or "0"). 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * The helpString will be printed if the help flag (-h or -help) is used. 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Similarly, the line 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * DEFINE_int32(integer, .., ..); 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * will create 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * int32_t FLAGS_integer; 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * and 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * DEFINE_double(real, .., ..); 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * will create 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * double FLAGS_real; 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * These flags can be set by specifying, for example, "--integer 7" and 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * "--real 3.14" on the command line. 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Unlike the others, the line 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * DEFINE_string(args, .., ..); 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * creates an array: 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * SkCommandLineFlags::StringArray FLAGS_args; 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * If the default value is the empty string, FLAGS_args will default to a size 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * of zero. Otherwise it will default to a size of 1 with the default string 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * as its value. All strings that follow the flag on the command line (until 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * a string that begins with '-') will be entries in the array. 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * DEFINE_extended_string(args, .., .., extendedHelpString); 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * creates a similar string array flag as DEFINE_string. The flag will have extended help text 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * (extendedHelpString) that can the user can see with '--help <args>' flag. 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Any flag can be referenced from another file after using the following: 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * DECLARE_x(name); 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * (where 'x' is the type specified in the DEFINE). 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Inspired by gflags (https://code.google.com/p/gflags/). Is not quite as 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * robust as gflags, but suits our purposes. For example, allows creating 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * a flag -h or -help which will never be used, since SkCommandLineFlags handles it. 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * SkCommandLineFlags will also allow creating --flag and --noflag. Uses the same input 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * format as gflags and creates similarly named variables (i.e. FLAGS_name). 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Strings are handled differently (resulting variable will be an array of 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * strings) so that a flag can be followed by multiple parameters. 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkFlagInfo; 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkCommandLineFlags { 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Call to set the help message to be displayed. Should be called before 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Parse. 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static void SetUsage(const char* usage); 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Call this to display the help message. Should be called after SetUsage. 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static void PrintUsage(); 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Call at the beginning of main to parse flags created by DEFINE_x, above. 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Must only be called once. 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static void Parse(int argc, const char* const * argv); 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Custom class for holding the arguments for a string flag. 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Publicly only has accessors so the strings cannot be modified. 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot class StringArray { 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot public: 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot StringArray() { } 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot explicit StringArray(const SkTArray<SkString>& strings) 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : fStrings(strings) { 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* operator[](int i) const { 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(i >= 0 && i < fStrings.count()); 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fStrings[i].c_str(); 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int count() const { 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fStrings.count(); 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isEmpty() const { return this->count() == 0; } 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Returns true iff string is equal to one of the strings in this array. 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool contains(const char* string) const { 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < fStrings.count(); i++) { 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fStrings[i].equals(string)) { 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return true; 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return false; 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void set(int i, const char* str) { 155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fStrings[i].set(str); 156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkString* begin() const { return fStrings.begin(); } 159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkString* end() const { return fStrings.end(); } 160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot private: 162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void reset() { fStrings.reset(); } 163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void append(const char* string) { 165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fStrings.push_back().set(string); 166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void append(const char* string, size_t length) { 169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fStrings.push_back().set(string, length); 170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTArray<SkString> fStrings; 173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot friend class SkFlagInfo; 175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /* Takes a list of the form [~][^]match[$] 178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ~ causes a matching test to always be skipped 179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ^ requires the start of the test to match 180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot $ requires the end of the test to match 181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ^ and $ requires an exact match 182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot If a test does not match any list entry, it is skipped unless some list entry starts with ~ 183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static bool ShouldSkip(const SkTDArray<const char*>& strings, const char* name); 185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static bool ShouldSkip(const StringArray& strings, const char* name); 186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static SkFlagInfo* gHead; 189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static SkString gUsage; 190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // For access to gHead. 192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot friend class SkFlagInfo; 193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define TO_STRING2(s) #s 196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define TO_STRING(s) TO_STRING2(s) 197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DEFINE_bool(name, defaultValue, helpString) \ 199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotbool FLAGS_##name; \ 200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSK_UNUSED static bool unused_##name = SkFlagInfo::CreateBoolFlag(TO_STRING(name), \ 201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot nullptr, \ 202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot &FLAGS_##name, \ 203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot defaultValue, \ 204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot helpString) 205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// bool 2 allows specifying a short name. No check is done to ensure that shortName 207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// is actually shorter than name. 208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DEFINE_bool2(name, shortName, defaultValue, helpString) \ 209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotbool FLAGS_##name; \ 210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSK_UNUSED static bool unused_##name = SkFlagInfo::CreateBoolFlag(TO_STRING(name), \ 211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot TO_STRING(shortName),\ 212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot &FLAGS_##name, \ 213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot defaultValue, \ 214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot helpString) 215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DECLARE_bool(name) extern bool FLAGS_##name; 217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DEFINE_string(name, defaultValue, helpString) \ 219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkCommandLineFlags::StringArray FLAGS_##name; \ 220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSK_UNUSED static bool unused_##name = SkFlagInfo::CreateStringFlag(TO_STRING(name), \ 221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot nullptr, \ 222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot &FLAGS_##name, \ 223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot defaultValue, \ 224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot helpString, nullptr) 225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DEFINE_extended_string(name, defaultValue, helpString, extendedHelpString) \ 226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkCommandLineFlags::StringArray FLAGS_##name; \ 227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSK_UNUSED static bool unused_##name = SkFlagInfo::CreateStringFlag(TO_STRING(name), \ 228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot nullptr, \ 229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot &FLAGS_##name, \ 230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot defaultValue, \ 231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot helpString, \ 232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot extendedHelpString) 233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// string2 allows specifying a short name. There is an assert that shortName 235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// is only 1 character. 236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DEFINE_string2(name, shortName, defaultValue, helpString) \ 237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkCommandLineFlags::StringArray FLAGS_##name; \ 238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSK_UNUSED static bool unused_##name = SkFlagInfo::CreateStringFlag(TO_STRING(name), \ 239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot TO_STRING(shortName), \ 240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot &FLAGS_##name, \ 241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot defaultValue, \ 242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot helpString, nullptr) 243fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 244fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DECLARE_string(name) extern SkCommandLineFlags::StringArray FLAGS_##name; 245fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 246fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 247fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 248fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 249fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DEFINE_int32(name, defaultValue, helpString) \ 250fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotint32_t FLAGS_##name; \ 251fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSK_UNUSED static bool unused_##name = SkFlagInfo::CreateIntFlag(TO_STRING(name), \ 252fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot &FLAGS_##name, \ 253fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot defaultValue, \ 254fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot helpString) 255fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 256fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DEFINE_int32_2(name, shortName, defaultValue, helpString) \ 257fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotint32_t FLAGS_##name; \ 258fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSK_UNUSED static bool unused_##name = SkFlagInfo::CreateIntFlag(TO_STRING(name), \ 259fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot TO_STRING(shortName), \ 260fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot &FLAGS_##name, \ 261fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot defaultValue, \ 262fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot helpString) 263fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 264fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DECLARE_int32(name) extern int32_t FLAGS_##name; 265fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 266fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DEFINE_double(name, defaultValue, helpString) \ 267fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotdouble FLAGS_##name; \ 268fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSK_UNUSED static bool unused_##name = SkFlagInfo::CreateDoubleFlag(TO_STRING(name), \ 269fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot &FLAGS_##name, \ 270fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot defaultValue, \ 271fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot helpString) 272fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 273fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define DECLARE_double(name) extern double FLAGS_##name; 274fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 275fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkFlagInfo { 276fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 277fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 278fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum FlagTypes { 279fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kBool_FlagType, 280fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kString_FlagType, 281fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kInt_FlagType, 282fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kDouble_FlagType, 283fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 284fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 285fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 286fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Each Create<Type>Flag function creates an SkFlagInfo of the specified type. The SkFlagInfo 287fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * object is appended to a list, which is deleted when SkCommandLineFlags::Parse is called. 288fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Therefore, each call should be made before the call to ::Parse. They are not intended 289fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * to be called directly. Instead, use the macros described above. 290fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * @param name Long version (at least 2 characters) of the name of the flag. This name can 291fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * be referenced on the command line as "--name" to set the value of this flag. 292fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * @param shortName Short version (one character) of the name of the flag. This name can 293fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * be referenced on the command line as "-shortName" to set the value of this flag. 294fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * @param p<Type> Pointer to a global variable which holds the value set by SkCommandLineFlags. 295fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * @param defaultValue The default value of this flag. The variable pointed to by p<Type> will 296fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * be set to this value initially. This is also displayed as part of the help output. 297fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * @param helpString Explanation of what this flag changes in the program. 298fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 299fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static bool CreateBoolFlag(const char* name, const char* shortName, bool* pBool, 300fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool defaultValue, const char* helpString) { 301fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkFlagInfo* info = new SkFlagInfo(name, shortName, kBool_FlagType, helpString, nullptr); 302fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot info->fBoolValue = pBool; 303fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *info->fBoolValue = info->fDefaultBool = defaultValue; 304fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return true; 305fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 306fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 307fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 308fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * See comments for CreateBoolFlag. 309fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * @param pStrings Unlike the others, this is a pointer to an array of values. 310fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * @param defaultValue Thise default will be parsed so that strings separated by spaces 311fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * will be added to pStrings. 312fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 313fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static bool CreateStringFlag(const char* name, const char* shortName, 314fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkCommandLineFlags::StringArray* pStrings, 315fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* defaultValue, const char* helpString, 316fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* extendedHelpString); 317fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 318fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 319fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * See comments for CreateBoolFlag. 320fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 321fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static bool CreateIntFlag(const char* name, int32_t* pInt, 322fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int32_t defaultValue, const char* helpString) { 323fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkFlagInfo* info = new SkFlagInfo(name, nullptr, kInt_FlagType, helpString, nullptr); 324fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot info->fIntValue = pInt; 325fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *info->fIntValue = info->fDefaultInt = defaultValue; 326fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return true; 327fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 328fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 329fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static bool CreateIntFlag(const char* name, const char* shortName, int32_t* pInt, 330fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int32_t defaultValue, const char* helpString) { 331fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkFlagInfo* info = new SkFlagInfo(name, shortName, kInt_FlagType, helpString, nullptr); 332fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot info->fIntValue = pInt; 333fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *info->fIntValue = info->fDefaultInt = defaultValue; 334fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return true; 335fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 336fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 337fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 338fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * See comments for CreateBoolFlag. 339fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 340fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static bool CreateDoubleFlag(const char* name, double* pDouble, 341fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot double defaultValue, const char* helpString) { 342fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkFlagInfo* info = new SkFlagInfo(name, nullptr, kDouble_FlagType, helpString, nullptr); 343fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot info->fDoubleValue = pDouble; 344fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *info->fDoubleValue = info->fDefaultDouble = defaultValue; 345fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return true; 346fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 347fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 348fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 349fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Returns true if the string matches this flag. 350fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * For a boolean flag, also sets the value, since a boolean flag can be set in a number of ways 351fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * without looking at the following string: 352fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * --name 353fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * --noname 354fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * --name=true 355fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * --name=false 356fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * --name=1 357fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * --name=0 358fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * --name=TRUE 359fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * --name=FALSE 360fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 361fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool match(const char* string); 362fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 363fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot FlagTypes getFlagType() const { return fFlagType; } 364fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 365fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void resetStrings() { 366fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (kString_FlagType == fFlagType) { 367fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fStrings->reset(); 368fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 369fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDEBUGFAIL("Can only call resetStrings on kString_FlagType"); 370fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 371fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 372fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 373fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void append(const char* string) { 374fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (kString_FlagType == fFlagType) { 375fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fStrings->append(string); 376fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 377fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDEBUGFAIL("Can only append to kString_FlagType"); 378fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 379fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 380fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 381fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void setInt(int32_t value) { 382fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (kInt_FlagType == fFlagType) { 383fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *fIntValue = value; 384fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 385fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDEBUGFAIL("Can only call setInt on kInt_FlagType"); 386fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 387fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 388fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 389fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void setDouble(double value) { 390fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (kDouble_FlagType == fFlagType) { 391fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *fDoubleValue = value; 392fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 393fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDEBUGFAIL("Can only call setDouble on kDouble_FlagType"); 394fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 395fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 396fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 397fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void setBool(bool value) { 398fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (kBool_FlagType == fFlagType) { 399fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *fBoolValue = value; 400fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 401fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDEBUGFAIL("Can only call setBool on kBool_FlagType"); 402fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 403fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 404fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 405fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkFlagInfo* next() { return fNext; } 406fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 407fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkString& name() const { return fName; } 408fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 409fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkString& shortName() const { return fShortName; } 410fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 411fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkString& help() const { return fHelpString; } 412fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkString& extendedHelp() const { return fExtendedHelpString; } 413fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 414fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString defaultValue() const { 415fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString result; 416fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot switch (fFlagType) { 417fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkFlagInfo::kBool_FlagType: 418fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot result.printf("%s", fDefaultBool ? "true" : "false"); 419fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 420fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkFlagInfo::kString_FlagType: 421fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fDefaultString; 422fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkFlagInfo::kInt_FlagType: 423fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot result.printf("%i", fDefaultInt); 424fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 425fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkFlagInfo::kDouble_FlagType: 426fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot result.printf("%2.2f", fDefaultDouble); 427fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 428fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot default: 429fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDEBUGFAIL("Invalid flag type"); 430fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 431fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return result; 432fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 433fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 434fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString typeAsString() const { 435fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot switch (fFlagType) { 436fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkFlagInfo::kBool_FlagType: 437fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkString("bool"); 438fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkFlagInfo::kString_FlagType: 439fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkString("string"); 440fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkFlagInfo::kInt_FlagType: 441fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkString("int"); 442fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkFlagInfo::kDouble_FlagType: 443fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkString("double"); 444fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot default: 445fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDEBUGFAIL("Invalid flag type"); 446fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkString(); 447fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 448fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 449fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 450fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 451fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkFlagInfo(const char* name, const char* shortName, FlagTypes type, const char* helpString, 452fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* extendedHelpString) 453fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : fName(name) 454fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fShortName(shortName) 455fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fFlagType(type) 456fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fHelpString(helpString) 457fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fExtendedHelpString(extendedHelpString) 458fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fBoolValue(nullptr) 459fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fDefaultBool(false) 460fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fIntValue(nullptr) 461fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fDefaultInt(0) 462fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fDoubleValue(nullptr) 463fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fDefaultDouble(0) 464fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fStrings(nullptr) { 465fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fNext = SkCommandLineFlags::gHead; 466fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkCommandLineFlags::gHead = this; 467fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(name && strlen(name) > 1); 468fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(nullptr == shortName || 1 == strlen(shortName)); 469fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 470fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 471fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 472fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Set a StringArray to hold the values stored in defaultStrings. 473fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * @param array The StringArray to modify. 474fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * @param defaultStrings Space separated list of strings that should be inserted into array 475fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * individually. 476fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 477fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static void SetDefaultStrings(SkCommandLineFlags::StringArray* array, 478fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* defaultStrings); 479fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 480fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Name of the flag, without initial dashes 481fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fName; 482fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fShortName; 483fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot FlagTypes fFlagType; 484fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fHelpString; 485fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fExtendedHelpString; 486fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool* fBoolValue; 487fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fDefaultBool; 488fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int32_t* fIntValue; 489fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int32_t fDefaultInt; 490fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot double* fDoubleValue; 491fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot double fDefaultDouble; 492fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkCommandLineFlags::StringArray* fStrings; 493fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Both for the help string and in case fStrings is empty. 494fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fDefaultString; 495fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 496fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // In order to keep a linked list. 497fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkFlagInfo* fNext; 498fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 499fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif // SK_COMMAND_LINE_FLAGS_H 500