Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
#include "DataFormats/Provenance/interface/Parentage.h"
#include "FWCore/Utilities/interface/Digest.h"
#include <charconv>
#include <sstream>
//#include <cassert>

/*----------------------------------------------------------------------

----------------------------------------------------------------------*/

namespace edm {
  Parentage::Parentage() : parents_() {}

  Parentage::Parentage(std::vector<BranchID> const& parents) : parents_(parents) {}

  Parentage::Parentage(std::vector<BranchID>&& parents) : parents_(std::move(parents)) {}

  ParentageID Parentage::id() const {
    //10 is the maximum number of digits for a 2^32 number
    std::array<char, 10 + 1> buf;
    cms::Digest md5alg;
    for (auto const& parent : parents_) {
      //assert(start < end);
      auto res = std::to_chars(buf.data(), buf.data() + buf.size(), parent.id());
      //assert(res.ec == std::errc());
      *res.ptr = ' ';
      md5alg.append(buf.data(), res.ptr - buf.data() + 1);
    }
    ParentageID id(md5alg.digest().bytes);
    return id;
  }

  void Parentage::write(std::ostream&) const {
    // This is grossly inadequate, but it is not critical for the
    // first pass.
  }

  bool operator==(Parentage const& a, Parentage const& b) { return a.parents() == b.parents(); }
}  // namespace edm