add string_compose argument specializations so that empty std::string and empty C...
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 17 Sep 2015 21:16:05 +0000 (17:16 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 17 Sep 2015 21:16:23 +0000 (17:16 -0400)
libs/pbd/pbd/compose.h

index cb4182699f53292024a1c3cbbc8f2b28d05dfc97..b3b6ea21d1c8bbef9af6ec728b1e0bfe8e2f8b2d 100644 (file)
@@ -54,6 +54,10 @@ namespace StringPrivate
     template <typename T>
     Composition &arg(const T &obj);
 
+    // specialization to catch strings (C++ and C)
+    Composition &arg(const std::string &str);
+    Composition &arg(char const * const cstr);
+
     // compose and return string
     std::string str() const;
 
@@ -138,6 +142,42 @@ namespace StringPrivate
     return *this;
   }
 
+  inline Composition &Composition::arg(const std::string &str)
+  {
+         /* specialization to ensure that empty strings show up
+          * in the output
+          */
+         for (specification_map::const_iterator i = specs.lower_bound(arg_no),
+                      end = specs.upper_bound(arg_no); i != end; ++i) {
+                 output_list::iterator pos = i->second;
+                 ++pos;
+
+                 output.insert(pos, str);
+         }
+
+         ++arg_no;
+
+         return *this;
+  }
+
+  inline Composition &Composition::arg(char const * const cstr)
+  {
+         /* specialization to ensure that empty C strings show up
+          * in the output
+          */
+         for (specification_map::const_iterator i = specs.lower_bound(arg_no),
+                      end = specs.upper_bound(arg_no); i != end; ++i) {
+                 output_list::iterator pos = i->second;
+                 ++pos;
+
+                 output.insert(pos, std::string (cstr));
+         }
+
+         ++arg_no;
+         
+         return *this;
+  }
+
   inline Composition::Composition(std::string fmt)
     : arg_no(1)
   {