blob: 9b68c243147e363c31f19ccd6138ffa447ad4540 [file] [log] [blame]
// 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 <string>
#include <type_traits>
#include <utility>
#include <stdarg.h>
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 <class T>
constexpr T&& unpackFormatArg(T&& t,
typename std::enable_if<
std::is_pod<typename std::decay<T>::type>::value
>::type* = nullptr) {
return std::forward<T>(t);
}
// These templated versions of StringFormat*() allow one to pass all kinds of
// string objects into the argument list
template <class... Args>
std::string StringFormat(const char* format, Args&&... args) {
return StringFormatRaw(format, unpackFormatArg(std::forward<Args>(args))...);
}
template <class... Args>
void StringAppendFormat(std::string* string,
const char* format,
Args&&... args) {
StringAppendFormatRaw(string, format,
unpackFormatArg(std::forward<Args>(args))...);
}
} // namespace base
} // namespace android