#ifndef macros_CCA_H
#define macros_CCA_H

// provide a port
#define PROVIDE(p,name,type) \
  frameworkServices->addProvidesPort(p,frameworkServices->createPortInfo(name,type,0))

// remove a port
#define UNPROVIDE(name) \
  frameworkServices->removeProvidesPort(name)

// define a port to be used.
#define REGISTER(name,classname,props)\
  frameworkServices->registerUsesPort(frameworkServices->createPortInfo(name, classname, props))

// release/undefine a port that used to be used and set our pointer to it,
// if any, to 0.
#define UNREGISTER(p,name) \
  if ((p) != 0) { \
    frameworkServices->releasePort(name); \
    p = 0; \
  } \
  frameworkServices->unregisterUsesPort(name)

// release a port if not null
#define RELEASE(p,name) \
  if (p != 0) { \
    frameworkServices->releasePort(name); \
  } \
  p = 0

// get a port 
#define GETPORT(p, ptr, name, ctype) \
  p = frameworkServices->getPort(name); \
  if (p == 0) { return -1; }  \
  (ptr) = dynamic_cast< ctype * >(p); \
  if ((ptr) == 0) { cout << "\n!! Connected to something other than a(n) " \
     << #ctype << " port!!" << endl; return -1 ; } \
  (p) = 0

#endif // macros_CCA_H