source: src/UIElements/Qt4/InstanceBoard/ObservedValue_wCallback.hpp@ b2c2e4

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

FIX: ObservedValue_wCallback needs to call callback() only on last channel's signOff().

  • Property mode set to 100644
File size: 4.3 KB
RevLine 
[7c7c4a]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
[ab628c]17#include "CodePatterns/Assert.hpp"
[7c7c4a]18#include "CodePatterns/ObservedValue.hpp"
19#include "CodePatterns/Observer/Observable.hpp"
20
[ab628c]21#include <algorithm>
[026bef]22#include <string>
23
24#include <boost/bind.hpp>
25#include <boost/function.hpp>
26
[7c7c4a]27/** We derive from ObservedValue in order to tell owning instance about
28 * subjectKilled() having been called.
29 */
[026bef]30template <class T, class id=T>
[7c7c4a]31class ObservedValue_wCallback : public ObservedValue<T>
32{
33public:
34 ObservedValue_wCallback(
35 const Observable * const _owner,
36 const boost::function<T()> &_recalcMethod,
37 const std::string &_name,
38 const T &_initialvalue,
39 const Observable::channels_t &_channels,
[026bef]40 const boost::function<void(const id)> &_callback,
41 const boost::function<const id()> &_getId) :
42 ObservedValue<T>(_owner, _recalcMethod, _name, _initialvalue, _channels),
[ab628c]43 signedOnChannels(std::max((size_t)1,_channels.size())),
[026bef]44 callback(_callback),
45 getId(_getId)
46 {}
47 virtual ~ObservedValue_wCallback()
48 {}
49
50protected:
51 virtual void subjectKilled(Observable *publisher)
52 {
53 ObservedValue<T>::subjectKilled(publisher);
[ab628c]54 ASSERT(signedOnChannels > 0,
55 "ObservedValue_wCallback::subjectKilled() - signedOnChannels is already zero.");
56 if ((--signedOnChannels) == 0)
57 callback(getId());
[026bef]58 }
59
60private:
[ab628c]61 //!> if we are signOn() to multiple channels, count down before callback
62 size_t signedOnChannels;
[026bef]63 //!> callback function to tell other entity about subjectKilled
64 const boost::function<void(const id)> callback;
65 const boost::function<const id()> getId;
66};
67
68/** Specialization of ObservedValue_wCallback for the index ObservedValue.
69 *
70 * The index serves as the unique identifier for the object instance whose
71 * properties are monitored in ObservedValue. Hence, how to give a subjectKilled()
72 * with an external getId() function? For the index the ObservedValue::get() is
73 * the getId() we need to call! Hence, we may simply connect these internally
74 * in this partial template specialization.
75 *
76 * Because atomicNumber_t, atomId_t and moleculeId_t are not unique types but
77 * -- at the writing of this class -- just typedefs, we have to resort to the
78 * trick with two constructors, one taking an external getId(), the other
79 * routing the getId() internally by binding to ObservedValue<T>::get().
80 */
81template <class T>
82class ObservedValue_wCallback<T,T> : public ObservedValue<T>
83{
84public:
85 ObservedValue_wCallback(
86 const Observable * const _owner,
87 const boost::function<T()> &_recalcMethod,
88 const std::string &_name,
89 const T &_initialvalue,
90 const Observable::channels_t &_channels,
91 const boost::function<void(const T)> &_callback,
92 const boost::function<const T()> &_getId) :
93 ObservedValue<T>(_owner, _recalcMethod, _name, _initialvalue, _channels),
[ab628c]94 signedOnChannels(std::max((size_t)1,_channels.size())),
[026bef]95 callback(_callback),
96 getId(_getId)
97 {}
98 ObservedValue_wCallback(
99 const Observable * const _owner,
100 const boost::function<T()> &_recalcMethod,
101 const std::string &_name,
102 const T &_initialvalue,
103 const Observable::channels_t &_channels,
104 const boost::function<void(const T)> &_callback) :
[7c7c4a]105 ObservedValue<T>(_owner, _recalcMethod, _name, _initialvalue, _channels),
[ab628c]106 signedOnChannels(std::max((size_t)1,_channels.size())),
[026bef]107 callback(_callback),
108 getId(boost::bind(&ObservedValue<T>::get, this))
[7c7c4a]109 {}
110 virtual ~ObservedValue_wCallback()
111 {}
112
113protected:
114 virtual void subjectKilled(Observable *publisher)
115 {
116 ObservedValue<T>::subjectKilled(publisher);
[ab628c]117 ASSERT(signedOnChannels > 0,
118 "ObservedValue_wCallback::subjectKilled() - signedOnChannels is already zero.");
119 if ((--signedOnChannels) == 0)
120 callback(getId());
[7c7c4a]121 }
122
123private:
[ab628c]124 //!> if we are signOn() to multiple channels, count down before callback
125 size_t signedOnChannels;
[7c7c4a]126 //!> callback function to tell other entity about subjectKilled
[026bef]127 const boost::function<void(const T)> callback;
128 const boost::function<const T()> getId;
[7c7c4a]129};
130
131#endif /* OBSERVEDVALUE_WCALLBACK_HPP_ */
Note: See TracBrowser for help on using the repository browser.