source: src/UIElements/Qt4/InstanceBoard/ObservedValue_wCallback.hpp@ 68418e

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 68418e was 494478, checked in by Frederik Heber <heber@…>, 9 years ago

Extracted all ObservedValue functionality out of GLMoleculeObject_molecule.

  • see previous commit for explanations.
  • Property mode set to 100644
File size: 3.5 KB
Line 
1/*
2 * ObservedValue_wCallback.hpp
3 *
4 * Created on: Oct 16, 2015
5 * Author: heber
6 */
7
8
9#ifndef OBSERVEDVALUE_WCALLBACK_HPP_
10#define OBSERVEDVALUE_WCALLBACK_HPP_
11
12// include config.h
13#ifdef HAVE_CONFIG_H
14#include <config.h>
15#endif
16
17#include "CodePatterns/ObservedValue.hpp"
18#include "CodePatterns/Observer/Observable.hpp"
19
20#include <string>
21
22#include <boost/bind.hpp>
23#include <boost/function.hpp>
24
25/** We derive from ObservedValue in order to tell owning instance about
26 * subjectKilled() having been called.
27 */
28template <class T, class id=T>
29class ObservedValue_wCallback : public ObservedValue<T>
30{
31public:
32 ObservedValue_wCallback(
33 const Observable * const _owner,
34 const boost::function<T()> &_recalcMethod,
35 const std::string &_name,
36 const T &_initialvalue,
37 const Observable::channels_t &_channels,
38 const boost::function<void(const id)> &_callback,
39 const boost::function<const id()> &_getId) :
40 ObservedValue<T>(_owner, _recalcMethod, _name, _initialvalue, _channels),
41 callback(_callback),
42 getId(_getId)
43 {}
44 virtual ~ObservedValue_wCallback()
45 {}
46
47protected:
48 virtual void subjectKilled(Observable *publisher)
49 {
50 ObservedValue<T>::subjectKilled(publisher);
51 callback(getId());
52 }
53
54private:
55 //!> callback function to tell other entity about subjectKilled
56 const boost::function<void(const id)> callback;
57 const boost::function<const id()> getId;
58};
59
60/** Specialization of ObservedValue_wCallback for the index ObservedValue.
61 *
62 * The index serves as the unique identifier for the object instance whose
63 * properties are monitored in ObservedValue. Hence, how to give a subjectKilled()
64 * with an external getId() function? For the index the ObservedValue::get() is
65 * the getId() we need to call! Hence, we may simply connect these internally
66 * in this partial template specialization.
67 *
68 * Because atomicNumber_t, atomId_t and moleculeId_t are not unique types but
69 * -- at the writing of this class -- just typedefs, we have to resort to the
70 * trick with two constructors, one taking an external getId(), the other
71 * routing the getId() internally by binding to ObservedValue<T>::get().
72 */
73template <class T>
74class ObservedValue_wCallback<T,T> : public ObservedValue<T>
75{
76public:
77 ObservedValue_wCallback(
78 const Observable * const _owner,
79 const boost::function<T()> &_recalcMethod,
80 const std::string &_name,
81 const T &_initialvalue,
82 const Observable::channels_t &_channels,
83 const boost::function<void(const T)> &_callback,
84 const boost::function<const T()> &_getId) :
85 ObservedValue<T>(_owner, _recalcMethod, _name, _initialvalue, _channels),
86 callback(_callback),
87 getId(_getId)
88 {}
89 ObservedValue_wCallback(
90 const Observable * const _owner,
91 const boost::function<T()> &_recalcMethod,
92 const std::string &_name,
93 const T &_initialvalue,
94 const Observable::channels_t &_channels,
95 const boost::function<void(const T)> &_callback) :
96 ObservedValue<T>(_owner, _recalcMethod, _name, _initialvalue, _channels),
97 callback(_callback),
98 getId(boost::bind(&ObservedValue<T>::get, this))
99 {}
100 virtual ~ObservedValue_wCallback()
101 {}
102
103protected:
104 virtual void subjectKilled(Observable *publisher)
105 {
106 ObservedValue<T>::subjectKilled(publisher);
107 callback(getId());
108 }
109
110private:
111 //!> callback function to tell other entity about subjectKilled
112 const boost::function<void(const T)> callback;
113 const boost::function<const T()> getId;
114};
115
116#endif /* OBSERVEDVALUE_WCALLBACK_HPP_ */
Note: See TracBrowser for help on using the repository browser.