You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.9 KiB
84 lines
2.9 KiB
// 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 <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
|