SkCommandLineFlags.h revision 58190644c30e1c4aa8e527f3503c58f841e0fcf3
1096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger/*
2096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Copyright 2013 Google Inc.
3096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
4096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
5096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * found in the LICENSE file.
6096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */
7096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
8e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger#ifndef SK_COMMAND_LINE_FLAGS_H
9e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger#define SK_COMMAND_LINE_FLAGS_H
10096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
11096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#include "SkString.h"
127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkTArray.h"
1358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkTDArray.h"
14096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
15096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger/**
16e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  Including this file (and compiling SkCommandLineFlags.cpp) provides command line
17096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  parsing. In order to use it, use the following macros in global
18096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  namespace:
19096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
20096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DEFINE_bool(name, defaultValue, helpString);
21096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DEFINE_string(name, defaultValue, helpString);
22096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DEFINE_int32(name, defaultValue, helpString);
23096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DEFINE_double(name, defaultValue, helpString);
24096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
25e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  Then, in main, call SkCommandLineFlags::SetUsage() to describe usage and call
26e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  SkCommandLineFlags::Parse() to parse the flags. Henceforth, each flag can
27096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  be referenced using
28096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
29096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  FLAGS_name
30096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
31096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  For example, the line
32096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
33096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DEFINE_bool(boolean, false, "The variable boolean does such and such");
34096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
35096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  will create the following variable:
36096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
37096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  bool FLAGS_boolean;
38096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
39096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  which will initially be set to false, and can be set to true by using the
40096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  flag "--boolean" on the commandline. "--noboolean" will set FLAGS_boolean
41e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  to false. FLAGS_boolean can also be set using "--boolean=true" or
42e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  "--boolean true" (where "true" can be replaced by "false", "TRUE", "FALSE",
43e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  "1" or "0").
44e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *
45e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  The helpString will be printed if the help flag (-h or -help) is used.
46096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
47096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  Similarly, the line
48096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
49096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DEFINE_int32(integer, .., ..);
50096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
51096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  will create
52096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
53096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  int32_t FLAGS_integer;
54096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
55096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  and
56096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
57096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DEFINE_double(real, .., ..);
58096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
59096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  will create
60096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
61096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  double FLAGS_real;
62096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
63096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  These flags can be set by specifying, for example, "--integer 7" and
64096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  "--real 3.14" on the command line.
65096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
66096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  Unlike the others, the line
67096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
68096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DEFINE_string(args, .., ..);
69096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
70096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  creates an array:
71096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *  SkCommandLineFlags::StringArray FLAGS_args;
73096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
74096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  If the default value is the empty string, FLAGS_args will default to a size
75096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  of zero. Otherwise it will default to a size of 1 with the default string
76096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  as its value. All strings that follow the flag on the command line (until
77096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  a string that begins with '-') will be entries in the array.
78096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
79096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  Any flag can be referenced from another file after using the following:
80096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
81096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  DECLARE_x(name);
82096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
83096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  (where 'x' is the type specified in the DEFINE).
84096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *
85096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  Inspired by gflags (https://code.google.com/p/gflags/). Is not quite as
86096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  robust as gflags, but suits our purposes. For example, allows creating
87e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  a flag -h or -help which will never be used, since SkCommandLineFlags handles it.
88e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger *  SkCommandLineFlags will also allow creating --flag and --noflag. Uses the same input
89096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  format as gflags and creates similarly named variables (i.e. FLAGS_name).
90096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  Strings are handled differently (resulting variable will be an array of
91096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger *  strings) so that a flag can be followed by multiple parameters.
92096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */
93096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
94096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerclass SkFlagInfo;
95096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
96e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenbergerclass SkCommandLineFlags {
97096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
98096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerpublic:
99096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /**
100096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  Call to set the help message to be displayed. Should be called before
101e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *  Parse.
102096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     */
103096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    static void SetUsage(const char* usage);
104096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
105096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /**
106096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  Call at the beginning of main to parse flags created by DEFINE_x, above.
107096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     *  Must only be called once.
108096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     */
109e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger    static void Parse(int argc, char** argv);
110096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
11158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    /* Takes a list of the form [~][^]match[$]
11258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     ~ causes a matching test to always be skipped
11358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     ^ requires the start of the test to match
11458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     $ requires the end of the test to match
11558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     ^ and $ requires an exact match
11658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger     If a test does not match any list entry, it is skipped unless some list entry starts with ~
11758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    */
11858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    static bool ShouldSkip(const SkTDArray<const char*>& strings, const char* name);
11958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
1207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    /**
1217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  Custom class for holding the arguments for a string flag.
1227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  Publicly only has accessors so the strings cannot be modified.
1237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     */
1247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    class StringArray {
1257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    public:
1267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        const char* operator[](int i) const {
1277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkASSERT(i >= 0 && i < fStrings.count());
1287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            return fStrings[i].c_str();
1297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        int count() const {
1327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            return fStrings.count();
1337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        bool isEmpty() const { return this->count() == 0; }
1367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    private:
1387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        void reset() { fStrings.reset(); }
1397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        void append(const char* string) {
1417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fStrings.push_back().set(string);
1427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        void append(const char* string, size_t length) {
1457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fStrings.push_back().set(string, length);
1467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkTArray<SkString> fStrings;
1497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        friend class SkFlagInfo;
1517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    };
1527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
153096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerprivate:
154096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    static SkFlagInfo* gHead;
155096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    static SkString    gUsage;
156096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
157096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    // For access to gHead.
158096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    friend class SkFlagInfo;
159096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger};
160096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
161096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define TO_STRING2(s) #s
162096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define TO_STRING(s) TO_STRING2(s)
163096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
164096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DEFINE_bool(name, defaultValue, helpString)                         \
165096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerbool FLAGS_##name;                                                          \
166096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic bool unused_##name = SkFlagInfo::CreateBoolFlag(TO_STRING(name),     \
167096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                       NULL,                \
168096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                       &FLAGS_##name,       \
169096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                       defaultValue,        \
170096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                       helpString)
171096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
172096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger// bool 2 allows specifying a short name. No check is done to ensure that shortName
173096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger// is actually shorter than name.
174096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DEFINE_bool2(name, shortName, defaultValue, helpString)             \
175096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerbool FLAGS_##name;                                                          \
176096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic bool unused_##name = SkFlagInfo::CreateBoolFlag(TO_STRING(name),     \
177096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                       TO_STRING(shortName),\
178096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                       &FLAGS_##name,       \
179096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                       defaultValue,        \
180096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                       helpString)
181096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
182096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DECLARE_bool(name) extern bool FLAGS_##name;
183096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
184096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DEFINE_string(name, defaultValue, helpString)                       \
1857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek SollenbergerSkCommandLineFlags::StringArray FLAGS_##name;                               \
186096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic bool unused_##name = SkFlagInfo::CreateStringFlag(TO_STRING(name),   \
187096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         NULL,              \
188096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         &FLAGS_##name,     \
189096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         defaultValue,      \
190096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         helpString)
191096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
1927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger// string2 allows specifying a short name. There is an assert that shortName
1937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger// is only 1 character.
194096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DEFINE_string2(name, shortName, defaultValue, helpString)               \
1957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek SollenbergerSkCommandLineFlags::StringArray FLAGS_##name;                                   \
196096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic bool unused_##name = SkFlagInfo::CreateStringFlag(TO_STRING(name),       \
197096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         TO_STRING(shortName),  \
198096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         &FLAGS_##name,         \
199096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         defaultValue,          \
200096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         helpString)
201096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
2027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define DECLARE_string(name) extern SkCommandLineFlags::StringArray FLAGS_##name;
203096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
204096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DEFINE_int32(name, defaultValue, helpString)                        \
205096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerint32_t FLAGS_##name;                                                       \
206096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic bool unused_##name = SkFlagInfo::CreateIntFlag(TO_STRING(name),      \
207096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                      &FLAGS_##name,        \
208096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                      defaultValue,         \
209096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                      helpString)
210096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
211096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DECLARE_int32(name) extern int32_t FLAGS_##name;
212096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
213096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DEFINE_double(name, defaultValue, helpString)                       \
214096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerdouble FLAGS_##name;                                                        \
215096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerstatic bool unused_##name = SkFlagInfo::CreateDoubleFlag(TO_STRING(name),   \
216096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         &FLAGS_##name,     \
217096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         defaultValue,      \
218096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                                         helpString)
219096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
220096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define DECLARE_double(name) extern double FLAGS_##name;
221096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
222096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerclass SkFlagInfo {
223096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
224096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerpublic:
225096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    enum FlagTypes {
226096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        kBool_FlagType,
227096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        kString_FlagType,
228096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        kInt_FlagType,
229096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        kDouble_FlagType,
230096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    };
231096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
2327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    /**
2337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  Each Create<Type>Flag function creates an SkFlagInfo of the specified type. The SkFlagInfo
2347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  object is appended to a list, which is deleted when SkCommandLineFlags::Parse is called.
2357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  Therefore, each call should be made before the call to ::Parse. They are not intended
2367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  to be called directly. Instead, use the macros described above.
2377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param name Long version (at least 2 characters) of the name of the flag. This name can
2387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *      be referenced on the command line as "--name" to set the value of this flag.
2397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param shortName Short version (one character) of the name of the flag. This name can
2407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *      be referenced on the command line as "-shortName" to set the value of this flag.
2417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param p<Type> Pointer to a global variable which holds the value set by SkCommandLineFlags.
2427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param defaultValue The default value of this flag. The variable pointed to by p<Type> will
2437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *      be set to this value initially. This is also displayed as part of the help output.
2447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param helpString Explanation of what this flag changes in the program.
2457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     */
246096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    static bool CreateBoolFlag(const char* name, const char* shortName, bool* pBool,
247096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                               bool defaultValue, const char* helpString) {
2487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkFlagInfo* info = SkNEW_ARGS(SkFlagInfo, (name, shortName, kBool_FlagType, helpString));
249096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        info->fBoolValue = pBool;
250096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        *info->fBoolValue = info->fDefaultBool = defaultValue;
251096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        return true;
252096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
253096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
2547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    /**
2557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  See comments for CreateBoolFlag.
2567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param pStrings Unlike the others, this is a pointer to an array of values.
2577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param defaultValue Thise default will be parsed so that strings separated by spaces
2587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *      will be added to pStrings.
2597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     */
260096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    static bool CreateStringFlag(const char* name, const char* shortName,
2617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                 SkCommandLineFlags::StringArray* pStrings,
2627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                 const char* defaultValue, const char* helpString);
263096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
2647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    /**
2657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  See comments for CreateBoolFlag.
2667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     */
267096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    static bool CreateIntFlag(const char* name, int32_t* pInt,
268096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                              int32_t defaultValue, const char* helpString) {
2697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkFlagInfo* info = SkNEW_ARGS(SkFlagInfo, (name, NULL, kInt_FlagType, helpString));
270096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        info->fIntValue = pInt;
271096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        *info->fIntValue = info->fDefaultInt = defaultValue;
272096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        return true;
273096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
274096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
2757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    /**
2767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  See comments for CreateBoolFlag.
2777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     */
278096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    static bool CreateDoubleFlag(const char* name, double* pDouble,
279096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                                 double defaultValue, const char* helpString) {
2807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkFlagInfo* info = SkNEW_ARGS(SkFlagInfo, (name, NULL, kDouble_FlagType, helpString));
281096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        info->fDoubleValue = pDouble;
282096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        *info->fDoubleValue = info->fDefaultDouble = defaultValue;
283096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        return true;
284096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
285096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
286096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /**
287e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *  Returns true if the string matches this flag.
288e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *  For a boolean flag, also sets the value, since a boolean flag can be set in a number of ways
289e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *  without looking at the following string:
290e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *      --name
291e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *      --noname
292e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *      --name=true
293e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *      --name=false
294e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *      --name=1
295e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *      --name=0
296e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *      --name=TRUE
297e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger     *      --name=FALSE
298096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     */
299e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger    bool match(const char* string);
300096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
301096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    FlagTypes getFlagType() const { return fFlagType; }
302096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
303096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    void resetStrings() {
304096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        if (kString_FlagType == fFlagType) {
305096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            fStrings->reset();
306096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        } else {
307096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            SkASSERT(!"Can only call resetStrings on kString_FlagType");
308096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        }
309096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
310096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
311096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    void append(const char* string) {
312096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        if (kString_FlagType == fFlagType) {
3137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fStrings->append(string);
314096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        } else {
315096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            SkASSERT(!"Can only append to kString_FlagType");
316096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        }
317096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
318096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
319096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    void setInt(int32_t value) {
320096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        if (kInt_FlagType == fFlagType) {
321096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            *fIntValue = value;
322096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        } else {
323096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            SkASSERT(!"Can only call setInt on kInt_FlagType");
324096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        }
325096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
326096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
327096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    void setDouble(double value) {
328096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        if (kDouble_FlagType == fFlagType) {
329096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            *fDoubleValue = value;
330096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        } else {
331096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            SkASSERT(!"Can only call setDouble on kDouble_FlagType");
332096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        }
333096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
334096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
335e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger    void setBool(bool value) {
336e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger        if (kBool_FlagType == fFlagType) {
337e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger            *fBoolValue = value;
338e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger        } else {
339e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger            SkASSERT(!"Can only call setBool on kBool_FlagType");
340e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger        }
341e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger    }
342e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger
343096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkFlagInfo* next() { return fNext; }
344096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
345096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    const SkString& name() const { return fName; }
346096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
347e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger    const SkString& shortName() const { return fShortName; }
348e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger
349096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    const SkString& help() const { return fHelpString; }
350096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
351096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkString defaultValue() const {
352096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        SkString result;
353096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        switch (fFlagType) {
354096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            case SkFlagInfo::kBool_FlagType:
355096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                result.printf("%s", fDefaultBool ? "true" : "false");
356096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                break;
357096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            case SkFlagInfo::kString_FlagType:
358096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                return fDefaultString;
359096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            case SkFlagInfo::kInt_FlagType:
360096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                result.printf("%i", fDefaultInt);
361096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                break;
362096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            case SkFlagInfo::kDouble_FlagType:
363096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                result.printf("%2.2f", fDefaultDouble);
364096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                break;
365096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            default:
366096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                SkASSERT(!"Invalid flag type");
367096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        }
368096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        return result;
369096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
370096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
371096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkString typeAsString() const {
372096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        switch (fFlagType) {
373096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            case SkFlagInfo::kBool_FlagType:
374096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                return SkString("bool");
375096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            case SkFlagInfo::kString_FlagType:
376096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                return SkString("string");
377096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            case SkFlagInfo::kInt_FlagType:
378096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                return SkString("int");
379096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            case SkFlagInfo::kDouble_FlagType:
380096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                return SkString("double");
381096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            default:
382096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                SkASSERT(!"Invalid flag type");
383096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger                return SkString();
384096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        }
385096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
386096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
387096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerprivate:
3887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkFlagInfo(const char* name, const char* shortName, FlagTypes type, const char* helpString)
389096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        : fName(name)
3907839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        , fShortName(shortName)
391096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fFlagType(type)
392096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fHelpString(helpString)
393096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fBoolValue(NULL)
394096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fDefaultBool(false)
395096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fIntValue(NULL)
396096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fDefaultInt(0)
397096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fDoubleValue(NULL)
398096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fDefaultDouble(0)
399096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        , fStrings(NULL) {
400e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger        fNext = SkCommandLineFlags::gHead;
401e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger        SkCommandLineFlags::gHead = this;
4027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkASSERT(NULL != name && strlen(name) > 1);
4037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkASSERT(NULL == shortName || 1 == strlen(shortName));
404096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
4057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
4067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    /**
4077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  Set a StringArray to hold the values stored in defaultStrings.
4087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param array The StringArray to modify.
4097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *  @param defaultStrings Space separated list of strings that should be inserted into array
4107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     *      individually.
4117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger     */
4127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    static void SetDefaultStrings(SkCommandLineFlags::StringArray* array,
4137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                  const char* defaultStrings);
4147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
415096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    // Name of the flag, without initial dashes
416096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkString             fName;
417096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkString             fShortName;
418096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    FlagTypes            fFlagType;
419096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkString             fHelpString;
420096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    bool*                fBoolValue;
421096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    bool                 fDefaultBool;
422096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    int32_t*             fIntValue;
423096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    int32_t              fDefaultInt;
424096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    double*              fDoubleValue;
425096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    double               fDefaultDouble;
4267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkCommandLineFlags::StringArray* fStrings;
427096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    // Both for the help string and in case fStrings is empty.
428096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkString             fDefaultString;
429096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
430096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    // In order to keep a linked list.
431096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    SkFlagInfo*          fNext;
432096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger};
433e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger#endif // SK_COMMAND_LINE_FLAGS_H
434