CMS 3D CMS Logo

VParameterSetEntry.cc
Go to the documentation of this file.
5 
6 #include <cassert>
7 #include <ostream>
8 #include <sstream>
9 
10 namespace edm {
11 
13  tracked_(false),
14  theVPSet_(),
15  theIDs_() {
16  }
17 
18  VParameterSetEntry::VParameterSetEntry(std::vector<ParameterSet> const& vpset, bool isTracked) :
19  tracked_(isTracked),
20  theVPSet_(new std::vector<ParameterSet>),
21  theIDs_() {
22  for (std::vector<ParameterSet>::const_iterator i = vpset.begin(), e = vpset.end(); i != e; ++i) {
23  theVPSet_->push_back(*i);
24  }
25  }
26 
28  tracked_(rep[0] == '+'),
29  theVPSet_(),
30  theIDs_(new std::vector<ParameterSetID>) {
31  assert(rep[0] == '+' || rep[0] == '-');
32  std::vector<std::string> temp;
33  // need a substring that starts at the '{'
34  std::string bracketedRepr(rep.begin()+2, rep.end());
35  split(std::back_inserter(temp), bracketedRepr, '{', ',', '}');
36  theIDs_->reserve(temp.size());
37  for (std::vector<std::string>::const_iterator i = temp.begin(), e = temp.end(); i != e; ++i) {
38  theIDs_->push_back(ParameterSetID(*i));
39  }
40  }
41 
43 
44  void
46  assert(theIDs_);
47  result += tracked_ ? "+q" : "-q";
48  result += '{';
50  std::string const between(",");
51  for (std::vector<ParameterSetID>::const_iterator i = theIDs_->begin(), e = theIDs_->end(); i != e; ++i) {
52  result += start;
53  i->toString(result);
54  start = between;
55  }
56  result += '}';
57  }
58 
59  void
61  assert(theIDs_);
62  digest.append(tracked_ ? "+q{" : "-q{", 3);
63  bool started = false;
64  for (std::vector<ParameterSetID>::const_iterator i = theIDs_->begin(), e = theIDs_->end(); i != e; ++i) {
65  if (started)
66  digest.append(",", 1);
67  i->toDigest(digest);
68  started = true;
69  }
70  digest.append("}",1);
71  }
72 
75  toString(result);
76  return result;
77  }
78 
79  std::vector<ParameterSet> const& VParameterSetEntry::vpset() const {
80  fillVPSet();
81  return *theVPSet_;
82  }
83 
84  // NOTE: This function, and other non-const functions of this class
85  // that expose internals, may be used in a way that causes the cached
86  // "theVPSet_" and "theIDs_" to be inconsistent.
87  // THIS PROBLEM NEEDS TO BE ADDRESSED
88  std::vector<ParameterSet>& VParameterSetEntry::vpsetForUpdate() {
89  fillVPSet();
90  return *theVPSet_;
91  }
92 
94  if(nullptr == theVPSet_.load()) {
95  auto tmp = std::make_unique<std::vector<ParameterSet>>();
96  tmp->reserve(theIDs_->size());
97  for (auto const& theID : *theIDs_) {
98  tmp->push_back(getParameterSet(theID));
99  }
100  VParameterSet* expected = nullptr;
101  if(theVPSet_.compare_exchange_strong(expected, tmp.get())) {
102  // theVPSet_ was equal to nullptr and now is equal to tmp.get()
103  tmp.release();
104  }
105  }
106  }
107 
108  // NOTE: This function, and other non-const functions of this class
109  // that expose internals, may be used in a way that causes the cached
110  // "theVPSet_" and "theIDs_" to be inconsistent.
111  // THIS PROBLEM NEEDS TO BE ADDRESSED
113  assert(theVPSet_);
114  return theVPSet_->at(i);
115  }
116 
118  return vpset().size();
119  }
120 
122  fillVPSet();
123  theIDs_ = value_ptr<std::vector<ParameterSetID> >(new std::vector<ParameterSetID>);
124  theIDs_->resize(theVPSet_->size());
125  for (std::vector<ParameterSet>::iterator i = theVPSet_->begin(), e = theVPSet_->end(); i != e; ++i) {
126  if (!i->isRegistered()) {
127  i->registerIt();
128  }
129  theIDs_->at(i - theVPSet_->begin()) = i->id();
130  }
131  }
132 
134  std::string indentation(indent, ' ');
135  std::ostringstream os;
136  std::vector<ParameterSet> const& vps = vpset();
137  os << "VPSet "<<(isTracked()?"tracked":"untracked")<<" = ({" << std::endl;
139  std::string const between(",\n");
140  for(std::vector<ParameterSet>::const_iterator i = vps.begin(), e = vps.end(); i != e; ++i) {
141  os << start << indentation << i->dump(indent);
142  start = between;
143  }
144  if (!vps.empty()) {
145  os << std::endl;
146  }
147  os << indentation << "})";
148  return os.str();
149  }
150 
151  std::ostream& operator<<(std::ostream& os, VParameterSetEntry const& vpsetEntry) {
152  os << vpsetEntry.dump();
153  return os;
154  }
155 }
friend std::ostream & operator<<(std::ostream &os, VParameterSetEntry const &vpsetEntry)
std::string dump(unsigned int indent=0) const
void fillVPSet() const
reconstitutes the VPSet from the registry
Definition: Hash.h:43
std::vector< ParameterSet > VParameterSet
Definition: ParameterSet.h:33
ParameterSet const & getParameterSet(ParameterSetID const &id)
std::vector< ParameterSet > & vpsetForUpdate()
void toDigest(cms::Digest &digest) const
uint16_t size_type
value_ptr< std::vector< ParameterSetID > > theIDs_
atomic_value_ptr< std::vector< ParameterSet > > theVPSet_
std::vector< ParameterSet > const & vpset() const
returns the VPSet
bool split(OutIter result, std::string const &string_to_split, char first, char sep, char last)
Definition: split.h:88
rep
Definition: cuy.py:1189
Hash< ParameterSetType > ParameterSetID
std::string toString() const
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
HLT enums.
std::vector< ParameterSet >::size_type size() const
ParameterSet & psetInVector(int i)
void append(std::string const &s)
Definition: Digest.cc:182