source: trunk/source/global/management/src/G4StateManager.cc@ 1139

Last change on this file since 1139 was 1058, checked in by garnier, 17 years ago

file release beta

File size: 8.0 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// $Id: G4StateManager.cc,v 1.13 2006/11/23 00:41:56 asaim Exp $
28// GEANT4 tag $Name: geant4-09-02-ref-02 $
29//
30//
31// ------------------------------------------------------------
32// GEANT 4 class implementation file
33//
34// ---------------- G4StateManager ----------------
35// by Gabriele Cosmo, November 1996
36// ------------------------------------------------------------
37
38#include "G4StateManager.hh"
39
40// Initialization of the static pointer of the single class instance
41//
42G4StateManager* G4StateManager::theStateManager = 0;
43
44G4StateManager::G4StateManager()
45 : theCurrentState(G4State_PreInit),
46 thePreviousState(G4State_PreInit),
47 theBottomDependent(0),
48 suppressAbortion(0),
49 msgptr(0),
50 exceptionHandler(0)
51{
52}
53
54G4StateManager::~G4StateManager()
55{
56 G4VStateDependent* state=0;
57
58 while (theDependentsList.size()>0)
59 {
60 state = theDependentsList.back();
61 theDependentsList.pop_back();
62 for (std::vector<G4VStateDependent*>::iterator
63 i=theDependentsList.begin(); i!=theDependentsList.end(); i++)
64 {
65 if (*i==state)
66 {
67 theDependentsList.erase(i);
68 i--;
69 }
70 }
71 if ( state ) { delete state; }
72 }
73}
74
75// -------------------------------------------------------------------------
76// No matter how copy-constructor and operators below are implemented ...
77// just dummy implementations, since not relevant for the singleton and
78// declared private.
79//
80G4StateManager::G4StateManager(const G4StateManager &right)
81 : theCurrentState(right.theCurrentState),
82 thePreviousState(right.thePreviousState),
83 theDependentsList(right.theDependentsList),
84 theBottomDependent(right.theBottomDependent),
85 suppressAbortion(right.suppressAbortion),
86 msgptr(right.msgptr),
87 exceptionHandler(right.exceptionHandler)
88{
89}
90
91G4StateManager&
92G4StateManager::operator=(const G4StateManager &right)
93{
94 if (&right == this) { return *this; }
95
96 theCurrentState = right.theCurrentState;
97 thePreviousState = right.thePreviousState;
98 theDependentsList = right.theDependentsList;
99 theBottomDependent = right.theBottomDependent;
100 suppressAbortion = right.suppressAbortion;
101 msgptr = right.msgptr;
102 exceptionHandler = right.exceptionHandler;
103
104 return *this;
105}
106
107G4int
108G4StateManager::operator==(const G4StateManager &right) const
109{
110 return (this == &right);
111}
112
113G4int
114G4StateManager::operator!=(const G4StateManager &right) const
115{
116 return (this != &right);
117}
118//
119// -------------------------------------------------------------------------
120
121G4StateManager*
122G4StateManager::GetStateManager()
123{
124 if (!theStateManager)
125 {
126 theStateManager = new G4StateManager;
127 }
128 return theStateManager;
129}
130
131G4bool
132G4StateManager::RegisterDependent(G4VStateDependent* aDependent, G4bool bottom)
133{
134 printf("G4StateManager::RegisterDependent()\n");
135 G4bool ack=true;
136 if(!bottom)
137 {
138 theDependentsList.push_back(aDependent);
139 }
140 else
141 {
142 if(theBottomDependent)
143 {
144 theDependentsList.push_back(theBottomDependent);
145 }
146 theBottomDependent = aDependent;
147 }
148 return ack;
149}
150
151G4bool
152G4StateManager::DeregisterDependent(G4VStateDependent* aDependent)
153{
154 printf("G4StateManager::DeregisterDependent()\n");
155 G4VStateDependent* tmp = 0;
156 for (std::vector<G4VStateDependent*>::iterator i=theDependentsList.begin();
157 i!=theDependentsList.end(); i++)
158 {
159 if (**i==*aDependent)
160 {
161 tmp = *i;
162 theDependentsList.erase(i);
163 }
164 }
165 return (tmp != 0);
166}
167
168G4ApplicationState
169G4StateManager::GetCurrentState() const
170{
171 printf("G4StateManager::GetCurrentState() = %s\n",GetStateString(theCurrentState).c_str());
172 return theCurrentState;
173}
174
175G4ApplicationState
176G4StateManager::GetPreviousState() const
177{
178 printf("G4StateManager::GetPreviousState() = %s\n",GetStateString(thePreviousState).c_str());
179 return thePreviousState;
180}
181
182G4bool
183G4StateManager::SetNewState(G4ApplicationState requestedState)
184{ printf("G4StateManager::SetNewState(%s)\n",GetStateString(requestedState).c_str());
185 return SetNewState(requestedState,0); }
186
187G4bool
188G4StateManager::SetNewState(G4ApplicationState requestedState, const char* msg)
189{
190 printf("G4StateManager::SetNewState(%s , ...) vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv\n",GetStateString(requestedState).c_str());
191 if(requestedState==G4State_Abort && suppressAbortion>0)
192 {
193 if(suppressAbortion==2) { return false; }
194 if(theCurrentState==G4State_EventProc) { return false; }
195 }
196 msgptr = msg;
197 size_t i=0;
198 G4bool ack = true;
199 G4ApplicationState savedState = thePreviousState;
200 thePreviousState = theCurrentState;
201 printf("G4StateManager::SetNewState(.. , ...) middle\n");
202 while ((ack) && (i<theDependentsList.size()))
203 {
204 printf("G4StateManager::SetNewState(.. , ...) while...\n");
205 ack = theDependentsList[i]->Notify(requestedState);
206 i++;
207 }
208 if(theBottomDependent)
209 {
210 ack = theBottomDependent->Notify(requestedState);
211 }
212
213 if(!ack)
214 { thePreviousState = savedState; }
215 else
216 { theCurrentState = requestedState; }
217 msgptr = 0;
218 printf("G4StateManager::SetNewState(%s , ...) END ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",GetStateString(requestedState).c_str());
219 return ack;
220}
221
222G4VStateDependent*
223G4StateManager::RemoveDependent(const G4VStateDependent* aDependent)
224{
225 G4VStateDependent* tmp = 0;
226 for (std::vector<G4VStateDependent*>::iterator i=theDependentsList.begin();
227 i!=theDependentsList.end(); i++)
228 {
229 if (**i==*aDependent)
230 {
231 tmp = *i;
232 theDependentsList.erase(i);
233 }
234 }
235 return tmp;
236}
237
238G4String
239G4StateManager::GetStateString(G4ApplicationState aState) const
240{
241 G4String stateName;
242 switch(aState)
243 {
244 case G4State_PreInit:
245 stateName = "PreInit"; break;
246 case G4State_Init:
247 stateName = "Init"; break;
248 case G4State_Idle:
249 stateName = "Idle"; break;
250 case G4State_GeomClosed:
251 stateName = "GeomClosed"; break;
252 case G4State_EventProc:
253 stateName = "EventProc"; break;
254 case G4State_Quit:
255 stateName = "Quit"; break;
256 case G4State_Abort:
257 stateName = "Abort"; break;
258 default:
259 stateName = "Unknown"; break;
260 }
261 return stateName;
262}
263
264//void G4StateManager::Pause()
265//{
266// Pause("G4_pause> ");
267//}
268//
269//void G4StateManager::Pause(const char* msg)
270//{
271// G4String msgS = msg;
272// Pause(msgS);
273//}
274//
275//void G4StateManager::Pause(G4String msg)
276//{
277// G4UImanager::GetUIpointer()->PauseSession(msg);
278//}
Note: See TracBrowser for help on using the repository browser.