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