Skip to content

Commit 5f04628

Browse files
committed
FIX: permanent string_view cache
1 parent ee54d89 commit 5f04628

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

libs/maps/src/maps/CGenericPointsMap.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ using namespace mrpt::poses;
2929
using namespace mrpt::math;
3030
using namespace mrpt::config;
3131

32+
namespace
33+
{
34+
/// using string_view requires using a permanent storage somewhere in a place that outlives all
35+
/// possible accesses.
36+
thread_local std::set<std::string> fieldNamesCache;
37+
} // namespace
38+
3239
// =========== Begin of Map definition ============
3340
MAP_DEFINITION_REGISTER("mrpt::maps::CGenericPointsMap", mrpt::maps::CGenericPointsMap)
3441

@@ -164,6 +171,7 @@ void CGenericPointsMap::serializeFrom(mrpt::serialization::CArchive& in, uint8_t
164171
{
165172
std::string name;
166173
in >> name;
174+
this->registerField_float(name);
167175
in >> m_float_fields[name];
168176
}
169177
}
@@ -174,6 +182,7 @@ void CGenericPointsMap::serializeFrom(mrpt::serialization::CArchive& in, uint8_t
174182
{
175183
std::string name;
176184
in >> name;
185+
this->registerField_uint16(name);
177186
in >> m_uint16_fields[name];
178187
}
179188
}
@@ -204,7 +213,8 @@ bool CGenericPointsMap::registerField_float(const std::string_view& fieldName)
204213
THROW_EXCEPTION_FMT(
205214
"Field '%.*s' already exists.", static_cast<int>(fieldName.size()), fieldName.data());
206215
}
207-
m_float_fields[fieldName].resize(size(), 0);
216+
const auto [itPermanentFieldName, _] = fieldNamesCache.insert(std::string(fieldName));
217+
m_float_fields[*itPermanentFieldName].resize(size(), 0);
208218
return true;
209219
}
210220

@@ -215,7 +225,8 @@ bool CGenericPointsMap::registerField_uint16(const std::string_view& fieldName)
215225
THROW_EXCEPTION_FMT(
216226
"Field '%.*s' already exists.", static_cast<int>(fieldName.size()), fieldName.data());
217227
}
218-
m_uint16_fields[fieldName].resize(size(), 0);
228+
const auto [itPermanentFieldName, _] = fieldNamesCache.insert(std::string(fieldName));
229+
m_uint16_fields[*itPermanentFieldName].resize(size(), 0);
219230
return true;
220231
}
221232

0 commit comments

Comments
 (0)