source: src/molecule_template.hpp@ 23b830

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 23b830 was e9f8f9, checked in by Frederik Heber <heber@…>, 16 years ago

More functions of molecule now use templated iterators.

  • Property mode set to 100644
File size: 10.7 KB
Line 
1/*
2 * molecule_template.hpp
3 *
4 * Created on: Oct 6, 2009
5 * Author: heber
6 */
7
8#ifndef MOLECULE_TEMPLATE_HPP_
9#define MOLECULE_TEMPLATE_HPP_
10
11// ================== Acting on all Vectors ========================== //
12
13// zero arguments
14template <typename res> void molecule::ActOnAllVectors( res (Vector::*f)() )
15{
16 atom *Walker = start;
17 while (Walker->next != end) {
18 Walker = Walker->next;
19 ((Walker->node)->*f)();
20 }
21};
22template <typename res> void molecule::ActOnAllVectors( res (Vector::*f)() const )
23{
24 atom *Walker = start;
25 while (Walker->next != end) {
26 Walker = Walker->next;
27 ((Walker->node)->*f)();
28 }
29};
30template <typename res> void molecule::ActOnAllVectors( res (Vector::*f)() ) const
31 {
32 atom *Walker = start;
33 while (Walker->next != end) {
34 Walker = Walker->next;
35 ((Walker->node)->*f)();
36 }
37};
38// one argument
39template <typename res, typename T> void molecule::ActOnAllVectors( res (Vector::*f)(T), T t )
40{
41 atom *Walker = start;
42 while (Walker->next != end) {
43 Walker = Walker->next;
44 ((Walker->node)->*f)(t);
45 }
46};
47template <typename res, typename T> void molecule::ActOnAllVectors( res (Vector::*f)(T) const, T t )
48{
49 atom *Walker = start;
50 while (Walker->next != end) {
51 Walker = Walker->next;
52 ((Walker->node)->*f)(t);
53 }
54};
55template <typename res, typename T> void molecule::ActOnAllVectors( res (Vector::*f)(T), T t ) const
56{
57 atom *Walker = start;
58 while (Walker->next != end) {
59 Walker = Walker->next;
60 ((Walker->node)->*f)(t);
61 }
62};
63// two arguments
64template <typename res, typename T, typename U> void molecule::ActOnAllVectors( res (Vector::*f)(T, U), T t, U u )
65{
66 atom *Walker = start;
67 while (Walker->next != end) {
68 Walker = Walker->next;
69 ((Walker->node)->*f)(t, u);
70 }
71};
72template <typename res, typename T, typename U> void molecule::ActOnAllVectors( res (Vector::*f)(T, U) const, T t, U u )
73{
74 atom *Walker = start;
75 while (Walker->next != end) {
76 Walker = Walker->next;
77 ((Walker->node)->*f)(t, u);
78 }
79};
80template <typename res, typename T, typename U> void molecule::ActOnAllVectors( res (Vector::*f)(T, U), T t, U u ) const
81{
82 atom *Walker = start;
83 while (Walker->next != end) {
84 Walker = Walker->next;
85 ((Walker->node)->*f)(t, u);
86 }
87};
88// three arguments
89template <typename res, typename T, typename U, typename V> void molecule::ActOnAllVectors( res (Vector::*f)(T, U, V), T t, U u, V v)
90{
91 atom *Walker = start;
92 while (Walker->next != end) {
93 Walker = Walker->next;
94 ((Walker->node)->*f)(t, u, v);
95 }
96};
97template <typename res, typename T, typename U, typename V> void molecule::ActOnAllVectors( res (Vector::*f)(T, U, V) const, T t, U u, V v)
98{
99 atom *Walker = start;
100 while (Walker->next != end) {
101 Walker = Walker->next;
102 ((Walker->node)->*f)(t, u, v);
103 }
104};
105template <typename res, typename T, typename U, typename V> void molecule::ActOnAllVectors( res (Vector::*f)(T, U, V), T t, U u, V v) const
106{
107 atom *Walker = start;
108 while (Walker->next != end) {
109 Walker = Walker->next;
110 ((Walker->node)->*f)(t, u, v);
111 }
112};
113
114// ================== Acting with each Atoms on same molecule ========================== //
115
116// zero arguments
117template <typename res> void molecule::ActWithEachAtom( res (molecule::*f)(atom *))
118{
119 atom *Walker = start;
120 while (Walker->next != end) {
121 Walker = Walker->next;
122 (*f)(Walker);
123 }
124};
125template <typename res> void molecule::ActWithEachAtom( res (molecule::*f)(atom *) const)
126{
127 atom *Walker = start;
128 while (Walker->next != end) {
129 Walker = Walker->next;
130 (*f)(Walker);
131 }
132};
133template <typename res> void molecule::ActWithEachAtom( res (molecule::*f)(atom *)) const
134{
135 atom *Walker = start;
136 while (Walker->next != end) {
137 Walker = Walker->next;
138 (*f)(Walker);
139 }
140};
141
142// ================== Acting with each Atoms on copy molecule ========================== //
143
144// zero arguments
145template <typename res> void molecule::ActOnCopyWithEachAtom( res (molecule::*f)(atom *) , molecule *copy)
146{
147 atom *Walker = start;
148 while (Walker->next != end) {
149 Walker = Walker->next;
150 (copy->*f)(Walker);
151 }
152};
153template <typename res> void molecule::ActOnCopyWithEachAtom( res (molecule::*f)(atom *) const , molecule *copy)
154{
155 atom *Walker = start;
156 while (Walker->next != end) {
157 Walker = Walker->next;
158 (copy->*f)(Walker);
159 }
160};
161template <typename res> void molecule::ActOnCopyWithEachAtom( res (molecule::*f)(atom *) , molecule *copy) const
162{
163 atom *Walker = start;
164 while (Walker->next != end) {
165 Walker = Walker->next;
166 (copy->*f)(Walker);
167 }
168};
169
170// ================== Acting with each Atoms on copy molecule if true ========================== //
171
172// zero arguments
173template <typename res> void molecule::ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) , molecule *copy, bool (atom::*condition) () )
174{
175 atom *Walker = start;
176 while (Walker->next != end) {
177 Walker = Walker->next;
178 if ((Walker->*condition)())
179 (copy->*f)(Walker);
180 }
181};
182// one argument
183template <typename res, typename T> void molecule::ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) , molecule *copy, bool (atom::*condition) (T), T t )
184{
185 atom *Walker = start;
186 while (Walker->next != end) {
187 Walker = Walker->next;
188 if ((Walker->*condition)(t))
189 (copy->*f)(Walker);
190 }
191};
192// two arguments
193template <typename res, typename T, typename U> void molecule::ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) , molecule *copy, bool (atom::*condition) (T, U), T t, U u )
194{
195 atom *Walker = start;
196 while (Walker->next != end) {
197 Walker = Walker->next;
198 if ((Walker->*condition)(t,u))
199 (copy->*f)(Walker);
200 }
201};
202// three arguments
203template <typename res, typename T, typename U, typename V> void molecule::ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) , molecule *copy, bool (atom::*condition) (T, U, V), T t, U u, V v )
204{
205 atom *Walker = start;
206 while (Walker->next != end) {
207 Walker = Walker->next;
208 if ((Walker->*condition)(t,u,v))
209 (copy->*f)(Walker);
210 }
211};
212
213// ================== Acting on all Atoms ========================== //
214
215// zero arguments
216template <typename res> void molecule::ActOnAllAtoms( res (atom::*f)())
217{
218 atom *Walker = start;
219 while (Walker->next != end) {
220 Walker = Walker->next;
221 (Walker->*f)();
222 }
223};
224template <typename res> void molecule::ActOnAllAtoms( res (atom::*f)() const)
225{
226 atom *Walker = start;
227 while (Walker->next != end) {
228 Walker = Walker->next;
229 (Walker->*f)();
230 }
231};
232template <typename res> void molecule::ActOnAllAtoms( res (atom::*f)()) const
233{
234 atom *Walker = start;
235 while (Walker->next != end) {
236 Walker = Walker->next;
237 (Walker->*f)();
238 }
239};
240// one argument
241template <typename res, typename T> void molecule::ActOnAllAtoms( res (atom::*f)(T), T t )
242{
243 atom *Walker = start;
244 while (Walker->next != end) {
245 Walker = Walker->next;
246 (Walker->*f)(t);
247 }
248};
249template <typename res, typename T> void molecule::ActOnAllAtoms( res (atom::*f)(T) const, T t )
250{
251 atom *Walker = start;
252 while (Walker->next != end) {
253 Walker = Walker->next;
254 (Walker->*f)(t);
255 }
256};
257template <typename res, typename T> void molecule::ActOnAllAtoms( res (atom::*f)(T) const, T t ) const
258{
259 atom *Walker = start;
260 while (Walker->next != end) {
261 Walker = Walker->next;
262 (Walker->*f)(t);
263 }
264};
265// two argument
266template <typename res, typename T, typename U> void molecule::ActOnAllAtoms( res (atom::*f)(T, U), T t, U u )
267{
268 atom *Walker = start;
269 while (Walker->next != end) {
270 Walker = Walker->next;
271 (Walker->*f)(t, u);
272 }
273};
274template <typename res, typename T, typename U> void molecule::ActOnAllAtoms( res (atom::*f)(T, U) const, T t, U u )
275{
276 atom *Walker = start;
277 while (Walker->next != end) {
278 Walker = Walker->next;
279 (Walker->*f)(t, u);
280 }
281};
282template <typename res, typename T, typename U> void molecule::ActOnAllAtoms( res (atom::*f)(T, U), T t, U u ) const
283{
284 atom *Walker = start;
285 while (Walker->next != end) {
286 Walker = Walker->next;
287 (Walker->*f)(t, u);
288 }
289};
290// three argument
291template <typename res, typename T, typename U, typename V> void molecule::ActOnAllAtoms( res (atom::*f)(T, U, V), T t, U u, V v)
292{
293 atom *Walker = start;
294 while (Walker->next != end) {
295 Walker = Walker->next;
296 (Walker->*f)(t, u, v);
297 }
298};
299template <typename res, typename T, typename U, typename V> void molecule::ActOnAllAtoms( res (atom::*f)(T, U, V) const, T t, U u, V v)
300{
301 atom *Walker = start;
302 while (Walker->next != end) {
303 Walker = Walker->next;
304 (Walker->*f)(t, u, v);
305 }
306};
307template <typename res, typename T, typename U, typename V> void molecule::ActOnAllAtoms( res (atom::*f)(T, U, V), T t, U u, V v) const
308{
309 atom *Walker = start;
310 while (Walker->next != end) {
311 Walker = Walker->next;
312 (Walker->*f)(t, u, v);
313 }
314};
315// four arguments
316template <typename res, typename T, typename U, typename V, typename W> void molecule::ActOnAllAtoms( res (atom::*f)(T, U, V, W), T t, U u, V v, W w)
317{
318 atom *Walker = start;
319 while (Walker->next != end) {
320 Walker = Walker->next;
321 (Walker->*f)(t, u, v, w);
322 }
323};
324template <typename res, typename T, typename U, typename V, typename W> void molecule::ActOnAllAtoms( res (atom::*f)(T, U, V, W) const, T t, U u, V v, W w)
325{
326 atom *Walker = start;
327 while (Walker->next != end) {
328 Walker = Walker->next;
329 (Walker->*f)(t, u, v, w);
330 }
331};
332template <typename res, typename T, typename U, typename V, typename W> void molecule::ActOnAllAtoms( res (atom::*f)(T, U, V, W), T t, U u, V v, W w) const
333{
334 atom *Walker = start;
335 while (Walker->next != end) {
336 Walker = Walker->next;
337 (Walker->*f)(t, u, v, w);
338 }
339};
340
341// ===================== Accesssing arrays indexed by some integer for each atom ======================
342
343// for atom ints
344template <typename T> void molecule::SetIndexedArrayForEachAtomTo ( T *array, int atom::*index, void (*Setor)(T *, T) )
345{
346 atom *Walker = start;
347 while (Walker->next != end) {
348 Walker = Walker->next;
349 (*Setor) (&array[(Walker->*index)], 1);
350 }
351};
352template <typename T> void molecule::SetIndexedArrayForEachAtomTo ( T *array, int atom::*index, void (*Setor)(T *, T), T value )
353{
354 atom *Walker = start;
355 while (Walker->next != end) {
356 Walker = Walker->next;
357 (*Setor) (&array[(Walker->*index)], value);
358 }
359};
360// for element ints inside atom class
361template <typename T> void molecule::SetIndexedArrayForEachAtomTo ( T *array, int element::*index, void (*Setor)(T *, T) )
362{
363 atom *Walker = start;
364 while (Walker->next != end) {
365 Walker = Walker->next;
366 (*Setor) (&array[(Walker->type->*index)], 1);
367 }
368};
369template <typename T> void molecule::SetIndexedArrayForEachAtomTo ( T *array, int element::*index, void (*Setor)(T *, T), T value )
370{
371 atom *Walker = start;
372 while (Walker->next != end) {
373 Walker = Walker->next;
374 (*Setor) (&array[(Walker->type->*index)], value);
375 }
376};
377
378#endif /* MOLECULE_TEMPLATE_HPP_ */
Note: See TracBrowser for help on using the repository browser.