Belle II Software  release-08-01-10
Callback.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 #include "daq/slc/nsm/Callback.h"
9 
10 #include "daq/slc/base/StringUtil.h"
11 
12 using namespace Belle2;
13 
14 int Callback::reset()
15 {
16  for (NSMVHandlerList::iterator it = m_handler.begin();
17  it != m_handler.end(); ++it) {
18  if (it->second != NULL) delete it->second;
19  }
20  m_handler = NSMVHandlerList();
21  m_hnames = StringList();
22  return ++m_revision;
23 }
24 
25 int Callback::add(NSMVHandler* handler, bool overwrite, bool isdump)
26 {
27  if (handler) {
28  std::string hname = handler->getNode() + "@" + handler->getName();
29  if (m_handler.find(hname) != m_handler.end()) {
30  NSMVHandler* handler_old = m_handler.find(hname)->second;
31  if (handler->useSet() && overwrite) {
32  handler->set(handler_old->get());
33  }
34  delete handler_old;
35  m_handler.erase(hname);
36  }
37  handler->setDumped(isdump);
38  m_handler.insert(std::pair<std::string, NSMVHandler*>(hname, handler));
39  m_hnames.push_back(hname);
40  return m_handler.size();
41  }
42  return 0;
43 }
44 
45 void Callback::remove(const std::string& node, const std::string& /*name*/)
46 {
47  std::string hname = node + "@" + node;
48  if (m_handler.find(hname) != m_handler.end()) {
49  NSMVHandler* handler_old = m_handler.find(hname)->second;
50  delete handler_old;
51  m_handler.erase(hname);
52  return;
53  }
54 }
55 
56 NSMVHandler& Callback::getHandler(const std::string& node,
57  const std::string& name)
58 {
59  NSMVHandler* p = getHandler_p(node, name);
60  if (p != NULL) return *p;
61  throw (std::out_of_range(StringUtil::form("no handler for %s:%s",
62  node.c_str(), name.c_str())));
63 }
64 
65 NSMVHandler* Callback::getHandler_p(const std::string& node, const std::string& name)
66 {
67  std::string hname = node + "@" + name;
68  if (m_handler.find(hname) != m_handler.end()) {
69  return m_handler.find(hname)->second;
70  }
71  hname = "@" + name;
72  if (m_handler.find(hname) != m_handler.end()) {
73  return m_handler.find(hname)->second;
74  }
75  return NULL;
76 }
77 
78 void Callback::remove(const DBObject& obj)
79 {
80  DBObject::NameValueList list;
81  obj.search(list, "", true);
82  for (DBObject::NameValueList::iterator it = list.begin();
83  it != list.end(); ++it) {
84  const std::string& name(it->name);
85  if (name.size() == 0 || name.at(0) == '$') continue;
86  switch (it->type) {
87  case DBField::OBJECT:
88  break;
89  default:
90  remove(name);
91  break;
92  }
93  }
94 }
Abstract base class for different kinds of events.