Optimize calls to std::string::find() and friends for a single char.
The character literal overload is more efficient. PiperOrigin-RevId: 348126864 Change-Id: I12485209607a957ecb17a4ba1087473bb0c4dd06
This commit is contained in:
parent
343ee97148
commit
4692525ffa
@ -81,7 +81,7 @@ void ParseGCSPath(const std::string& fname, bool object_empty_ok,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t bucket_end = fname.find("/", scheme_end + 1);
|
size_t bucket_end = fname.find('/', scheme_end + 1);
|
||||||
if (bucket_end == std::string::npos) {
|
if (bucket_end == std::string::npos) {
|
||||||
TF_SetStatus(status, TF_INVALID_ARGUMENT,
|
TF_SetStatus(status, TF_INVALID_ARGUMENT,
|
||||||
"GCS path doesn't contain a bucket name.");
|
"GCS path doesn't contain a bucket name.");
|
||||||
|
@ -38,7 +38,7 @@ void ParseHadoopPath(const std::string& fname, std::string* scheme,
|
|||||||
size_t scheme_end = fname.find("://") + 2;
|
size_t scheme_end = fname.find("://") + 2;
|
||||||
// We don't want `://` in scheme.
|
// We don't want `://` in scheme.
|
||||||
*scheme = fname.substr(0, scheme_end - 2);
|
*scheme = fname.substr(0, scheme_end - 2);
|
||||||
size_t nn_end = fname.find("/", scheme_end + 1);
|
size_t nn_end = fname.find('/', scheme_end + 1);
|
||||||
if (nn_end == std::string::npos) {
|
if (nn_end == std::string::npos) {
|
||||||
*namenode = fname.substr(scheme_end + 1);
|
*namenode = fname.substr(scheme_end + 1);
|
||||||
*path = "";
|
*path = "";
|
||||||
|
@ -60,7 +60,7 @@ string GetPath(const string& dot_h_fname) {
|
|||||||
if (result.size() > sizeof("external/") &&
|
if (result.size() > sizeof("external/") &&
|
||||||
result.compare(0, sizeof("external/") - 1, "external/") == 0) {
|
result.compare(0, sizeof("external/") - 1, "external/") == 0) {
|
||||||
result = result.substr(sizeof("external/") - 1);
|
result = result.substr(sizeof("external/") - 1);
|
||||||
pos = result.find("/");
|
pos = result.find('/');
|
||||||
if (pos != string::npos) {
|
if (pos != string::npos) {
|
||||||
result = result.substr(pos + 1);
|
result = result.substr(pos + 1);
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ class XlaEinsumOp : public XlaOpKernel {
|
|||||||
|
|
||||||
void Compile(XlaOpKernelContext* ctx) override {
|
void Compile(XlaOpKernelContext* ctx) override {
|
||||||
xla::XlaOp lhs = ctx->Input(0);
|
xla::XlaOp lhs = ctx->Input(0);
|
||||||
if (equation_.find(",") == equation_.npos) {
|
if (equation_.find(',') == equation_.npos) {
|
||||||
ctx->SetOutput(0, xla::Einsum(lhs, equation_));
|
ctx->SetOutput(0, xla::Einsum(lhs, equation_));
|
||||||
} else {
|
} else {
|
||||||
xla::XlaOp rhs = ctx->Input(1);
|
xla::XlaOp rhs = ctx->Input(1);
|
||||||
@ -68,7 +68,7 @@ class EinsumOp : public XlaOpKernel {
|
|||||||
OP_REQUIRES_OK(ctx,
|
OP_REQUIRES_OK(ctx,
|
||||||
ctx->InputList("inputs", &input_handles, &input_shapes));
|
ctx->InputList("inputs", &input_handles, &input_shapes));
|
||||||
|
|
||||||
if (equation_.find(",") == equation_.npos) {
|
if (equation_.find(',') == equation_.npos) {
|
||||||
OP_REQUIRES(
|
OP_REQUIRES(
|
||||||
ctx, input_handles.size() == 1,
|
ctx, input_handles.size() == 1,
|
||||||
errors::InvalidArgument(
|
errors::InvalidArgument(
|
||||||
|
@ -327,7 +327,7 @@ void StepStatsCollector::BuildCostModel(
|
|||||||
for (const auto& node_stats : dev_stats.hardware_stats->node_stats()) {
|
for (const auto& node_stats : dev_stats.hardware_stats->node_stats()) {
|
||||||
string node_name = node_stats.node_name();
|
string node_name = node_stats.node_name();
|
||||||
// Remove the part of op name (e.g. :Conv2D) in the end of a node name.
|
// Remove the part of op name (e.g. :Conv2D) in the end of a node name.
|
||||||
size_t pos = node_name.find_first_of(":");
|
size_t pos = node_name.find_first_of(':');
|
||||||
if (pos != std::string::npos) {
|
if (pos != std::string::npos) {
|
||||||
node_name = node_name.substr(0, pos);
|
node_name = node_name.substr(0, pos);
|
||||||
}
|
}
|
||||||
|
@ -378,9 +378,9 @@ Status DebugIO::PublishDebugMetadata(
|
|||||||
// Determine the path (if any) in the grpc:// URL, and add it as a field
|
// Determine the path (if any) in the grpc:// URL, and add it as a field
|
||||||
// of the JSON string.
|
// of the JSON string.
|
||||||
const string address = url.substr(strlen(DebugIO::kFileURLScheme));
|
const string address = url.substr(strlen(DebugIO::kFileURLScheme));
|
||||||
const string path = address.find("/") == string::npos
|
const string path = address.find('/') == string::npos
|
||||||
? ""
|
? ""
|
||||||
: address.substr(address.find("/"));
|
: address.substr(address.find('/'));
|
||||||
grpc_event.set_wall_time(event.wall_time());
|
grpc_event.set_wall_time(event.wall_time());
|
||||||
LogMessage* log_message_grpc = grpc_event.mutable_log_message();
|
LogMessage* log_message_grpc = grpc_event.mutable_log_message();
|
||||||
log_message_grpc->set_message(
|
log_message_grpc->set_message(
|
||||||
|
@ -29,7 +29,7 @@ namespace {
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
void OutputToLog(const T& proto) {
|
void OutputToLog(const T& proto) {
|
||||||
string type_name = proto.GetTypeName();
|
string type_name = proto.GetTypeName();
|
||||||
const size_t index = type_name.find_last_of(".");
|
const size_t index = type_name.find_last_of('.');
|
||||||
if (index != string::npos) type_name = type_name.substr(index + 1);
|
if (index != string::npos) type_name = type_name.substr(index + 1);
|
||||||
LOG(INFO) << LogMemory::kLogMemoryLabel << " " << type_name << " { "
|
LOG(INFO) << LogMemory::kLogMemoryLabel << " " << type_name << " { "
|
||||||
<< proto.ShortDebugString() << " }";
|
<< proto.ShortDebugString() << " }";
|
||||||
|
@ -177,7 +177,7 @@ TEST(OAuthClientTest, GetTokenFromServiceAccountJson) {
|
|||||||
BIO_free_all(bio);
|
BIO_free_all(bio);
|
||||||
|
|
||||||
// Now check the content of the header and the claim.
|
// Now check the content of the header and the claim.
|
||||||
int dot = header_dot_claim.find_last_of(".");
|
int dot = header_dot_claim.find_last_of('.');
|
||||||
string header_encoded = header_dot_claim.substr(0, dot);
|
string header_encoded = header_dot_claim.substr(0, dot);
|
||||||
string claim_encoded = header_dot_claim.substr(dot + 1);
|
string claim_encoded = header_dot_claim.substr(dot + 1);
|
||||||
|
|
||||||
|
@ -114,7 +114,7 @@ class FunctionTable {
|
|||||||
func_pb->set_id(function_table_.size());
|
func_pb->set_id(function_table_.size());
|
||||||
|
|
||||||
string file_base(io::Basename(file_path));
|
string file_base(io::Basename(file_path));
|
||||||
file_base = file_base.substr(0, file_base.find_last_of("."));
|
file_base = file_base.substr(0, file_base.find_last_of('.'));
|
||||||
func_pb->set_name(
|
func_pb->set_name(
|
||||||
string_table_->GetIndex(absl::StrCat(file_base, ":", func_name)));
|
string_table_->GetIndex(absl::StrCat(file_base, ":", func_name)));
|
||||||
func_pb->set_filename(string_table_->GetIndex(file_path));
|
func_pb->set_filename(string_table_->GetIndex(file_path));
|
||||||
|
@ -48,13 +48,13 @@ void TFScope::AddNode(TFGraphNode* node) {
|
|||||||
nodes_map_[name] = std::unique_ptr<ScopeNode>(new ScopeNode(node));
|
nodes_map_[name] = std::unique_ptr<ScopeNode>(new ScopeNode(node));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto last_slash = name.find_last_of("/");
|
auto last_slash = name.find_last_of('/');
|
||||||
while (last_slash != name.npos) {
|
while (last_slash != name.npos) {
|
||||||
name = name.substr(0, last_slash);
|
name = name.substr(0, last_slash);
|
||||||
if (nodes_map_.find(name) == nodes_map_.end()) {
|
if (nodes_map_.find(name) == nodes_map_.end()) {
|
||||||
CHECK(CreateParentNode(name));
|
CHECK(CreateParentNode(name));
|
||||||
}
|
}
|
||||||
last_slash = name.find_last_of("/");
|
last_slash = name.find_last_of('/');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,7 +65,7 @@ void TFScope::Build() {
|
|||||||
// Found roots, which are nodes without "/".
|
// Found roots, which are nodes without "/".
|
||||||
for (auto it = nodes_map_.begin(); it != nodes_map_.end(); it++) {
|
for (auto it = nodes_map_.begin(); it != nodes_map_.end(); it++) {
|
||||||
ScopeNode* node = it->second.get();
|
ScopeNode* node = it->second.get();
|
||||||
auto last_slash = node->name().find_last_of("/");
|
auto last_slash = node->name().find_last_of('/');
|
||||||
if (last_slash == string::npos) {
|
if (last_slash == string::npos) {
|
||||||
roots.push_back(node);
|
roots.push_back(node);
|
||||||
} else {
|
} else {
|
||||||
|
@ -212,7 +212,7 @@ void TFStats::AddGraph(std::unique_ptr<GraphDef> graph) {
|
|||||||
int output_idx = 0;
|
int output_idx = 0;
|
||||||
// input name format can be: "^node:src_output"
|
// input name format can be: "^node:src_output"
|
||||||
// if not :src_output, then it's the first one (further verify?)
|
// if not :src_output, then it's the first one (further verify?)
|
||||||
auto prefix_pos = node_input.find(":");
|
auto prefix_pos = node_input.find(':');
|
||||||
if (prefix_pos != node_input.npos) {
|
if (prefix_pos != node_input.npos) {
|
||||||
std::vector<string> input_parts = absl::StrSplit(node_input, ':');
|
std::vector<string> input_parts = absl::StrSplit(node_input, ':');
|
||||||
DCHECK(input_parts.size() == 2)
|
DCHECK(input_parts.size() == 2)
|
||||||
@ -287,7 +287,7 @@ void TFStats::AddRunMeta(int64 step, std::unique_ptr<RunMetadata> run_meta) {
|
|||||||
for (const NodeExecStats& node_stat : dev_stat.node_stats()) {
|
for (const NodeExecStats& node_stat : dev_stat.node_stats()) {
|
||||||
string name = node_stat.node_name();
|
string name = node_stat.node_name();
|
||||||
// Sometimes the node_name is suffixed with unnecessary information.
|
// Sometimes the node_name is suffixed with unnecessary information.
|
||||||
auto split_pos = node_stat.node_name().find(":");
|
auto split_pos = node_stat.node_name().find(':');
|
||||||
if (split_pos != node_stat.node_name().npos) {
|
if (split_pos != node_stat.node_name().npos) {
|
||||||
name = node_stat.node_name().substr(0, split_pos);
|
name = node_stat.node_name().substr(0, split_pos);
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@ namespace tensorflow {
|
|||||||
namespace tfprof {
|
namespace tfprof {
|
||||||
void completion(const char* buf, linenoiseCompletions* lc) {
|
void completion(const char* buf, linenoiseCompletions* lc) {
|
||||||
string buf_str = buf;
|
string buf_str = buf;
|
||||||
if (buf_str.find(" ") == buf_str.npos) {
|
if (buf_str.find(' ') == buf_str.npos) {
|
||||||
for (const char* opt : kCmds) {
|
for (const char* opt : kCmds) {
|
||||||
if (string(opt).find(buf_str) == 0) {
|
if (string(opt).find(buf_str) == 0) {
|
||||||
linenoiseAddCompletion(lc, opt);
|
linenoiseAddCompletion(lc, opt);
|
||||||
|
@ -43,7 +43,7 @@ tensorflow::Status ParseOutput(const string& output_opt, string* output_type,
|
|||||||
|
|
||||||
std::set<string> output_types(kOutput,
|
std::set<string> output_types(kOutput,
|
||||||
kOutput + sizeof(kOutput) / sizeof(*kOutput));
|
kOutput + sizeof(kOutput) / sizeof(*kOutput));
|
||||||
auto opt_split = output_opt.find(":");
|
auto opt_split = output_opt.find(':');
|
||||||
std::vector<string> kv_split;
|
std::vector<string> kv_split;
|
||||||
if (opt_split == output_opt.npos) {
|
if (opt_split == output_opt.npos) {
|
||||||
if (output_types.find(output_opt) == output_types.end()) {
|
if (output_types.find(output_opt) == output_types.end()) {
|
||||||
|
@ -121,7 +121,7 @@ std::string OpType(const DeviceStepStats& ds, const NodeExecStats& ns) {
|
|||||||
std::string::size_type start = label.find(sep);
|
std::string::size_type start = label.find(sep);
|
||||||
if (start == std::string::npos) return "<>";
|
if (start == std::string::npos) return "<>";
|
||||||
start += sep.size();
|
start += sep.size();
|
||||||
std::string::size_type end = label.find("(", start);
|
std::string::size_type end = label.find('(', start);
|
||||||
if (end == std::string::npos) return "<>";
|
if (end == std::string::npos) return "<>";
|
||||||
return label.substr(start, end - start);
|
return label.substr(start, end - start);
|
||||||
}
|
}
|
||||||
|
@ -346,7 +346,7 @@ std::string ProfilingInfo::GetDetailedReport() const {
|
|||||||
result += " " + dispatch.label + " - " +
|
result += " " + dispatch.label + " - " +
|
||||||
std::to_string(absl::ToDoubleMilliseconds(dispatch.duration)) +
|
std::to_string(absl::ToDoubleMilliseconds(dispatch.duration)) +
|
||||||
" ms\n";
|
" ms\n";
|
||||||
auto name = dispatch.label.substr(0, dispatch.label.find(" "));
|
auto name = dispatch.label.substr(0, dispatch.label.find(' '));
|
||||||
if (statistics.find(name) != statistics.end()) {
|
if (statistics.find(name) != statistics.end()) {
|
||||||
statistics[name].count++;
|
statistics[name].count++;
|
||||||
statistics[name].total_time +=
|
statistics[name].total_time +=
|
||||||
|
@ -255,7 +255,7 @@ tensorflow::Status ReadManifest(const string& original_file, const string& dir,
|
|||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
int added = 0;
|
int added = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
size_t end_pos = manifest.find("\n", pos);
|
size_t end_pos = manifest.find('\n', pos);
|
||||||
if (end_pos == string::npos) break;
|
if (end_pos == string::npos) break;
|
||||||
string filename = manifest.substr(pos, end_pos - pos);
|
string filename = manifest.substr(pos, end_pos - pos);
|
||||||
test_paths->push_back(dir + "/" + filename);
|
test_paths->push_back(dir + "/" + filename);
|
||||||
@ -294,13 +294,13 @@ TEST_P(OpsTest, RunZipTests) {
|
|||||||
string test_path_and_label = GetParam();
|
string test_path_and_label = GetParam();
|
||||||
string test_path = test_path_and_label;
|
string test_path = test_path_and_label;
|
||||||
string label = test_path_and_label;
|
string label = test_path_and_label;
|
||||||
size_t end_pos = test_path_and_label.find(" ");
|
size_t end_pos = test_path_and_label.find(' ');
|
||||||
if (end_pos != string::npos) {
|
if (end_pos != string::npos) {
|
||||||
test_path = test_path_and_label.substr(0, end_pos);
|
test_path = test_path_and_label.substr(0, end_pos);
|
||||||
label = test_path_and_label.substr(end_pos + 1);
|
label = test_path_and_label.substr(end_pos + 1);
|
||||||
}
|
}
|
||||||
string tflite_test_case = test_path + "_tests.txt";
|
string tflite_test_case = test_path + "_tests.txt";
|
||||||
string tflite_dir = test_path.substr(0, test_path.find_last_of("/"));
|
string tflite_dir = test_path.substr(0, test_path.find_last_of('/'));
|
||||||
string test_name = label.substr(label.find_last_of('/'));
|
string test_name = label.substr(label.find_last_of('/'));
|
||||||
|
|
||||||
std::ifstream tflite_stream(tflite_test_case);
|
std::ifstream tflite_stream(tflite_test_case);
|
||||||
|
@ -31,7 +31,7 @@ limitations under the License.
|
|||||||
#include "tensorflow/lite/testing/tflite_driver.h"
|
#include "tensorflow/lite/testing/tflite_driver.h"
|
||||||
|
|
||||||
std::string dirname(const std::string& s) {
|
std::string dirname(const std::string& s) {
|
||||||
return s.substr(0, s.find_last_of("/"));
|
return s.substr(0, s.find_last_of('/'));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Interpret(const char* examples_filename, bool use_nnapi) {
|
bool Interpret(const char* examples_filename, bool use_nnapi) {
|
||||||
|
@ -214,13 +214,13 @@ std::string SanitizeErrorMessage(const std::string& error_message) {
|
|||||||
size_t pos = error_message.find(s1);
|
size_t pos = error_message.find(s1);
|
||||||
if (pos != std::string::npos) {
|
if (pos != std::string::npos) {
|
||||||
// Find the terminate point for flex op list.
|
// Find the terminate point for flex op list.
|
||||||
auto end = error_message.find(".", pos);
|
auto end = error_message.find('.', pos);
|
||||||
pruned_message.append(error_message.substr(pos, end - pos + 1));
|
pruned_message.append(error_message.substr(pos, end - pos + 1));
|
||||||
}
|
}
|
||||||
pos = error_message.find(s2);
|
pos = error_message.find(s2);
|
||||||
if (pos != std::string::npos) {
|
if (pos != std::string::npos) {
|
||||||
// Find the terminate point for custom op list.
|
// Find the terminate point for custom op list.
|
||||||
auto end = error_message.find(".", pos);
|
auto end = error_message.find('.', pos);
|
||||||
pruned_message.append(error_message.substr(pos, end - pos + 1));
|
pruned_message.append(error_message.substr(pos, end - pos + 1));
|
||||||
}
|
}
|
||||||
return pruned_message;
|
return pruned_message;
|
||||||
|
@ -265,7 +265,7 @@ std::unique_ptr<Cluster> SvdfClusterFactory::CreateCluster(
|
|||||||
// Assuming the node name has a pattern like:
|
// Assuming the node name has a pattern like:
|
||||||
// "SOMESTRING1/CELLNAME/SEARCH_PATTERN/SOMESTRING2", we use
|
// "SOMESTRING1/CELLNAME/SEARCH_PATTERN/SOMESTRING2", we use
|
||||||
// CELLNAME as the cluster name.
|
// CELLNAME as the cluster name.
|
||||||
size_t cell_pos = node.name().rfind("/", weights_pos - 2) + 1;
|
size_t cell_pos = node.name().rfind('/', weights_pos - 2) + 1;
|
||||||
std::string cell_name =
|
std::string cell_name =
|
||||||
node.name().substr(cell_pos, weights_pos - cell_pos - 1);
|
node.name().substr(cell_pos, weights_pos - cell_pos - 1);
|
||||||
cluster = std::unique_ptr<SvdfCluster>(new SvdfCluster);
|
cluster = std::unique_ptr<SvdfCluster>(new SvdfCluster);
|
||||||
|
@ -1074,7 +1074,7 @@ void CheckEachArray(const Model& model) {
|
|||||||
// Check name. Either "name_with_suffix_8", "name_with_port:3", but not
|
// Check name. Either "name_with_suffix_8", "name_with_port:3", but not
|
||||||
// "name_with_both:3_8".
|
// "name_with_both:3_8".
|
||||||
const std::string& name = array_entry.first;
|
const std::string& name = array_entry.first;
|
||||||
auto colon_pos = name.find_first_of(":");
|
auto colon_pos = name.find_first_of(':');
|
||||||
if (colon_pos != std::string::npos) {
|
if (colon_pos != std::string::npos) {
|
||||||
CHECK_EQ(name.substr(colon_pos + 1).find_first_not_of("0123456789"),
|
CHECK_EQ(name.substr(colon_pos + 1).find_first_not_of("0123456789"),
|
||||||
std::string::npos)
|
std::string::npos)
|
||||||
|
@ -75,7 +75,7 @@ TfLiteStatus GetSortedFileNames(
|
|||||||
while ((ent = readdir(dir)) != nullptr) {
|
while ((ent = readdir(dir)) != nullptr) {
|
||||||
if (ent->d_type == DT_DIR) continue;
|
if (ent->d_type == DT_DIR) continue;
|
||||||
std::string filename(std::string(ent->d_name));
|
std::string filename(std::string(ent->d_name));
|
||||||
size_t lastdot = filename.find_last_of(".");
|
size_t lastdot = filename.find_last_of('.');
|
||||||
std::string ext = lastdot != std::string::npos ? filename.substr(lastdot)
|
std::string ext = lastdot != std::string::npos ? filename.substr(lastdot)
|
||||||
: std::string();
|
: std::string();
|
||||||
std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);
|
std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);
|
||||||
|
@ -239,7 +239,7 @@ PYBIND11_MODULE(_pywrap_file_io, m) {
|
|||||||
py::gil_scoped_release release;
|
py::gil_scoped_release release;
|
||||||
auto* env = tensorflow::Env::Default();
|
auto* env = tensorflow::Env::Default();
|
||||||
std::unique_ptr<WritableFile> self;
|
std::unique_ptr<WritableFile> self;
|
||||||
const auto status = mode.find("a") == std::string::npos
|
const auto status = mode.find('a') == std::string::npos
|
||||||
? env->NewWritableFile(filename, &self)
|
? env->NewWritableFile(filename, &self)
|
||||||
: env->NewAppendableFile(filename, &self);
|
: env->NewAppendableFile(filename, &self);
|
||||||
py::gil_scoped_acquire acquire;
|
py::gil_scoped_acquire acquire;
|
||||||
|
@ -295,7 +295,7 @@ port::StatusOr<DriverVersion> Diagnostician::FindKernelModuleVersion(
|
|||||||
|
|
||||||
std::string version_and_rest = driver_version_file_contents.substr(
|
std::string version_and_rest = driver_version_file_contents.substr(
|
||||||
offset + strlen(kDriverFilePrelude), std::string::npos);
|
offset + strlen(kDriverFilePrelude), std::string::npos);
|
||||||
size_t space_index = version_and_rest.find(" ");
|
size_t space_index = version_and_rest.find(' ');
|
||||||
auto kernel_version = version_and_rest.substr(0, space_index);
|
auto kernel_version = version_and_rest.substr(0, space_index);
|
||||||
// TODO(b/22689637): Eliminate the explicit namespace if possible.
|
// TODO(b/22689637): Eliminate the explicit namespace if possible.
|
||||||
auto stripped_kernel_version = absl::StripSuffix(kernel_version, ".ld64");
|
auto stripped_kernel_version = absl::StripSuffix(kernel_version, ".ld64");
|
||||||
|
@ -105,7 +105,7 @@ int MainImpl(int argc, char** argv) {
|
|||||||
const tensorflow::protobuf::FileDescriptor* fd =
|
const tensorflow::protobuf::FileDescriptor* fd =
|
||||||
importer.Import(proto_path);
|
importer.Import(proto_path);
|
||||||
|
|
||||||
const int index = proto_path.find_last_of(".");
|
const int index = proto_path.find_last_of('.');
|
||||||
string proto_path_no_suffix = proto_path.substr(0, index);
|
string proto_path_no_suffix = proto_path.substr(0, index);
|
||||||
|
|
||||||
proto_path_no_suffix =
|
proto_path_no_suffix =
|
||||||
|
Loading…
Reference in New Issue
Block a user