Listing 3: CABLE configuration file

// countertcl_config.cxx
// CABLE input file to build CounterTcl package.

// Define Counter class in-line in the configuration file.
template <typename T>
class Counter
{
public:
  Counter(): value(0) {}
  T Get() const { return value; }
  void Set(T v) { value = v; }
  void Reset() { value = 0; }
  void Increment() { ++value; }
private:
  T value;
};

// The symbol "CABLE_CONFIGURATION" is defined only when CABLE is
// reading this file.  Place the CABLE-specific code inside this
// section so it cannot be seen by the compiler.
#ifdef CABLE_CONFIGURATION
namespace _cable_
{
  // Specify package name.  Group configuration allows multiple
  // configuration files to define wrappers for a single package.
  const char* const group="CounterTcl1";
  const char* const package="CounterTcl";
  const char* const groups[]={"CounterTcl1"};
  namespace wrappers
  {
    // Tell CABLE what instantiations to wrap, and what the class
    // wrappers should be called.
    typedef Counter<int> Counter_int;
    typedef Counter<float> Counter_float;
  }
}

// Make sure the Counter instantiations are complete types so that all
// the methods are available.
void _cable_instantiate()
{
  sizeof(_cable_::wrappers::Counter_int);
  sizeof(_cable_::wrappers::Counter_float);
}
#endif