@@ -29,6 +29,13 @@ using namespace mrpt::poses;
2929using namespace mrpt ::math;
3030using 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 ============
3340MAP_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