* Interface Taxonomy: * Group I: * Port *, Component *, Services *. * Group II: * ComponentID, ConnectionID, TypeMap, ConnectionEvent, * ComponentClassDescription. * Group III: * Exception class and derivatives. * * * Group I characteristics: * * These are the several fundamental interfaces which must (and can) * remain purely virtual (no standard ref-counting base object in c++) * so that any framework or component can implement them cleanly * and mutually compatibly. These are handled as pointers to interfaces * and have a well-delimited lifecycle within the component framework * definition (add/remove, get/release, create/destroy, and * setServices(p)/setServices(null)). All known c++ ref-counting schemes * place to great a burden (startup cost) on scientific programmers. * Maintaining these interfaces as pure virtual interfaces allows the natural idiom * of C++ interfaces (dynamic_cast) to be applied. It also allows them * to be passed through babel components as opaque items without * the gymnastics that passing a boost::shared_ptr through babel does. * All specific ports derive from Port, thus everything above applies * to all component ports. * * * Group II characteristics: * * These are objects which pass through several Ports or interfaces, * though all are ultimately created by the framework. Components * might choose to hold onto one of these, so a shared-pointer/ref-count * mechanism is necessary. Boost provides such a mechanism. * The raw, still pure virtual interfaces in this group are named * YYY_Interface and the component writer simply references * YYY_ptr as objects, since YYY is from * typedef ::boost::shared_ptr< YYY_Interface > YYY_ptr;. * * * Group III characteristics: * * The typical C++ pattern for exceptions is to throw an * object that is on the stack and catch it as a reference * to the object. E.g. 'throw Exception("message");' when an error * occurs and at a higher scope 'try {...} catch (Exception &e) { ... }'. * As such, we must all agree to use a common, simple exception * such as the one fully implemented in this header and derived * from ::std::exception and the CCAException specification of cca.sidl. *