/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 |