//===- FormatVariadicBM.cpp - formatv() benchmark ---------- --------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "benchmark/benchmark.h"
#include "llvm/Support/FormatVariadic.h"
#include <algorithm>
#include <string>

using namespace llvm;
using namespace std;

// Generate a list of format strings that have `NumReplacements` replacements
// by permuting the replacements and some literal text.
static vector<string> getFormatStrings(int NumReplacements) {
  vector<string> Components;
  for (int I = 0; I < NumReplacements; I++)
    Components.push_back("{" + to_string(I) + "}");
  // Intersperse these with some other literal text (_).
  const string_view Literal = "____";
  for (char C : Literal)
    Components.push_back(string(1, C));

  vector<string> Formats;
  do {
    string Concat;
    for (const string &C : Components)
      Concat += C;
    Formats.emplace_back(Concat);
  } while (next_permutation(Components.begin(), Components.end()));
  return Formats;
}

// Generate the set of formats to exercise outside the benchmark code.
static const vector<vector<string>> Formats = {
    getFormatStrings(1), getFormatStrings(2), getFormatStrings(3),
    getFormatStrings(4), getFormatStrings(5),
};

// Benchmark formatv() for a variety of format strings and 1-5 replacements.
static void BM_FormatVariadic(benchmark::State &state) {
  for (auto _ : state) {
    for (const string &Fmt : Formats[0])
      formatv(Fmt.c_str(), 1).str();
    for (const string &Fmt : Formats[1])
      formatv(Fmt.c_str(), 1, 2).str();
    for (const string &Fmt : Formats[2])
      formatv(Fmt.c_str(), 1, 2, 3).str();
    for (const string &Fmt : Formats[3])
      formatv(Fmt.c_str(), 1, 2, 3, 4).str();
    for (const string &Fmt : Formats[4])
      formatv(Fmt.c_str(), 1, 2, 3, 4, 5).str();
  }
}

BENCHMARK(BM_FormatVariadic);

BENCHMARK_MAIN();
