Homepage Demos Overview Downloads Tutorials Reference
Credits

MMAccessor< MC_t > Class Template Reference

#include <MMAccessor.h>

List of all members.


Detailed Description

template<class MC_t>
class MMAccessor< MC_t >

This class allows convenient ways of accessing a motion command.

Since MotionCommands must be checked out of the motion manager and then checked back in when they are done, this is a common source of errors, leading to deadlock. This class will check the motion out when it's created, and check it back in when it goes out of scope
It supports recursive checkin/checkouts.
Uses global motman

So, instead of doing things like this:

  YourMotionCommand* ymc = dynamic_cast<YourMotionCommand*>(motman->checkoutMotion(your_mc_id));
  //do 'stuff' with ymc, e.g.: ymc->rollOver();
  motman->checkinMotion(your_mc_id);
...which can be error prone in many regards - if 'stuff' returns without checking in, or you forget to check in, or you get lazy and leave it checked out longer than you should, which can cause general performance issues (or worse, deadlock) Using MMAccessor makes it much easier to solve these problems, and is easier to code:
  MMAccessor<YourMotionCommand> mma(your_mc_id);
  //do 'stuff' with mma, e.g.: mma->rollOver();
We can call a return at any point and the motion command will automatically be checked in, and since C++ guarrantees that the destructor of mma will be called, we don't have to worry about forgetting about it. We can limit the scope by placing {}'s around the segment in question:
  //pre-stuff
  {
    MMAccessor<YourMotionCommand> mma(your_mc_id);
    //do 'stuff' with mma, e.g.: mma->rollOver();
  }
  //post-stuff - has no knowledge of mma, out of its scope
And, for those astute enough to notice that the theoretical rollOver() function is called on MMAccessor when it's actually a member of YourMotionCommand, this is because MMAccessor behaves as a 'smart pointer', which overloads operator->() so it is fairly transparent to use.

See also the templated checkin(Ret_t ret) function for more examples of streamlined usage.

MMAccessor is a small class, you may consider passing it around instead of a MotionManager::MC_ID if appropriate. (Would be appropriate to avoid multiple checkin/outs in a row from different functions, but not as appropriate for storage and reuse of the same MMAccessor.

Definition at line 49 of file MMAccessor.h.

Public Member Functions

 MMAccessor (MotionManager::MC_ID id, bool ckout=true)
 constructor, checks out by default

 MMAccessor (MotionCommand *ptr)
 constructor, allows objects to provide uniform access to MotionCommands, regardless of whether they are currently in the MotionManager

 MMAccessor (const MMAccessor &a)
 copy constructor - will reference the same mc_id - checkin/checkouts are independent between this and a; however, if a is checkout out, this will check itself out as well

 ~MMAccessor ()
 destructor, checks in if needed

MMAccessor< MC_t > operator= (const MMAccessor< MC_t > &a)
 allows assignment of MMAccessor's, similar to the copy constructor - the two MMAccessor's will control the same MotionCommand

MC_t * checkout ()
 So you can check out if not done by default (or you checked in already).

MC_t * mc () const
 Returns the motion command's address so you can call functions.

void checkin ()
 Checks in the motion.

template<class Ret_t> Ret_t checkin (Ret_t ret)
 Checks in the motion, passing through the value it is passed.

MC_t * operator-> ()
 smart pointer to the underlying MotionCommand

const MC_t * operator-> () const
 smart pointer to the underlying MotionCommand

MC_t & operator * ()
 smart pointer to the underlying MotionCommand

const MC_t & operator * () const
 smart pointer to the underlying MotionCommand

MC_t & operator[] (int i)
 smart pointer to the underlying MotionCommand

const MC_t & operator[] (int i) const
 smart pointer to the underlying MotionCommand


Protected Attributes

MotionManager::MC_ID mc_id
 the MC_ID that this Accessor was constructed with

unsigned int checkOutCnt
 counter so we know how many times checkout was called

MC_t * mcptr
 a pointer to the motion command, should always be valid even when not checked out so you can access member fields (which is reasonably safe)


Constructor & Destructor Documentation

template<class MC_t>
MMAccessor< MC_t >::MMAccessor MotionManager::MC_ID  id,
bool  ckout = true
[inline]
 

constructor, checks out by default

Parameters:
id the motion command to check out
ckout if true (default) will checkout upon creation. otherwise it just gets current address (so you can peek at member fields, which should be safe)

Definition at line 55 of file MMAccessor.h.

template<class MC_t>
MMAccessor< MC_t >::MMAccessor MotionCommand ptr  )  [inline]
 

constructor, allows objects to provide uniform access to MotionCommands, regardless of whether they are currently in the MotionManager

Definition at line 63 of file MMAccessor.h.

template<class MC_t>
MMAccessor< MC_t >::MMAccessor const MMAccessor< MC_t > &  a  )  [inline]
 

copy constructor - will reference the same mc_id - checkin/checkouts are independent between this and a; however, if a is checkout out, this will check itself out as well

Definition at line 66 of file MMAccessor.h.

template<class MC_t>
MMAccessor< MC_t >::~MMAccessor  )  [inline]
 

destructor, checks in if needed

Definition at line 72 of file MMAccessor.h.


Member Function Documentation

template<class MC_t>
template<class Ret_t>
Ret_t MMAccessor< MC_t >::checkin Ret_t  ret  )  [inline]
 

Checks in the motion, passing through the value it is passed.

Returns:
the same value it's passed
Useful in situations like this:
  MMAccessor<myMC> mine(myMC_id);
  if(mine.mc()->foo())
    //do something with motman here
But we want to check in mine ASAP - if we don't reference it anywhere in the if statement, we're leaving the MC locked longer than we need to. How about instead doing this:
  bool cond;
  {MMAccessor<myMC> mine(myMC_id); cond=mine.mc()->foo();}
  if(cond)
    //do something with motman here
But that uses an extra variable... ewwww... so use this function as a pass through to checkin the MC:
  MMAccessor<myMC> mine(myMC_id);
  if(mine.checkin(mine.mc()->foo()))
    //do something with motman here

Definition at line 133 of file MMAccessor.h.

template<class MC_t>
void MMAccessor< MC_t >::checkin  )  [inline]
 

Checks in the motion.

Don't forget, you can also just limit the scope using extra { }'s

Definition at line 99 of file MMAccessor.h.

Referenced by MMAccessor< MC_t >::checkin(), EStopControllerBehavior::runCommand(), and MMAccessor< MC_t >::~MMAccessor().

template<class MC_t>
MC_t* MMAccessor< MC_t >::checkout  )  [inline]
 

So you can check out if not done by default (or you checked in already).

Definition at line 87 of file MMAccessor.h.

Referenced by MMAccessor< MC_t >::MMAccessor(), and MMAccessor< MC_t >::operator=().

template<class MC_t>
MC_t* MMAccessor< MC_t >::mc  )  const [inline]
 

Returns the motion command's address so you can call functions.

Definition at line 95 of file MMAccessor.h.

Referenced by BehaviorSwitchActivatorControl::activate(), ControlBase::deactivate(), ControlBase::doReadStdIn(), ControlBase::doSelect(), MMAccessor< MC_t >::operator *(), MMAccessor< MC_t >::operator->(), MMAccessor< MC_t >::operator[](), FollowHeadBehavior::processEvent(), and ControlBase::refresh().

template<class MC_t>
const MC_t& MMAccessor< MC_t >::operator *  )  const [inline]
 

smart pointer to the underlying MotionCommand

Definition at line 141 of file MMAccessor.h.

template<class MC_t>
MC_t& MMAccessor< MC_t >::operator *  )  [inline]
 

smart pointer to the underlying MotionCommand

Definition at line 140 of file MMAccessor.h.

template<class MC_t>
const MC_t* MMAccessor< MC_t >::operator->  )  const [inline]
 

smart pointer to the underlying MotionCommand

Definition at line 139 of file MMAccessor.h.

template<class MC_t>
MC_t* MMAccessor< MC_t >::operator->  )  [inline]
 

smart pointer to the underlying MotionCommand

Definition at line 138 of file MMAccessor.h.

template<class MC_t>
MMAccessor<MC_t> MMAccessor< MC_t >::operator= const MMAccessor< MC_t > &  a  )  [inline]
 

allows assignment of MMAccessor's, similar to the copy constructor - the two MMAccessor's will control the same MotionCommand

Definition at line 78 of file MMAccessor.h.

template<class MC_t>
const MC_t& MMAccessor< MC_t >::operator[] int  i  )  const [inline]
 

smart pointer to the underlying MotionCommand

Definition at line 143 of file MMAccessor.h.

template<class MC_t>
MC_t& MMAccessor< MC_t >::operator[] int  i  )  [inline]
 

smart pointer to the underlying MotionCommand

Definition at line 142 of file MMAccessor.h.


Member Data Documentation

template<class MC_t>
unsigned int MMAccessor< MC_t >::checkOutCnt [protected]
 

counter so we know how many times checkout was called

Definition at line 147 of file MMAccessor.h.

Referenced by MMAccessor< MC_t >::checkin(), MMAccessor< MC_t >::checkout(), MMAccessor< MC_t >::MMAccessor(), and MMAccessor< MC_t >::~MMAccessor().

template<class MC_t>
MotionManager::MC_ID MMAccessor< MC_t >::mc_id [protected]
 

the MC_ID that this Accessor was constructed with

Definition at line 146 of file MMAccessor.h.

Referenced by MMAccessor< MC_t >::checkin(), MMAccessor< MC_t >::checkout(), MMAccessor< MC_t >::MMAccessor(), and MMAccessor< MC_t >::operator=().

template<class MC_t>
MC_t* MMAccessor< MC_t >::mcptr [protected]
 

a pointer to the motion command, should always be valid even when not checked out so you can access member fields (which is reasonably safe)

Definition at line 148 of file MMAccessor.h.

Referenced by MMAccessor< MC_t >::checkin(), MMAccessor< MC_t >::checkout(), MMAccessor< MC_t >::mc(), MMAccessor< MC_t >::MMAccessor(), and MMAccessor< MC_t >::operator=().


The documentation for this class was generated from the following file:

Tekkotsu v2.1
Generated Tue Mar 16 23:22:16 2004 by Doxygen 1.3.5