sim: Add a checkpoint function to test for entries
authorAndreas Sandberg <andreas.sandberg@arm.com>
Tue, 4 Oct 2016 10:22:16 +0000 (11:22 +0100)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Tue, 4 Oct 2016 10:22:16 +0000 (11:22 +0100)
When loading a checkpoint, it's sometimes desirable to be able to test
whether an entry within a secion exists. This is currently done
automatically in the UNSERIALIZE_OPT_SCALAR macro, but it isn't
possible to do for arrays, containers, or enums. Instead of adding
even more macros, add a helper function (CheckpointIn::entryExists())
that tests for the presence of an entry.

Change-Id: I4b4646b03276b889fd3916efefff3bd552317dbc
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
src/base/inifile.cc
src/base/inifile.hh
src/sim/serialize.cc
src/sim/serialize.hh

index 402c6469ff817abef8555430350014329b05847a..80ed3eb060c0b3113f670c94b50def9844f4abe9 100644 (file)
@@ -229,6 +229,17 @@ IniFile::find(const string &sectionName, const string &entryName,
     return true;
 }
 
+bool
+IniFile::entryExists(const string &sectionName, const string &entryName) const
+{
+    Section *section = findSection(sectionName);
+
+    if (!section)
+        return false;
+    else
+        return section->findEntry(entryName);
+}
+
 bool
 IniFile::sectionExists(const string &sectionName) const
 {
index b4892d60a923ea48f2378d387a048d3a7b211720..447ec7c0fd1f56540b019f16d37a8deab7ec3173 100644 (file)
@@ -184,6 +184,12 @@ class IniFile
     bool find(const std::string &section, const std::string &entry,
               std::string &value) const;
 
+    /// Determine whether the entry exists within named section exists
+    /// in the .ini file.
+    /// @return True if the section exists.
+    bool entryExists(const std::string &section,
+                     const std::string &entry) const;
+
     /// Determine whether the named section exists in the .ini file.
     /// Note that the 'Section' class is (intentionally) not public,
     /// so all clients can do is get a bool that says whether there
index e55107b793ccd6c79e0191877bb0834bb459000f..d2e699c28ca27d00a24a6edc1114457d1e2d3e8d 100644 (file)
@@ -692,6 +692,12 @@ CheckpointIn::~CheckpointIn()
     delete db;
 }
 
+bool
+CheckpointIn::entryExists(const string &section, const string &entry)
+{
+    return db->entryExists(section, entry);
+}
+
 bool
 CheckpointIn::find(const string &section, const string &entry, string &value)
 {
index 2f0340e4bdca6d06d1385a506be2a0ec5a2b38a3..4c5e9d79c92441763d154c9fe5d97a0e0ebcfd65 100644 (file)
@@ -359,6 +359,8 @@ class CheckpointIn
     bool findObj(const std::string &section, const std::string &entry,
                  SimObject *&value);
 
+
+    bool entryExists(const std::string &section, const std::string &entry);
     bool sectionExists(const std::string &section);
 
     // The following static functions have to do with checkpoint