Coverage Report

Created: 2025-07-12 06:42

/src/sentencepiece/third_party/absl/flags/flag.cc
Line
Count
Source (jump to first uncovered line)
1
// Copyright 2016 Google Inc.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//     http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.!
14
15
#include "third_party/absl/flags/flag.h"
16
17
#include <algorithm>
18
#include <iostream>
19
#include <map>
20
#include <sstream>
21
#include <string>
22
23
#include "config.h"
24
#include "src/common.h"
25
#include "src/util.h"
26
27
ABSL_FLAG(bool, help, false, "show help");
28
ABSL_FLAG(bool, version, false, "show version");
29
ABSL_FLAG(int, minloglevel, 0,
30
          "Messages logged at a lower level than this don't actually get "
31
          "logged anywhere");
32
33
namespace absl {
34
namespace internal {
35
namespace {
36
template <typename T>
37
2
std::string to_str(const T &value) {
38
2
  std::ostringstream os;
39
2
  os << value;
40
2
  return os.str();
41
2
}
flag.cc:std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > absl::internal::(anonymous namespace)::to_str<int>(int const&)
Line
Count
Source
37
2
std::string to_str(const T &value) {
38
2
  std::ostringstream os;
39
2
  os << value;
40
2
  return os.str();
41
2
}
Unexecuted instantiation: flag.cc:std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > absl::internal::(anonymous namespace)::to_str<unsigned int>(unsigned int const&)
Unexecuted instantiation: flag.cc:std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > absl::internal::(anonymous namespace)::to_str<double>(double const&)
Unexecuted instantiation: flag.cc:std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > absl::internal::(anonymous namespace)::to_str<float>(float const&)
Unexecuted instantiation: flag.cc:std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > absl::internal::(anonymous namespace)::to_str<long>(long const&)
Unexecuted instantiation: flag.cc:std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > absl::internal::(anonymous namespace)::to_str<unsigned long>(unsigned long const&)
42
43
template <>
44
4
std::string to_str<bool>(const bool &value) {
45
4
  return value ? "true" : "false";
46
4
}
47
48
template <>
49
0
std::string to_str<std::string>(const std::string &value) {
50
0
  return std::string("\"") + value + std::string("\"");
51
0
}
52
}  // namespace
53
54
struct FlagFunc {
55
  const char *name;
56
  const char *help;
57
  const char *type;
58
  std::string default_value;
59
  std::function<void(const std::string &)> set_value;
60
};
61
62
namespace {
63
64
using FlagMap = std::map<std::string, std::shared_ptr<FlagFunc>>;
65
using FlagList = std::vector<std::shared_ptr<FlagFunc>>;
66
67
6
FlagMap *GetFlagMap() {
68
6
  static auto *flag_map = new FlagMap;
69
6
  return flag_map;
70
6
}
71
72
6
FlagList *GetFlagList() {
73
6
  static auto *flag_list = new FlagList;
74
6
  return flag_list;
75
6
}
76
77
bool CommandLineGetFlag(int argc, char **argv, std::string *key,
78
0
                        std::string *value, int *used_args) {
79
0
  key->clear();
80
0
  value->clear();
81
82
0
  *used_args = 1;
83
0
  const char *start = argv[0];
84
0
  if (start[0] != '-') return false;
85
86
0
  ++start;
87
0
  if (start[0] == '-') ++start;
88
0
  const std::string arg = start;
89
0
  const size_t n = arg.find("=");
90
0
  if (n != std::string::npos) {
91
0
    *key = arg.substr(0, n);
92
0
    *value = arg.substr(n + 1, arg.size() - n);
93
0
    return true;
94
0
  }
95
96
0
  key->assign(arg);
97
0
  value->clear();
98
99
0
  if (argc == 1) return true;
100
101
0
  start = argv[1];
102
0
  if (start[0] == '-') return true;
103
104
0
  *used_args = 2;
105
0
  value->assign(start);
106
0
  return true;
107
0
}
108
109
0
std::string PrintHelp(const char *programname) {
110
0
  std::ostringstream os;
111
0
  os << PACKAGE_STRING << "\n\n";
112
0
  os << "Usage: " << programname << " [options] files\n\n";
113
114
0
  for (auto func : *GetFlagList()) {
115
0
    os << "   --" << func->name << " (" << func->help << ")";
116
0
    os << "  type: " << func->type << " default: " << func->default_value
117
0
       << '\n';
118
0
  }
119
120
0
  os << "\n\n";
121
122
0
  return os.str();
123
0
}
124
}  // namespace
125
126
6
void RegisterFlag(const std::string &name, std::shared_ptr<FlagFunc> func) {
127
6
  GetFlagList()->emplace_back(func);
128
6
  GetFlagMap()->emplace(name, func);
129
6
}
130
}  // namespace internal
131
132
template <typename T>
133
Flag<T>::Flag(const char *name, const char *type, const char *help,
134
              const T &default_value)
135
6
    : value_(default_value), func_(new internal::FlagFunc) {
136
6
  func_->name = name;
137
6
  func_->help = help;
138
6
  func_->type = type;
139
6
  func_->default_value = internal::to_str<T>(default_value);
140
6
  func_->set_value = [this](const std::string &value) {
141
0
    this->set_value_as_str(value);
142
0
  };
Unexecuted instantiation: absl::Flag<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::Flag(char const*, char const*, char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const
Unexecuted instantiation: absl::Flag<int>::Flag(char const*, char const*, char const*, int const&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const
Unexecuted instantiation: absl::Flag<unsigned int>::Flag(char const*, char const*, char const*, unsigned int const&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const
Unexecuted instantiation: absl::Flag<double>::Flag(char const*, char const*, char const*, double const&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const
Unexecuted instantiation: absl::Flag<float>::Flag(char const*, char const*, char const*, float const&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const
Unexecuted instantiation: absl::Flag<bool>::Flag(char const*, char const*, char const*, bool const&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const
Unexecuted instantiation: absl::Flag<long>::Flag(char const*, char const*, char const*, long const&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const
Unexecuted instantiation: absl::Flag<unsigned long>::Flag(char const*, char const*, char const*, unsigned long const&)::{lambda(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)#1}::operator()(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const
143
6
  RegisterFlag(name, func_);
144
6
}
absl::Flag<int>::Flag(char const*, char const*, char const*, int const&)
Line
Count
Source
135
2
    : value_(default_value), func_(new internal::FlagFunc) {
136
2
  func_->name = name;
137
2
  func_->help = help;
138
2
  func_->type = type;
139
2
  func_->default_value = internal::to_str<T>(default_value);
140
2
  func_->set_value = [this](const std::string &value) {
141
2
    this->set_value_as_str(value);
142
2
  };
143
2
  RegisterFlag(name, func_);
144
2
}
Unexecuted instantiation: absl::Flag<unsigned int>::Flag(char const*, char const*, char const*, unsigned int const&)
Unexecuted instantiation: absl::Flag<double>::Flag(char const*, char const*, char const*, double const&)
Unexecuted instantiation: absl::Flag<float>::Flag(char const*, char const*, char const*, float const&)
absl::Flag<bool>::Flag(char const*, char const*, char const*, bool const&)
Line
Count
Source
135
4
    : value_(default_value), func_(new internal::FlagFunc) {
136
4
  func_->name = name;
137
4
  func_->help = help;
138
4
  func_->type = type;
139
4
  func_->default_value = internal::to_str<T>(default_value);
140
4
  func_->set_value = [this](const std::string &value) {
141
4
    this->set_value_as_str(value);
142
4
  };
143
4
  RegisterFlag(name, func_);
144
4
}
Unexecuted instantiation: absl::Flag<long>::Flag(char const*, char const*, char const*, long const&)
Unexecuted instantiation: absl::Flag<unsigned long>::Flag(char const*, char const*, char const*, unsigned long const&)
145
146
template <typename T>
147
0
Flag<T>::~Flag() {}
Unexecuted instantiation: absl::Flag<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::~Flag()
Unexecuted instantiation: absl::Flag<int>::~Flag()
Unexecuted instantiation: absl::Flag<unsigned int>::~Flag()
Unexecuted instantiation: absl::Flag<double>::~Flag()
Unexecuted instantiation: absl::Flag<float>::~Flag()
Unexecuted instantiation: absl::Flag<bool>::~Flag()
Unexecuted instantiation: absl::Flag<long>::~Flag()
Unexecuted instantiation: absl::Flag<unsigned long>::~Flag()
148
149
template <typename T>
150
0
const T &Flag<T>::value() const {
151
0
  return value_;
152
0
}
Unexecuted instantiation: absl::Flag<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::value() const
Unexecuted instantiation: absl::Flag<int>::value() const
Unexecuted instantiation: absl::Flag<unsigned int>::value() const
Unexecuted instantiation: absl::Flag<double>::value() const
Unexecuted instantiation: absl::Flag<float>::value() const
Unexecuted instantiation: absl::Flag<bool>::value() const
Unexecuted instantiation: absl::Flag<long>::value() const
Unexecuted instantiation: absl::Flag<unsigned long>::value() const
153
154
template <typename T>
155
0
void Flag<T>::set_value(const T &value) {
156
0
  value_ = value;
157
0
}
Unexecuted instantiation: absl::Flag<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::set_value(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Unexecuted instantiation: absl::Flag<int>::set_value(int const&)
Unexecuted instantiation: absl::Flag<unsigned int>::set_value(unsigned int const&)
Unexecuted instantiation: absl::Flag<double>::set_value(double const&)
Unexecuted instantiation: absl::Flag<float>::set_value(float const&)
Unexecuted instantiation: absl::Flag<bool>::set_value(bool const&)
Unexecuted instantiation: absl::Flag<long>::set_value(long const&)
Unexecuted instantiation: absl::Flag<unsigned long>::set_value(unsigned long const&)
158
159
template <typename T>
160
0
void Flag<T>::set_value_as_str(const std::string &value_as_str) {
161
0
  sentencepiece::string_util::lexical_cast<T>(value_as_str, &value_);
162
0
}
Unexecuted instantiation: absl::Flag<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::set_value_as_str(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Unexecuted instantiation: absl::Flag<int>::set_value_as_str(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Unexecuted instantiation: absl::Flag<unsigned int>::set_value_as_str(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Unexecuted instantiation: absl::Flag<double>::set_value_as_str(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Unexecuted instantiation: absl::Flag<float>::set_value_as_str(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Unexecuted instantiation: absl::Flag<long>::set_value_as_str(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Unexecuted instantiation: absl::Flag<unsigned long>::set_value_as_str(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
163
164
template <>
165
0
void Flag<bool>::set_value_as_str(const std::string &value_as_str) {
166
0
  if (value_as_str.empty())
167
0
    value_ = true;
168
0
  else
169
0
    sentencepiece::string_util::lexical_cast<bool>(value_as_str, &value_);
170
0
}
171
172
template class Flag<std::string>;
173
template class Flag<int32>;
174
template class Flag<uint32>;
175
template class Flag<double>;
176
template class Flag<float>;
177
template class Flag<bool>;
178
template class Flag<int64>;
179
template class Flag<uint64>;
180
181
0
std::vector<char *> ParseCommandLine(int argc, char *argv[]) {
182
0
  if (argc == 0) return {};
183
184
0
  int used_argc = 0;
185
0
  std::string key, value;
186
0
  std::vector<char *> output_args;
187
0
  output_args.reserve(argc);
188
0
  output_args.push_back(argv[0]);
189
190
0
  auto set_flag = [](const std::string &name, const std::string &value) {
191
0
    const auto *flag_map = internal::GetFlagMap();
192
0
    auto it = flag_map->find(name);
193
0
    if (it == flag_map->end()) return false;
194
0
    it->second->set_value(value);
195
0
    return true;
196
0
  };
197
198
0
  for (int i = 1; i < argc; i += used_argc) {
199
0
    if (!internal::CommandLineGetFlag(argc - i, argv + i, &key, &value,
200
0
                                      &used_argc)) {
201
0
      output_args.push_back(argv[i]);
202
0
      continue;
203
0
    }
204
205
0
    if (!set_flag(key, value)) {
206
0
      std::cerr << "Unknown/Invalid flag " << key << "\n\n"
207
0
                << internal::PrintHelp(argv[0]);
208
0
      sentencepiece::error::Exit(1);
209
0
    }
210
0
  }
211
212
0
  if (absl::GetFlag(FLAGS_help)) {
213
0
    std::cout << internal::PrintHelp(argv[0]);
214
0
    sentencepiece::error::Exit(1);
215
0
  } else if (absl::GetFlag(FLAGS_version)) {
216
0
    std::cout << PACKAGE_STRING << " " << VERSION << std::endl;
217
0
    sentencepiece::error::Exit(0);
218
0
  }
219
220
0
  return output_args;
221
0
}
222
223
0
void CleanupFlags() {
224
0
  static bool is_shutdown = false;
225
0
  if (!is_shutdown) {
226
0
    delete internal::GetFlagList();
227
0
    delete internal::GetFlagMap();
228
0
    is_shutdown = true;
229
0
  }
230
0
}
231
232
}  // namespace absl