// Copyright 2014 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #pragma once #include "android/base/StringView.h" #include #include #include #include namespace android { namespace base { // Create a new string instance that contains the printf-style formatted // output from |format| and potentially any following arguments. std::string StringFormatRaw(const char* format, ...); // A variant of StringFormat() which uses a va_list to list formatting // parameters instead. std::string StringFormatWithArgs(const char* format, va_list args); // Appends a formatted string at the end of an existing string. // |string| is the target string instance, |format| the format string, // followed by any formatting parameters. This is more efficient than // appending the result of StringFormat(format,...) to |*string| directly. void StringAppendFormatRaw(std::string* string, const char* format, ...); // A variant of StringAppendFormat() that takes a va_list to list // formatting parameters. void StringAppendFormatWithArgs(std::string* string, const char* format, va_list args); // unpackFormatArg() is a set of overloaded functions needed to unpack // an argument of the formatting list to a POD value which can be passed // into the sprintf()-like C function // Anything which can be used to construct a string goes here and unpacks into // a const char* inline const char* unpackFormatArg(const std::string& str) { return str.c_str(); } // Forward all PODs as-is template constexpr T&& unpackFormatArg(T&& t, typename std::enable_if< std::is_pod::type>::value >::type* = nullptr) { return std::forward(t); } // These templated versions of StringFormat*() allow one to pass all kinds of // string objects into the argument list template std::string StringFormat(const char* format, Args&&... args) { return StringFormatRaw(format, unpackFormatArg(std::forward(args))...); } template void StringAppendFormat(std::string* string, const char* format, Args&&... args) { StringAppendFormatRaw(string, format, unpackFormatArg(std::forward(args))...); } } // namespace base } // namespace android