CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
FWModelChangeManager.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Core
4 // Class : FWModelChangeManager
5 //
6 // Implementation:
7 // <Notes on implementation>
8 //
9 // Original Author: Chris Jones
10 // Created: Thu Jan 17 19:13:46 EST 2008
11 //
12 
13 // system include files
14 #include <cassert>
15 #include <memory>
16 #include <exception>
17 
18 // user include files
23 
24 //
25 // constants, enums and typedefs
26 //
27 
28 //
29 // static data member definitions
30 //
31 
32 //
33 // constructors and destructor
34 //
36 
37 // FWModelChangeManager::FWModelChangeManager(const FWModelChangeManager& rhs)
38 // {
39 // // do actual copying here;
40 // }
41 
43 
44 //
45 // assignment operators
46 //
47 // const FWModelChangeManager& FWModelChangeManager::operator=(const FWModelChangeManager& rhs)
48 // {
49 // //An exception safe implementation is
50 // FWModelChangeManager temp(rhs);
51 // swap(rhs);
52 //
53 // return *this;
54 // }
55 
56 //
57 // member functions
58 //
60 
62  FWChangeSentry sentry(*this);
63  assert(iID.item());
64  assert(iID.item()->id() < m_changes.size());
65  m_changes[iID.item()->id()].insert(iID);
66 }
67 
69  FWChangeSentry sentry(*this);
70  assert(nullptr != iItem);
71  m_itemChanges.insert(iItem);
72  //remove any pending changes on models owned by this item
73  assert(iItem->id() < m_changes.size());
74  m_changes[iItem->id()].clear();
75 }
76 
78  //since this can cause other changes, we might as well aggregate them
79  FWChangeSentry sentry(*iCM);
80  iCM->changeSignalsAreDone_();
81 }
82 
84  assert(m_depth != 0);
85  //makes sure that 'changeSignalsAreDone is called if changeSignalsAreComing_ is sent
86  bool guard(false);
87  if (0 == --m_depth) {
88  unsigned int index = 0;
89  for (std::set<const FWEventItem*>::iterator itChanges = m_itemChanges.begin(); itChanges != m_itemChanges.end();
90  ++itChanges, ++index) {
91  if (!guard) {
92  // std::shared_ptr<FWModelChangeManager> done(this, &sendChangeSignalsAreDone);
93  guard = true;
95  }
96  FWItemChangeSignal& signal = m_itemChangeSignals[(*itChanges)->id()];
97  //loop over the slots ourself so we can control the behavior in case of a failure
98  FWItemChangeSignal::slot_list_type slots = signal.slots();
99  for (FWItemChangeSignal::slot_list_type::iterator itSlot = slots.begin(), itEnd = slots.end(); itSlot != itEnd;
100  ++itSlot) {
101  try {
102  (*itSlot)(*itChanges);
103  } catch (const cms::Exception& iE) {
104  fwLog(fwlog::kError) << (*itChanges)->name() << " had the failure in process FWItemChanged signals\n"
105  << iE.what() << std::endl;
106  } catch (const std::bad_alloc& iE) {
107  std::cerr << "Ran out of memory while processing " << (*itChanges)->name() << std::endl;
108  exit(1);
109  } catch (const std::exception& iE) {
110  fwLog(fwlog::kError) << (*itChanges)->name() << " had the failure in process FWItemChanged signals (2) \n"
111  << iE.what() << std::endl;
112  }
113  }
114  }
115  m_itemChanges.clear();
116 
117  for (size_t ci = 0, ce = m_changes.size(), si = 0; ci != ce; ++ci, ++si) {
118  FWModelIds& changes = m_changes[ci];
119  FWModelChangeSignal& signal = m_changeSignals[si];
120 
121  if (not changes.empty()) {
122  if (!guard) {
123  // std::shared_ptr<FWModelChangeManager> done(this, &sendChangeSignalsAreDone);
124  guard = true;
126  }
127  //loop over the slots ourself so we can control the behavior in case of a failure
128  FWModelChangeSignal::slot_list_type slots = signal.slots();
129  for (FWModelChangeSignal::slot_list_type::iterator itSlot = slots.begin(), itEnd = slots.end(); itSlot != itEnd;
130  ++itSlot) {
131  try {
132  (*itSlot)(changes);
133  } catch (const cms::Exception& iE) {
134  fwLog(fwlog::kError) << changes.begin()->item()->name()
135  << " had the failure in process FWModelChangeSignals\n"
136  << iE.what() << "\n";
137  } catch (const std::bad_alloc& iE) {
138  // GE: if we run out of memory why do we assume that we will be able to print?
139  fwLog(fwlog::kError) << "Ran out of memory while processing " << changes.begin()->item()->name() << "\n";
140  exit(1);
141  } catch (const std::exception& iE) {
142  fwLog(fwlog::kError) << changes.begin()->item()->name()
143  << " had the failure in process FWModelChangeSignals (2)\n"
144  << iE.what() << "\n";
145  }
146  }
147  changes.clear();
148  }
149  }
150  }
151  if (guard)
153 }
154 
156  assert(nullptr != iItem);
157  assert(iItem->id() == m_changes.size());
158  assert(iItem->id() == m_changeSignals.size());
159  m_changes.push_back(FWModelIds());
162  //propagate our signal to the item
163  m_changeSignals.back().connect(iItem->changed_);
164  m_itemChangeSignals.back().connect(iItem->itemChanged_);
165 }
166 
171  m_changes.clear();
172  m_changeSignals.clear();
173 
174  m_itemChangeSignals.clear();
175  m_itemChanges.clear();
176 }
177 
178 //
179 // const member functions
180 //
181 
182 //
183 // static member functions
184 //
std::vector< FWModelChangeSignal > m_changeSignals
std::vector< FWModelIds > m_changes
static void sendChangeSignalsAreDone(FWModelChangeManager *iCM)
assert(be >=bs)
std::set< const FWEventItem * > m_itemChanges
void newItemSlot(FWEventItem *)
std::set< FWModelId > FWModelIds
FWItemChangeSignal itemChanged_
Definition: FWEventItem.h:181
char const * what() const noexceptoverride
Definition: Exception.cc:103
sigc::signal< void, const FWModelIds & > FWModelChangeSignal
unsigned int id() const
Definition: FWEventItem.cc:433
sigc::signal< void > changeSignalsAreDone_
void changed(const FWModelId &)
#define fwLog(_level_)
Definition: fwLog.h:45
std::vector< FWItemChangeSignal > m_itemChangeSignals
sigc::signal< void > changeSignalsAreComing_
FWModelChangeSignal changed_
Definition: FWEventItem.h:178
sigc::signal< void, const FWEventItem * > FWItemChangeSignal
const FWEventItem * item() const
Definition: FWModelId.h:39