PEL: Run a user defined function on every PEL

Add a for_each() function to the PEL repository that takes a user
defined function that will be run on every PEL, unless that function
says to stop early.

The user defined function is a std::function<bool>(const PEL&);

For example, to save up to 100 IDs in the repo into a vector:
      std::vector<uint32_t> ids;
      ForEachFunc f = [&ids](const PEL& pel) {
          ids.push_back(pel.id());
          return ids.size() == 100 ? true : false;
      };

      repo.for_each(f);

This will be used to find which PELs still need to be sent up to the
host after a reboot, among other things.

Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: Ic60525a8ab3dd593ba37e43a6cb0b3db8dda7cee
diff --git a/extensions/openpower-pels/repository.hpp b/extensions/openpower-pels/repository.hpp
index d153400..a1d4a24 100644
--- a/extensions/openpower-pels/repository.hpp
+++ b/extensions/openpower-pels/repository.hpp
@@ -148,6 +148,26 @@
      */
     std::optional<std::vector<uint8_t>> getPELData(const LogID& id);
 
+    using ForEachFunc = std::function<bool(const PEL&)>;
+
+    /**
+     * @brief Run a user defined function on every PEL in the repository.
+     *
+     * ForEachFunc takes a const PEL reference, and should return
+     * true to stop iterating and return out of for_each.
+     *
+     * For example, to save up to 100 IDs in the repo into a vector:
+     *
+     *     std::vector<uint32_t> ids;
+     *     ForEachFunc f = [&ids](const PEL& pel) {
+     *         ids.push_back(pel.id());
+     *         return ids.size() == 100 ? true : false;
+     *     };
+     *
+     * @param[in] func - The function to run.
+     */
+    void for_each(ForEachFunc func) const;
+
   private:
     /**
      * @brief Finds an entry in the _idsToPELs map.