Index: src/flags.cc |
diff --git a/src/flags.cc b/src/flags.cc |
index 2aa4e6bd48587e2a267f4eb1563c7a1fb428d6d5..15836da7826acdefb55d00edda470a63252386d2 100644 |
--- a/src/flags.cc |
+++ b/src/flags.cc |
@@ -30,8 +30,8 @@ namespace { |
// to the actual flag, default value, comment, etc. This is designed to be POD |
// initialized as to avoid requiring static constructors. |
struct Flag { |
- enum FlagType { TYPE_BOOL, TYPE_MAYBE_BOOL, TYPE_INT, TYPE_FLOAT, |
- TYPE_STRING, TYPE_ARGS }; |
+ enum FlagType { TYPE_BOOL, TYPE_MAYBE_BOOL, TYPE_INT, TYPE_INTPTR, |
+ TYPE_FLOAT, TYPE_STRING, TYPE_ARGS }; |
FlagType type_; // What type of flag, bool, int, or string. |
const char* name_; // Name of the flag, ex "my_flag". |
@@ -61,6 +61,11 @@ struct Flag { |
return reinterpret_cast<int*>(valptr_); |
} |
+ intptr_t* intptr_variable() const { |
+ DCHECK(type_ == TYPE_INTPTR); |
+ return reinterpret_cast<intptr_t*>(valptr_); |
+ } |
+ |
double* float_variable() const { |
DCHECK(type_ == TYPE_FLOAT); |
return reinterpret_cast<double*>(valptr_); |
@@ -94,6 +99,11 @@ struct Flag { |
return *reinterpret_cast<const int*>(defptr_); |
} |
+ int intptr_default() const { |
+ DCHECK(type_ == TYPE_INTPTR); |
+ return *reinterpret_cast<const intptr_t*>(defptr_); |
+ } |
+ |
double float_default() const { |
DCHECK(type_ == TYPE_FLOAT); |
return *reinterpret_cast<const double*>(defptr_); |
@@ -118,6 +128,8 @@ struct Flag { |
return maybe_bool_variable()->has_value == false; |
case TYPE_INT: |
return *int_variable() == int_default(); |
+ case TYPE_INTPTR: |
+ return *intptr_variable() == intptr_default(); |
case TYPE_FLOAT: |
return *float_variable() == float_default(); |
case TYPE_STRING: { |
@@ -146,6 +158,9 @@ struct Flag { |
case TYPE_INT: |
*int_variable() = int_default(); |
break; |
+ case TYPE_INTPTR: |
+ *intptr_variable() = intptr_default(); |
+ break; |
case TYPE_FLOAT: |
*float_variable() = float_default(); |
break; |
@@ -174,6 +189,7 @@ static const char* Type2String(Flag::FlagType type) { |
case Flag::TYPE_BOOL: return "bool"; |
case Flag::TYPE_MAYBE_BOOL: return "maybe_bool"; |
case Flag::TYPE_INT: return "int"; |
+ case Flag::TYPE_INTPTR: return "intptr_t"; |
case Flag::TYPE_FLOAT: return "float"; |
case Flag::TYPE_STRING: return "string"; |
case Flag::TYPE_ARGS: return "arguments"; |
@@ -196,6 +212,9 @@ std::ostream& operator<<(std::ostream& os, const Flag& flag) { // NOLINT |
case Flag::TYPE_INT: |
os << *flag.int_variable(); |
break; |
+ case Flag::TYPE_INTPTR: |
+ os << *flag.intptr_variable(); |
+ break; |
case Flag::TYPE_FLOAT: |
os << *flag.float_variable(); |
break; |
@@ -396,6 +415,11 @@ int FlagList::SetFlagsFromCommandLine(int* argc, |
case Flag::TYPE_INT: |
*flag->int_variable() = strtol(value, &endp, 10); // NOLINT |
break; |
+ case Flag::TYPE_INTPTR: |
+ // TODO(bnoordhuis) Use strtoll()? C++11 library feature |
+ // that may not be available everywhere yet. |
+ *flag->intptr_variable() = strtol(value, &endp, 10); // NOLINT |
+ break; |
case Flag::TYPE_FLOAT: |
*flag->float_variable() = strtod(value, &endp); |
break; |