// Copyright 2002 and onwards Google Inc.
//
// Printf variants that place their output in a C++ string.
//
// Usage:
//      string result = StringPrintf("%d %s\n", 10, "hello");
//      SStringPrintf(&result, "%d %s\n", 10, "hello");
//      StringAppendF(&result, "%d %s\n", 20, "there");

#pragma once

#include <stdarg.h>

#include <string>
using std::string;
#include <vector>
using std::vector;

#include "gutil/port.h"

// Return a C++ string
extern string StringPrintf(const char* format, ...)
        // Tell the compiler to do printf format string checking.
        PRINTF_ATTRIBUTE(1, 2);

// Store result into a supplied string and return it
extern const string& SStringPrintf(string* dst, const char* format, ...)
        // Tell the compiler to do printf format string checking.
        PRINTF_ATTRIBUTE(2, 3);

// Append result to a supplied string
extern void StringAppendF(string* dst, const char* format, ...)
        // Tell the compiler to do printf format string checking.
        PRINTF_ATTRIBUTE(2, 3);

// Lower-level routine that takes a va_list and appends to a specified
// string.  All other routines are just convenience wrappers around it.
extern void StringAppendV(string* dst, const char* format, va_list ap);

// The max arguments supported by StringPrintfVector
extern const int kStringPrintfVectorMaxArgs;

// You can use this version when all your arguments are strings, but
// you don't know how many arguments you'll have at compile time.
// StringPrintfVector will LOG(FATAL) if v.size() > kStringPrintfVectorMaxArgs
extern string StringPrintfVector(const char* format, const vector<string>& v);
