]> granicus.if.org Git - clang/commitdiff
Add ArgList::MakeArgString and make ArgList::Make* const.
authorDaniel Dunbar <daniel@zuster.org>
Tue, 17 Mar 2009 17:51:18 +0000 (17:51 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Tue, 17 Mar 2009 17:51:18 +0000 (17:51 +0000)
 - Slightly strange, but the idea is that the ArgList data structure
   is primarily a list of arguments; we want to allow clients to still
   add argument strings to an ArgList to avoid worrying about string
   lifetimes (or unnecessary string copying).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67086 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Driver/ArgList.h
lib/Driver/ArgList.cpp

index f4ab57e0590fe87cb7aba61d006633919e30a9ed..06c434c0225b7b6ebb84c4e9839b0bea4b0b3e65 100644 (file)
@@ -35,14 +35,22 @@ namespace driver {
 
   private:
     /// List of argument strings used by the contained Args.
-    ArgStringList ArgStrings;
+    ///
+    /// This is mutable since we treat the ArgList as being the list
+    /// of Args, and allow routines to add new strings (to have a
+    /// convenient place to store the memory) via MakeIndex.
+    mutable ArgStringList ArgStrings;
+
+    /// Strings for synthesized arguments.
+    ///
+    /// This is mutable since we treat the ArgList as being the list
+    /// of Args, and allow routines to add new strings (to have a
+    /// convenient place to store the memory) via MakeIndex.
+    mutable std::list<std::string> SynthesizedStrings;
 
     /// The full list of arguments.
     arglist_type Args;
 
-    /// Strings for synthesized arguments.
-    std::list<std::string> SynthesizedStrings;
-
   public:
     ArgList(const char **ArgBegin, const char **ArgEnd);
     ArgList(const ArgList &);
@@ -79,25 +87,29 @@ namespace driver {
 
   private:    
     /// MakeIndex - Get an index for the given string(s).
-    unsigned MakeIndex(const char *String0);
-    unsigned MakeIndex(const char *String0, const char *String1);
+    unsigned MakeIndex(const char *String0) const;
+    unsigned MakeIndex(const char *String0, const char *String1) const;
 
   public:
+    /// MakeArgString - Construct a constant string pointer whose
+    /// lifetime will match that of the ArgList.
+    const char *MakeArgString(const char *Str) const;
+
     /// MakeFlagArg - Construct a new FlagArg for the given option
     /// \arg Id.
-    Arg *MakeFlagArg(const Option *Opt);
+    Arg *MakeFlagArg(const Option *Opt) const;
 
     /// MakePositionalArg - Construct a new Positional arg for the
     /// given option \arg Id, with the provided \arg Value.
-    Arg *MakePositionalArg(const Option *Opt, const char *Value);
+    Arg *MakePositionalArg(const Option *Opt, const char *Value) const;
 
     /// MakeSeparateArg - Construct a new Positional arg for the
     /// given option \arg Id, with the provided \arg Value.
-    Arg *MakeSeparateArg(const Option *Opt, const char *Value);
+    Arg *MakeSeparateArg(const Option *Opt, const char *Value) const;
 
     /// MakeJoinedArg - Construct a new Positional arg for the
     /// given option \arg Id, with the provided \arg Value.
-    Arg *MakeJoinedArg(const Option *Opt, const char *Value);
+    Arg *MakeJoinedArg(const Option *Opt, const char *Value) const;
 
     /// @}
   };
index d32d9f2185642aeae28136dbdf056b8f281c837e..66fcb708856c922a82b70a9eacf894c936cd8e06 100644 (file)
@@ -44,7 +44,7 @@ Arg *ArgList::getLastArg(options::ID Id, bool Claim) const {
   return 0;
 }
 
-unsigned ArgList::MakeIndex(const char *String0) {
+unsigned ArgList::MakeIndex(const char *String0) const {
   unsigned Index = ArgStrings.size();
 
   // Tuck away so we have a reliable const char *.
@@ -54,7 +54,7 @@ unsigned ArgList::MakeIndex(const char *String0) {
   return Index;
 }
 
-unsigned ArgList::MakeIndex(const char *String0, const char *String1) {
+unsigned ArgList::MakeIndex(const char *String0, const char *String1) const {
   unsigned Index0 = MakeIndex(String0);
   unsigned Index1 = MakeIndex(String1);
   assert(Index0 + 1 == Index1 && "Unexpected non-consecutive indices!");
@@ -62,19 +62,23 @@ unsigned ArgList::MakeIndex(const char *String0, const char *String1) {
   return Index0;
 }
 
-Arg *ArgList::MakeFlagArg(const Option *Opt) {
+const char *ArgList::MakeArgString(const char *Str) const {
+  return getArgString(MakeIndex(Str));
+}
+
+Arg *ArgList::MakeFlagArg(const Option *Opt) const {
   return new FlagArg(Opt, MakeIndex(Opt->getName()));
 }
 
-Arg *ArgList::MakePositionalArg(const Option *Opt, const char *Value) {
+Arg *ArgList::MakePositionalArg(const Option *Opt, const char *Value) const {
   return new PositionalArg(Opt, MakeIndex(Value));
 }
 
-Arg *ArgList::MakeSeparateArg(const Option *Opt, const char *Value) {
+Arg *ArgList::MakeSeparateArg(const Option *Opt, const char *Value) const {
   return new SeparateArg(Opt, MakeIndex(Opt->getName(), Value), 1);
 }
 
-Arg *ArgList::MakeJoinedArg(const Option *Opt, const char *Value) {
+Arg *ArgList::MakeJoinedArg(const Option *Opt, const char *Value) const {
   std::string Joined(Opt->getName());
   Joined += Value;
   return new JoinedArg(Opt, MakeIndex(Joined.c_str()));