summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-05-22 17:03:05 +0000
committerChris Lattner <sabre@nondot.org>2002-05-22 17:03:05 +0000
commit8f7b500fffcd235a7a9b2a5b05837104f156bd9f (patch)
treeab07604c19c61af68e3b6eb620cbf1e075a73461
parenta482d52ff46ac601ad4fd695ea2b2b7d2f56b90f (diff)
downloadbcm5719-llvm-8f7b500fffcd235a7a9b2a5b05837104f156bd9f.tar.gz
bcm5719-llvm-8f7b500fffcd235a7a9b2a5b05837104f156bd9f.zip
Add ability to update existing variables with values read from the command line
to certain classes. This is nice because it means that in header files we can just declare a value, and still have that value be set based on a command-line argument. The difference is now that the #include of CommandLine.h does not need to go into the header file as well. llvm-svn: 2708
-rw-r--r--llvm/include/Support/CommandLine.h57
-rw-r--r--llvm/lib/Support/CommandLine.cpp2
-rw-r--r--llvm/support/lib/Support/CommandLine.cpp2
3 files changed, 50 insertions, 11 deletions
diff --git a/llvm/include/Support/CommandLine.h b/llvm/include/Support/CommandLine.h
index 3c0ac1ac693..b07b162a47b 100644
--- a/llvm/include/Support/CommandLine.h
+++ b/llvm/include/Support/CommandLine.h
@@ -176,12 +176,22 @@ public:
// Boolean/flag command line option
//
class Flag : public Option {
- bool Value;
+ bool &Value;
+ bool DValue;
virtual bool handleOccurance(const char *ArgName, const std::string &Arg);
public:
inline Flag(const char *ArgStr, const char *Message, int Flags = 0,
- bool DefaultVal = 0) : Option(ArgStr, Message, Flags),
- Value(DefaultVal) {}
+ bool DefaultVal = false)
+ : Option(ArgStr, Message, Flags), Value(DValue) {
+ Value = DefaultVal;
+ }
+
+ inline Flag(bool &UpdateVal, const char *ArgStr, const char *Message,
+ int Flags = 0, bool DefaultVal = false)
+ : Option(ArgStr, Message, Flags), Value(UpdateVal) {
+ Value = DefaultVal;
+ }
+
operator const bool() const { return Value; }
inline bool operator=(bool Val) { Value = Val; return Val; }
};
@@ -278,7 +288,6 @@ public:
class EnumValueBase : public EnumBase {
protected:
- int Value;
inline EnumValueBase(const char *ArgStr, const char *Help, int Flags)
: EnumBase(ArgStr, Help, Flags) {}
inline EnumValueBase(int Flags) : EnumBase(Flags) {}
@@ -293,6 +302,9 @@ protected:
// to-be-maintained width is specified.
//
virtual void printOptionInfo(unsigned GlobalWidth) const;
+
+ // setValue - Subclasses override this when they need to receive a new value
+ virtual void setValue(int Val) = 0;
};
template <class E> // The enum we are representing
@@ -300,17 +312,31 @@ class Enum : public EnumValueBase {
virtual enum ValueExpected getValueExpectedFlagDefault() const {
return ValueRequired;
}
+ E DVal;
+ E &Value;
+
+ // setValue - Subclasses override this when they need to receive a new value
+ virtual void setValue(int Val) { Value = (E)Val; }
public:
inline Enum(const char *ArgStr, int Flags, const char *Help, ...)
- : EnumValueBase(ArgStr, Help, Flags) {
+ : EnumValueBase(ArgStr, Help, Flags), Value(DVal) {
va_list Values;
va_start(Values, Help);
processValues(Values);
va_end(Values);
- Value = ValueMap.front().second.first; // Grab default value
+ Value = (E)ValueMap.front().second.first; // Grab default value
}
- inline operator E() const { return (E)Value; }
+ inline Enum(E &EUpdate, const char *ArgStr, int Flags, const char *Help, ...)
+ : EnumValueBase(ArgStr, Help, Flags), Value(EUpdate) {
+ va_list Values;
+ va_start(Values, Help);
+ processValues(Values);
+ va_end(Values);
+ Value = (E)ValueMap.front().second.first; // Grab default value
+ }
+
+ inline operator E() const { return Value; }
inline E operator=(E Val) { Value = Val; return Val; }
};
@@ -337,14 +363,27 @@ protected:
template <class E> // The enum we are representing
class EnumFlags : public EnumFlagsBase {
+ E DVal;
+ E &Value;
+
+ // setValue - Subclasses override this when they need to receive a new value
+ virtual void setValue(int Val) { Value = (E)Val; }
public:
- inline EnumFlags(int Flags, ...) : EnumFlagsBase(Flags) {
+ inline EnumFlags(int Flags, ...) : EnumFlagsBase(Flags), Value(DVal) {
+ va_list Values;
+ va_start(Values, Flags);
+ processValues(Values);
+ va_end(Values);
+ registerArgs();
+ Value = (E)ValueMap.front().second.first; // Grab default value
+ }
+ inline EnumFlags(E &RV, int Flags, ...) : EnumFlagsBase(Flags), Value(RV) {
va_list Values;
va_start(Values, Flags);
processValues(Values);
va_end(Values);
registerArgs();
- Value = ValueMap.front().second.first; // Grab default value
+ Value = (E)ValueMap.front().second.first; // Grab default value
}
inline operator E() const { return (E)Value; }
diff --git a/llvm/lib/Support/CommandLine.cpp b/llvm/lib/Support/CommandLine.cpp
index 194dd33b27e..c3f18bd1528 100644
--- a/llvm/lib/Support/CommandLine.cpp
+++ b/llvm/lib/Support/CommandLine.cpp
@@ -346,7 +346,7 @@ bool EnumValueBase::handleOccurance(const char *ArgName, const string &Arg) {
return error(": unrecognized alternative '" + Arg +
"'! Alternatives are: " + Alternatives);
}
- Value = ValueMap[i].second.first;
+ setValue(ValueMap[i].second.first);
return false;
}
diff --git a/llvm/support/lib/Support/CommandLine.cpp b/llvm/support/lib/Support/CommandLine.cpp
index 194dd33b27e..c3f18bd1528 100644
--- a/llvm/support/lib/Support/CommandLine.cpp
+++ b/llvm/support/lib/Support/CommandLine.cpp
@@ -346,7 +346,7 @@ bool EnumValueBase::handleOccurance(const char *ArgName, const string &Arg) {
return error(": unrecognized alternative '" + Arg +
"'! Alternatives are: " + Alternatives);
}
- Value = ValueMap[i].second.first;
+ setValue(ValueMap[i].second.first);
return false;
}
OpenPOWER on IntegriCloud