source: src/stackclass.hpp@ 6056f1

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since 6056f1 was e138de, checked in by Frederik Heber <heber@…>, 15 years ago

Huge change from ofstream * (const) out --> Log().

  • first shift was done via regular expressions
  • then via error messages from the code
  • note that class atom, class element and class molecule kept in parts their output stream, was they print to file.
  • make check runs fine
  • MISSING: Verbosity is not fixed for everything (i.e. if no endl; is present and next has Verbose(0) ...)

Signed-off-by: Frederik Heber <heber@…>

  • Property mode set to 100755
File size: 8.0 KB
Line 
1#ifndef STACKCLASS_HPP_
2#define STACKCLASS_HPP_
3
4using namespace std;
5
6/*********************************************** includes ***********************************/
7
8// include config.h
9#ifdef HAVE_CONFIG_H
10#include <config.h>
11#endif
12
13#include "verbose.hpp"
14#include "memoryallocator.hpp"
15
16/****************************************** forward declarations *****************************/
17
18template <typename T> class StackClass;
19
20/******************************** Functions for class StackClass ********************************/
21
22/* Stack of Stuff.
23 * Is used during DepthFirstSearchAnalysis() to detect nonseparable components.
24 */
25template <typename T> class StackClass {
26 public:
27 StackClass<T>(int dimension);
28 ~StackClass<T>();
29
30 bool Push(T object);
31 T PopFirst();
32 T PopLast();
33 bool RemoveItem(T ptr);
34 void ClearStack();
35 bool IsEmpty() const;
36 bool IsFull() const;
37 int ItemCount() const;
38 void Output(ofstream * const out) const;
39
40 private:
41 T *StackList; //!< the list containing the atom pointers
42 int EntryCount; //!< number of entries in the stack
43 int CurrentLastEntry; //!< Current last entry (newest item on stack)
44 int CurrentFirstEntry; //!< Current first entry (oldest item on stack)
45 int NextFreeField; //!< Current index of next free field
46};
47
48/** Constructor of class StackClass.
49 */
50template <typename T> StackClass<T>::StackClass(int dimension) : StackList(NULL), EntryCount(dimension), CurrentLastEntry(0), CurrentFirstEntry(0), NextFreeField(0)
51{
52 StackList = Calloc<T>(EntryCount, "StackClass::StackClass: **StackList");
53};
54
55/** Destructor of class StackClass.
56 */
57template <typename T> StackClass<T>::~StackClass()
58{
59 Free(&StackList);
60};
61
62/** Pushes an object onto the stack.
63 * \param *object atom to be pushed on stack
64 * \return true - sucess, false - failure, meaning stack field was occupied
65 */
66template <typename T> bool StackClass<T>::Push(T object)
67{
68 if (!IsFull()) { // check whether free field is really not occupied
69 StackList[NextFreeField] = object;
70 CurrentLastEntry = NextFreeField;
71 NextFreeField = (NextFreeField + 1) % EntryCount; // step on to next free field
72 return true;
73 } else {
74 eLog() << Verbose(0) << "ERROR: Stack is full, " << "Stack: CurrentLastEntry " << CurrentLastEntry<< "\tCurrentFirstEntry " << CurrentFirstEntry << "\tNextFreeField " << NextFreeField << "\tEntryCount " << EntryCount << "!" << endl;
75 return false;
76 }
77};
78
79/** Pops first/oldest atom from stack.
80 * First in, last out.
81 * \return atom pointer from stack, NULL - if failure (no atom pointer in field)
82 */
83template <typename T> T StackClass<T>::PopFirst()
84{
85 T Walker = NULL;
86 if (!IsEmpty()) {
87 Walker = StackList[CurrentFirstEntry];
88 if (Walker == NULL)
89 eLog() << Verbose(0) << "ERROR: Stack's field is empty!" << endl;
90 StackList[CurrentFirstEntry] = NULL;
91 if (CurrentFirstEntry != CurrentLastEntry) { // hasn't last item been popped as well?
92 CurrentFirstEntry = (CurrentFirstEntry + 1) % EntryCount; // step back from current free field to last used (somehow modulo does not work in -1)
93 } else {
94 CurrentFirstEntry = (CurrentFirstEntry + 1) % EntryCount; // step back from current free field to last used (somehow modulo does not work in -1)
95 CurrentLastEntry = CurrentFirstEntry;
96 }
97 } else
98 eLog() << Verbose(0) << "ERROR: Stack is empty!" << endl;
99 return Walker;
100};
101
102/** Pops last element from stack.
103 * First in, first out.
104 * \return element pointer from stack, NULL - if failure (no atom pointer in field)
105 */
106template <typename T> T StackClass<T>::PopLast()
107{
108 T Walker = NULL;
109 if (!IsEmpty()) {
110 Walker = StackList[CurrentLastEntry];
111 StackList[CurrentLastEntry] = NULL;
112 if (Walker == NULL)
113 eLog() << Verbose(0) << "ERROR: Stack's field is empty!" << endl;
114 NextFreeField = CurrentLastEntry;
115 if (CurrentLastEntry != CurrentFirstEntry) // has there been more than one item on stack
116 CurrentLastEntry = (CurrentLastEntry + (EntryCount-1)) % EntryCount; // step back from current free field to last (modulo does not work in -1, thus go EntryCount-1 instead)
117 } else {
118 eLog() << Verbose(0) << "ERROR: Stack is empty!" << endl;
119 }
120 return Walker;
121};
122
123/** Removes a certain item from the stack.
124 * Item is seeked between \a CurrentFirstEntry and \a CurrentLastEntry, if found, place in stack is NULL'd and
125 * all subsequent items shifted by one position downward (with wrapping taken into account).
126 * \param *ptr adress of item
127 * \return true - item was removed, false - item was not found
128 */
129template <typename T> bool StackClass<T>::RemoveItem(T ptr)
130{
131 bool found = false;
132 Log() << Verbose(5) << "First " << CurrentFirstEntry<< "\tLast " << CurrentLastEntry<< "\tNext " << NextFreeField<< "\tCount " << EntryCount<< "." << endl;
133 int i=CurrentFirstEntry;
134 if (!IsEmpty())
135 do {
136 if (StackList[i] == ptr) { // if item found, remove
137 Log() << Verbose(5) << "Item " << *ptr << " was number " << i << " on stack, removing it." << endl;
138 found = true;
139 StackList[i] = NULL;
140 }
141 if ((found) && (StackList[i] != NULL)) { // means we have to shift (and not the removed item)
142 if (i == 0) { // we are down to first item in stack, have to put onto last item
143 Log() << Verbose(5) << "Shifting item 0 to place " << EntryCount-1 << "." << endl;
144 StackList[EntryCount-1] = StackList[0];
145 } else {
146 Log() << Verbose(5) << "Shifting item " << i << " to place " << i-1 << "." << endl;
147 StackList[i-1] = StackList[i];
148 }
149 }
150 i=((i + 1) % EntryCount); // step on
151 } while (i!=NextFreeField);
152 else
153 eLog() << Verbose(0) << "ERROR: Stack is already empty!" << endl;
154 if (found) {
155 NextFreeField = CurrentLastEntry;
156 if (CurrentLastEntry != CurrentFirstEntry) // has there been more than one item on stack
157 CurrentLastEntry = (CurrentLastEntry + (EntryCount-1)) % EntryCount;
158 }
159 return found;
160};
161
162
163/** Puts contents of stack into ofstream \a *out.
164 * \param *out ofstream for output
165 */
166template <typename T> void StackClass<T>::Output(ofstream * const out) const
167{
168 *out << "Contents of Stack: ";
169 for(int i=0;i<EntryCount;i++) {
170 *out << "\t";
171 if (i == CurrentFirstEntry)
172 *out << " 1";
173 if (i == CurrentLastEntry)
174 *out << " "<< EntryCount;
175 if (i == NextFreeField)
176 *out << " F";
177 *out << ": " << StackList[i];
178 }
179 *out << endl;
180};
181
182/** Checks whether stack is empty.
183 * Simply checks whether StackClass::NextFreeField is equal to StackClass::CurrentFirstEntry and
184 * StackClass::CurrentFirstEntry is equal to StackClass::CurrentLastEntry.
185 * \return true - empty, false - not
186 */
187template <typename T> bool StackClass<T>::IsEmpty() const
188{
189 return((NextFreeField == CurrentFirstEntry) && (CurrentLastEntry == CurrentFirstEntry));
190};
191
192/** Checks whether stack is full.
193 * Simply checks whether StackClass::NextFreeField is equal to StackClass::CurrentFirstEntry and
194 * StackClass::CurrentFirstEntry is _not_ equal to StackClass::CurrentLastEntry.
195 * \return true - full, false - not
196 */
197template <typename T> bool StackClass<T>::IsFull() const
198{
199 return((NextFreeField == CurrentFirstEntry) && (CurrentLastEntry != CurrentFirstEntry));
200};
201
202/** Returns number of items on stack.
203 * Simply returns difference between StackClass::Stacklist entry StackClass::CurrentEntry-1.
204 * \return number of items on stack
205 * \warning will never return correct item count if stack is full, i.e. count would be StackClass::EntryCount.
206 */
207template <typename T> int StackClass<T>::ItemCount() const
208{
209 //Log() << Verbose(0) << "Stack: CurrentLastEntry " << CurrentLastEntry<< "\tCurrentFirstEntry " << CurrentFirstEntry << "\tEntryCount " << EntryCount << "." << endl;
210 return((NextFreeField + (EntryCount - CurrentFirstEntry)) % EntryCount);
211};
212
213/** Clears the stack from all atoms.
214 * \return true - sucess, false - failure
215 */
216template <typename T> void StackClass<T>::ClearStack()
217{
218 for(int i=EntryCount; i--;)
219 StackList[i] = NULL;
220 CurrentFirstEntry = 0;
221 CurrentLastEntry = 0;
222 NextFreeField = 0;
223};
224
225
226
227#endif /*STACKCLASS_HPP_*/
Note: See TracBrowser for help on using the repository browser.