Skip to content

Commit 93bf554

Browse files
Avoid streams in converting HRN to std::string (#1492)
To make the code faster Relates-To: OLPEDGE-2754 Signed-off-by: Rustam Gamidov <ext-rustam.gamidov@here.com>
1 parent 2091bd0 commit 93bf554

File tree

2 files changed

+87
-18
lines changed

2 files changed

+87
-18
lines changed

olp-cpp-sdk-core/src/client/HRN.cpp

Lines changed: 75 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2019-2021 HERE Europe B.V.
2+
* Copyright (C) 2019-2024 HERE Europe B.V.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@
1919

2020
#include "olp/core/client/HRN.h"
2121

22-
#include <sstream>
22+
#include <cstring>
2323

2424
#include <olp/core/logging/Log.h>
2525
#include <olp/core/porting/make_unique.h>
@@ -38,45 +38,103 @@ namespace olp {
3838
namespace client {
3939

4040
std::string HRN::ToString() const {
41-
std::ostringstream ret;
42-
const auto generic_part =
43-
kSeparator + region_ + kSeparator + account_ + kSeparator;
44-
ret << kHrnTag << partition_ << kSeparator;
41+
std::string ret;
4542

4643
switch (service_) {
4744
case ServiceType::Data: {
48-
ret << kDataTag << generic_part << catalog_id_;
45+
ret.reserve(std::strlen(kHrnTag) + std::strlen(kDataTag) +
46+
5 * sizeof(kSeparator) + partition_.size() + region_.size() +
47+
account_.size() + catalog_id_.size() + layer_id_.size());
48+
ret.append(kHrnTag)
49+
.append(partition_)
50+
.append(1, kSeparator)
51+
.append(kDataTag)
52+
.append(1, kSeparator)
53+
.append(region_)
54+
.append(1, kSeparator)
55+
.append(account_)
56+
.append(1, kSeparator)
57+
.append(catalog_id_);
4958
if (!layer_id_.empty()) {
50-
ret << kSeparator << layer_id_;
59+
ret.append(1, kSeparator).append(layer_id_);
5160
}
5261
break;
5362
}
5463
case ServiceType::Schema: {
55-
ret << kSchemaTag << generic_part << group_id_ << kSeparator
56-
<< schema_name_ << kSeparator << version_;
64+
ret.reserve(std::strlen(kHrnTag) + std::strlen(kSchemaTag) +
65+
6 * sizeof(kSeparator) + partition_.size() + region_.size() +
66+
account_.size() + group_id_.size() + schema_name_.size() +
67+
version_.size());
68+
ret.append(kHrnTag)
69+
.append(partition_)
70+
.append(1, kSeparator)
71+
.append(kSchemaTag)
72+
.append(1, kSeparator)
73+
.append(region_)
74+
.append(1, kSeparator)
75+
.append(account_)
76+
.append(1, kSeparator)
77+
.append(group_id_)
78+
.append(1, kSeparator)
79+
.append(schema_name_)
80+
.append(1, kSeparator)
81+
.append(version_);
5782
break;
5883
}
5984
case ServiceType::Pipeline: {
60-
ret << kPipelineTag << generic_part << pipeline_id_;
85+
ret.reserve(std::strlen(kHrnTag) + std::strlen(kPipelineTag) +
86+
4 * sizeof(kSeparator) + partition_.size() + region_.size() +
87+
account_.size() + pipeline_id_.size());
88+
ret.append(kHrnTag)
89+
.append(partition_)
90+
.append(1, kSeparator)
91+
.append(kPipelineTag)
92+
.append(1, kSeparator)
93+
.append(region_)
94+
.append(1, kSeparator)
95+
.append(account_)
96+
.append(1, kSeparator)
97+
.append(pipeline_id_);
6198
break;
6299
}
63100
default: {
64-
ret << generic_part;
101+
ret.reserve(std::strlen(kHrnTag) + 4 * sizeof(kSeparator) +
102+
partition_.size() + region_.size() + account_.size());
103+
ret.append(kHrnTag)
104+
.append(partition_)
105+
.append(1, kSeparator)
106+
.append(1, kSeparator)
107+
.append(region_)
108+
.append(1, kSeparator)
109+
.append(account_)
110+
.append(1, kSeparator);
65111
break;
66112
}
67113
}
68114

69-
return ret.str();
115+
return ret;
70116
}
71117

72118
std::string HRN::ToCatalogHRNString() const {
119+
std::string ret;
73120
if (service_ != ServiceType::Data) {
74121
OLP_SDK_LOG_WARNING_F(kLogTag, "ToCatalogHRNString: ServiceType != Data");
75-
return {};
122+
return ret;
76123
}
77-
78-
return kHrnTag + partition_ + kSeparator + kDataTag + kSeparator + region_ +
79-
kSeparator + account_ + kSeparator + catalog_id_;
124+
ret.reserve(std::strlen(kHrnTag) + std::strlen(kDataTag) +
125+
4 * sizeof(kSeparator) + partition_.size() + region_.size() +
126+
account_.size() + catalog_id_.size());
127+
ret.append(kHrnTag)
128+
.append(partition_)
129+
.append(1, kSeparator)
130+
.append(kDataTag)
131+
.append(1, kSeparator)
132+
.append(region_)
133+
.append(1, kSeparator)
134+
.append(account_)
135+
.append(1, kSeparator)
136+
.append(catalog_id_);
137+
return ret;
80138
}
81139

82140
HRN::HRN(const std::string& input) {

olp-cpp-sdk-core/tests/client/HRNTest.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2019-2021 HERE Europe B.V.
2+
* Copyright (C) 2019-2024 HERE Europe B.V.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -150,10 +150,21 @@ TEST(HRNTest, CompareHRNs) {
150150
TEST(HRNTest, ToString) {
151151
EXPECT_EQ(HRN("hrn:here:data:::hereos-internal-test-v2").ToString(),
152152
"hrn:here:data:::hereos-internal-test-v2");
153+
EXPECT_EQ(HRN("hrn:here:data:::hereos-internal-test-v2:rendering").ToString(),
154+
"hrn:here:data:::hereos-internal-test-v2:rendering");
153155
EXPECT_EQ(HRN("hrn:here:schema:::group_id:artifact_id:version").ToString(),
154156
"hrn:here:schema:::group_id:artifact_id:version");
155157
EXPECT_EQ(HRN("hrn:here:data:::test_pipeline").ToString(),
156158
"hrn:here:data:::test_pipeline");
159+
EXPECT_EQ(HRN("hrn:here:pipeline:US:test:test_pipeline").ToString(),
160+
"hrn:here:pipeline:US:test:test_pipeline");
161+
}
162+
163+
TEST(HRNTest, ToCatalogHRNString) {
164+
EXPECT_EQ(HRN("hrn:here:pipeline:US:test:test_pipeline").ToCatalogHRNString(),
165+
"");
166+
EXPECT_EQ(HRN("hrn:here:data:::hereos-internal-test-v2").ToCatalogHRNString(),
167+
"hrn:here:data:::hereos-internal-test-v2");
157168
}
158169

159170
TEST(HRNTest, Parsing) {

0 commit comments

Comments
 (0)