File indexing completed on 2024-04-06 12:12:57
0001 #include "FWCore/ParameterSet/interface/ParameterSetEntry.h"
0002 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0003 #include "FWCore/Utilities/interface/EDMException.h"
0004 #include "FWCore/Utilities/interface/Digest.h"
0005
0006 #include <cassert>
0007 #include <sstream>
0008 #include <iostream>
0009 namespace edm {
0010
0011 ParameterSetEntry::ParameterSetEntry() : isTracked_(false), thePSet_(nullptr), theID_() {}
0012
0013 ParameterSetEntry::ParameterSetEntry(ParameterSet const& pset, bool isTracked)
0014 : isTracked_(isTracked), thePSet_(new ParameterSet(pset)), theID_() {
0015 if (pset.isRegistered()) {
0016 theID_ = pset.id();
0017 }
0018 }
0019
0020 ParameterSetEntry::ParameterSetEntry(ParameterSetID const& id, bool isTracked)
0021 : isTracked_(isTracked), thePSet_(), theID_(id) {}
0022
0023 ParameterSetEntry::ParameterSetEntry(std::string_view rep) : isTracked_(rep[0] == '+'), thePSet_(), theID_() {
0024 assert(rep[0] == '+' || rep[0] == '-');
0025 assert(rep[2] == '(');
0026 assert(rep[rep.size() - 1] == ')');
0027 ParameterSetID newID(std::string(rep.begin() + 3, rep.end() - 1));
0028 theID_.swap(newID);
0029 }
0030
0031 void ParameterSetEntry::toString(std::string& result) const {
0032 result += isTracked() ? "+Q(" : "-Q(";
0033 if (!theID_.isValid()) {
0034 throw edm::Exception(edm::errors::LogicError) << "ParameterSet::toString() called prematurely\n"
0035 << "before ParameterSet::registerIt() has been called\n"
0036 << "for all nested parameter sets\n";
0037 }
0038 theID_.toString(result);
0039 result += ')';
0040 }
0041
0042 void ParameterSetEntry::toDigest(cms::Digest& digest) const {
0043 digest.append(isTracked() ? "+Q(" : "-Q(", 3);
0044 if (!theID_.isValid()) {
0045 throw edm::Exception(edm::errors::LogicError) << "ParameterSet::toString() called prematurely\n"
0046 << "before ParameterSet::registerIt() has been called\n"
0047 << "for all nested parameter sets\n";
0048 }
0049 theID_.toDigest(digest);
0050 digest.append(")", 1);
0051 }
0052
0053 std::string ParameterSetEntry::toString() const {
0054 std::string result;
0055 toString(result);
0056 return result;
0057 }
0058
0059 ParameterSet const& ParameterSetEntry::pset() const {
0060 fillPSet();
0061 return *thePSet_;
0062 }
0063
0064 ParameterSet& ParameterSetEntry::psetForUpdate() {
0065 fillPSet();
0066 return *thePSet_;
0067 }
0068
0069 void ParameterSetEntry::fillPSet() const {
0070 if (nullptr == thePSet_.load()) {
0071 auto tmp = std::make_unique<ParameterSet>(getParameterSet(theID_));
0072 ParameterSet* expected = nullptr;
0073 if (thePSet_.compare_exchange_strong(expected, tmp.get())) {
0074
0075 tmp.release();
0076 }
0077 }
0078 }
0079
0080 void ParameterSetEntry::updateID() {
0081 assert(pset().isRegistered());
0082 theID_ = pset().id();
0083 }
0084
0085 std::string ParameterSetEntry::dump(unsigned int indent) const {
0086 std::ostringstream os;
0087 const char* trackiness = (isTracked() ? "tracked" : "untracked");
0088 os << "PSet " << trackiness << " = (" << pset().dump(indent) << ")";
0089 return os.str();
0090 }
0091
0092 std::ostream& operator<<(std::ostream& os, ParameterSetEntry const& psetEntry) {
0093 os << psetEntry.dump();
0094 return os;
0095 }
0096 }