Go to the documentation of this file.00001 #include "FWCore/ParameterSet/interface/ParameterSetEntry.h"
00002 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00003 #include "FWCore/Utilities/interface/EDMException.h"
00004 #include "FWCore/Utilities/interface/Digest.h"
00005
00006 #include <cassert>
00007 #include <sstream>
00008 #include <iostream>
00009 namespace edm {
00010
00011 ParameterSetEntry::ParameterSetEntry()
00012 : isTracked_(false),
00013 thePSet_(0),
00014 theID_()
00015 {
00016 }
00017
00018 ParameterSetEntry::ParameterSetEntry(ParameterSet const& pset, bool isTracked)
00019 : isTracked_(isTracked),
00020 thePSet_(new ParameterSet(pset)),
00021 theID_()
00022 {
00023 if (pset.isRegistered()) {
00024 theID_ = pset.id();
00025 }
00026 }
00027
00028 ParameterSetEntry::ParameterSetEntry(ParameterSetID const& id, bool isTracked)
00029 : isTracked_(isTracked),
00030 thePSet_(),
00031 theID_(id)
00032 {
00033 }
00034
00035 ParameterSetEntry::ParameterSetEntry(std::string const& rep)
00036 : isTracked_(rep[0] == '+'),
00037 thePSet_(),
00038 theID_()
00039 {
00040 assert(rep[0] == '+' || rep[0] == '-');
00041 assert(rep[2] == '(');
00042 assert(rep[rep.size()-1] == ')');
00043 ParameterSetID newID(std::string(rep.begin()+3, rep.end()-1) );
00044 theID_.swap(newID);
00045 }
00046
00047 ParameterSetEntry::~ParameterSetEntry() {}
00048
00049 void
00050 ParameterSetEntry::toString(std::string& result) const {
00051 result += isTracked() ? "+Q(" : "-Q(";
00052 if (!theID_.isValid()) {
00053 throw edm::Exception(edm::errors::LogicError)
00054 << "ParameterSet::toString() called prematurely\n"
00055 << "before ParameterSet::registerIt() has been called\n"
00056 << "for all nested parameter sets\n";
00057 }
00058 theID_.toString(result);
00059 result += ')';
00060 }
00061
00062 void
00063 ParameterSetEntry::toDigest(cms::Digest &digest) const {
00064 digest.append(isTracked() ? "+Q(" : "-Q(", 3);
00065 if (!theID_.isValid()) {
00066 throw edm::Exception(edm::errors::LogicError)
00067 << "ParameterSet::toString() called prematurely\n"
00068 << "before ParameterSet::registerIt() has been called\n"
00069 << "for all nested parameter sets\n";
00070 }
00071 theID_.toDigest(digest);
00072 digest.append(")", 1);
00073 }
00074
00075 std::string
00076 ParameterSetEntry::toString() const {
00077 std::string result;
00078 toString(result);
00079 return result;
00080 }
00081
00082 ParameterSet const& ParameterSetEntry::pset() const {
00083 if(!thePSet_) {
00084
00085 thePSet_ = value_ptr<ParameterSet>(new ParameterSet(getParameterSet(theID_)));
00086 }
00087 return *thePSet_;
00088 }
00089
00090 ParameterSet& ParameterSetEntry::pset() {
00091 if(!thePSet_) {
00092
00093 thePSet_ = value_ptr<ParameterSet>(new ParameterSet(getParameterSet(theID_)));
00094 }
00095 return *thePSet_;
00096 }
00097
00098 void ParameterSetEntry::updateID() const {
00099 assert(pset().isRegistered());
00100 theID_ = pset().id();
00101 }
00102
00103 std::string ParameterSetEntry::dump(unsigned int indent) const {
00104 std::ostringstream os;
00105 const char* trackiness = (isTracked()?"tracked":"untracked");
00106 os << "PSet "<<trackiness<<" = (" << pset().dump(indent) << ")";
00107 return os.str();
00108 }
00109
00110 std::ostream & operator<<(std::ostream & os, ParameterSetEntry const& psetEntry) {
00111 os << psetEntry.dump();
00112 return os;
00113 }
00114 }
00115
00116