@@ -759,19 +759,21 @@ void ADIOS2File::configure_IO()
759759
760760auto ADIOS2File::detectGroupTable () -> UseGroupTable
761761{
762- auto const &attributes = availableAttributes ();
763- auto lower_bound =
764- attributes.lower_bound (adios_defaults::str_activeTablePrefix);
765- if (lower_bound != attributes.end () &&
766- auxiliary::starts_with (
767- lower_bound->first , adios_defaults::str_activeTablePrefix))
768- {
769- return UseGroupTable::Yes;
770- }
771- else
772- {
773- return UseGroupTable::No;
774- }
762+ return m_attributes.withAvailableAttributes (
763+ currentStep (), m_IO, [&](auto const &attributes) {
764+ auto lower_bound =
765+ attributes.lower_bound (adios_defaults::str_activeTablePrefix);
766+ if (lower_bound != attributes.end () &&
767+ auxiliary::starts_with (
768+ lower_bound->first , adios_defaults::str_activeTablePrefix))
769+ {
770+ return UseGroupTable::Yes;
771+ }
772+ else
773+ {
774+ return UseGroupTable::No;
775+ }
776+ });
775777}
776778
777779adios2::Engine &ADIOS2File::getEngine ()
@@ -1264,7 +1266,6 @@ AdvanceStatus ADIOS2File::advance(AdvanceMode mode)
12641266 case adios2::StepStatus::OtherError:
12651267 throw std::runtime_error (" [ADIOS2] Unexpected step status." );
12661268 }
1267- invalidateAttributesMap ();
12681269 invalidateVariablesMap ();
12691270 m_pathsMarkedAsActive.clear ();
12701271 return res;
@@ -1280,13 +1281,11 @@ void ADIOS2File::drop()
12801281 assert (m_buffer.empty ());
12811282}
12821283
1284+ template <typename AttributesMap>
12831285static std::vector<std::string> availableAttributesOrVariablesPrefixed (
1284- std::string const &prefix,
1285- ADIOS2File::AttributeMap_t const &(ADIOS2File::*getBasicMap)(),
1286- ADIOS2File &ba)
1286+ std::string const &prefix, AttributesMap const &attributes)
12871287{
12881288 std::string var = auxiliary::ends_with (prefix, ' /' ) ? prefix : prefix + ' /' ;
1289- ADIOS2File::AttributeMap_t const &attributes = (ba.*getBasicMap)();
12901289 std::vector<std::string> ret;
12911290 for (auto it = attributes.lower_bound (prefix); it != attributes.end (); ++it)
12921291 {
@@ -1305,33 +1304,17 @@ static std::vector<std::string> availableAttributesOrVariablesPrefixed(
13051304std::vector<std::string>
13061305ADIOS2File::availableAttributesPrefixed (std::string const &prefix)
13071306{
1308- return availableAttributesOrVariablesPrefixed (
1309- prefix, &ADIOS2File::availableAttributes, *this );
1307+ return m_attributes.withAvailableAttributes (
1308+ currentStep (), m_IO, [&](auto const &attributes) {
1309+ return availableAttributesOrVariablesPrefixed (prefix, attributes);
1310+ });
13101311}
13111312
13121313std::vector<std::string>
13131314ADIOS2File::availableVariablesPrefixed (std::string const &prefix)
13141315{
13151316 return availableAttributesOrVariablesPrefixed (
1316- prefix, &ADIOS2File::availableVariables, *this );
1317- }
1318-
1319- void ADIOS2File::invalidateAttributesMap ()
1320- {
1321- m_availableAttributes = std::optional<AttributeMap_t>();
1322- }
1323-
1324- ADIOS2File::AttributeMap_t const &ADIOS2File::availableAttributes ()
1325- {
1326- if (m_availableAttributes)
1327- {
1328- return m_availableAttributes.value ();
1329- }
1330- else
1331- {
1332- m_availableAttributes = std::make_optional (m_IO.AvailableAttributes ());
1333- return m_availableAttributes.value ();
1334- }
1317+ prefix, ADIOS2File::availableVariables ());
13351318}
13361319
13371320void ADIOS2File::invalidateVariablesMap ()
0 commit comments