Ignore:
Timestamp:
Feb 12, 2016, 11:15:06 PM (9 years ago)
Author:
Frederik Heber <heber@…>
Branches:
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
Children:
15c8a9
Parents:
099f67
git-author:
Frederik Heber <heber@…> (01/25/16 11:01:10)
git-committer:
Frederik Heber <heber@…> (02/12/16 23:15:06)
Message:

Changed GLMoleculeObject_...:countSubjectKilled() to taking id parameter.

  • this is a precursor for when the ObservedValues reside with QtInstanceInformationBoard.
  • enhanced ObservedValue_wCallback to take a bound getIndex function().
  • additionally, we route internally to ObservedValue::get() and this gets us out of the painful situation where we need to supply an index getter to the ObservedValue that monitors the index (and hence must be present already to bind to its get function).
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/UIElements/Views/Qt4/Qt3D/ObservedValue_wCallback.hpp

    r099f67 r026bef  
    1818#include "CodePatterns/Observer/Observable.hpp"
    1919
     20#include <string>
     21
     22#include <boost/bind.hpp>
     23#include <boost/function.hpp>
     24
    2025/** We derive from ObservedValue in order to tell owning instance about
    2126 * subjectKilled() having been called.
    2227 */
    23 template <class T>
     28template <class T, class id=T>
    2429class ObservedValue_wCallback : public ObservedValue<T>
    2530{
     
    3136      const T &_initialvalue,
    3237      const Observable::channels_t &_channels,
    33       const boost::function<void()> &_callback) :
     38      const boost::function<void(const id)> &_callback,
     39      const boost::function<const id()> &_getId) :
    3440        ObservedValue<T>(_owner, _recalcMethod, _name, _initialvalue, _channels),
    35         callback(_callback)
     41        callback(_callback),
     42        getId(_getId)
    3643  {}
    3744  virtual ~ObservedValue_wCallback()
     
    4249  {
    4350    ObservedValue<T>::subjectKilled(publisher);
    44     callback();
     51    callback(getId());
    4552  }
    4653
    4754private:
    4855  //!> callback function to tell other entity about subjectKilled
    49   const boost::function<void()> callback;
     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;
    50114};
    51115
Note: See TracChangeset for help on using the changeset viewer.