1a8c51b3fSopenharmony_ci// Copyright 2015 Google Inc. All rights reserved.
2a8c51b3fSopenharmony_ci//
3a8c51b3fSopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
4a8c51b3fSopenharmony_ci// you may not use this file except in compliance with the License.
5a8c51b3fSopenharmony_ci// You may obtain a copy of the License at
6a8c51b3fSopenharmony_ci//
7a8c51b3fSopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
8a8c51b3fSopenharmony_ci//
9a8c51b3fSopenharmony_ci// Unless required by applicable law or agreed to in writing, software
10a8c51b3fSopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
11a8c51b3fSopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12a8c51b3fSopenharmony_ci// See the License for the specific language governing permissions and
13a8c51b3fSopenharmony_ci// limitations under the License.
14a8c51b3fSopenharmony_ci
15a8c51b3fSopenharmony_ci#include <benchmark/benchmark.h>
16a8c51b3fSopenharmony_ci
17a8c51b3fSopenharmony_cinamespace benchmark {
18a8c51b3fSopenharmony_ci
19a8c51b3fSopenharmony_cinamespace {
20a8c51b3fSopenharmony_ci
21a8c51b3fSopenharmony_ci// Compute the total size of a pack of std::strings
22a8c51b3fSopenharmony_cisize_t size_impl() { return 0; }
23a8c51b3fSopenharmony_ci
24a8c51b3fSopenharmony_citemplate <typename Head, typename... Tail>
25a8c51b3fSopenharmony_cisize_t size_impl(const Head& head, const Tail&... tail) {
26a8c51b3fSopenharmony_ci  return head.size() + size_impl(tail...);
27a8c51b3fSopenharmony_ci}
28a8c51b3fSopenharmony_ci
29a8c51b3fSopenharmony_ci// Join a pack of std::strings using a delimiter
30a8c51b3fSopenharmony_ci// TODO: use absl::StrJoin
31a8c51b3fSopenharmony_civoid join_impl(std::string&, char) {}
32a8c51b3fSopenharmony_ci
33a8c51b3fSopenharmony_citemplate <typename Head, typename... Tail>
34a8c51b3fSopenharmony_civoid join_impl(std::string& s, const char delimiter, const Head& head,
35a8c51b3fSopenharmony_ci               const Tail&... tail) {
36a8c51b3fSopenharmony_ci  if (!s.empty() && !head.empty()) {
37a8c51b3fSopenharmony_ci    s += delimiter;
38a8c51b3fSopenharmony_ci  }
39a8c51b3fSopenharmony_ci
40a8c51b3fSopenharmony_ci  s += head;
41a8c51b3fSopenharmony_ci
42a8c51b3fSopenharmony_ci  join_impl(s, delimiter, tail...);
43a8c51b3fSopenharmony_ci}
44a8c51b3fSopenharmony_ci
45a8c51b3fSopenharmony_citemplate <typename... Ts>
46a8c51b3fSopenharmony_cistd::string join(char delimiter, const Ts&... ts) {
47a8c51b3fSopenharmony_ci  std::string s;
48a8c51b3fSopenharmony_ci  s.reserve(sizeof...(Ts) + size_impl(ts...));
49a8c51b3fSopenharmony_ci  join_impl(s, delimiter, ts...);
50a8c51b3fSopenharmony_ci  return s;
51a8c51b3fSopenharmony_ci}
52a8c51b3fSopenharmony_ci}  // namespace
53a8c51b3fSopenharmony_ci
54a8c51b3fSopenharmony_ciBENCHMARK_EXPORT
55a8c51b3fSopenharmony_cistd::string BenchmarkName::str() const {
56a8c51b3fSopenharmony_ci  return join('/', function_name, args, min_time, min_warmup_time, iterations,
57a8c51b3fSopenharmony_ci              repetitions, time_type, threads);
58a8c51b3fSopenharmony_ci}
59a8c51b3fSopenharmony_ci}  // namespace benchmark
60