From c1d6a2fd92fb2e68335c03940684c27ac3ec6680 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 17 Sep 2015 17:16:05 -0400 Subject: [PATCH] add string_compose argument specializations so that empty std::string and empty C strings are handled as intended --- libs/pbd/pbd/compose.h | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/libs/pbd/pbd/compose.h b/libs/pbd/pbd/compose.h index cb4182699f..b3b6ea21d1 100644 --- a/libs/pbd/pbd/compose.h +++ b/libs/pbd/pbd/compose.h @@ -54,6 +54,10 @@ namespace StringPrivate template 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) {