Studio:Scl brew class

From STRIDE Wiki
Revision as of 21:03, 21 August 2008 by Stevel (talk | contribs)
Jump to navigation Jump to search

The scl_brew_class pragma

The scl_brew_class pragma is for Brew API developers who simulate C++ classes and virtual functions within ANSI C by following a fixed set of conventions. The conventions are used to create classes referred to as "Brew Classes." A Brew class is formed from a C structure type that is used to represent the C++ virtual function table. The structure must contain members which are of the type pointer to function. Furthermore, these members must point to a function type whose first parameter is a pointer to this same structure type.

The C-based class must adhere to the following rules:

  • The class is structured using a C structure typedef
  • Function pointers are used to define the class methods
  • Each class method is required to have a parameter, which is used to pass in a reference to the object upon which the method will act
  • There must be at least one SCL-compliant function that references the class typedef.

Syntax

#pragma scl_brew_class(structure-name)
#pragma scl_brew_class(structure-name, field-name 1 .. n)
Parameters Type Description
structure-name Type Name of the structure that defines the C-based class
field-name 1 .. n Member Name of the field that defines one or more methods

Notes

The method names are automatically generated based on the class name and field name as follows:

 <class-name>_<field-name>

For additional information on scl_brew_class, including constraints, refer to the section on scl_brew_class in the [STRIDE SCL Reference Guide].

Example

   // Const defining a maximum string length //
   #define MAX_STR_SIZE 64
   // Structure type used to define a C-based class. Each //
   // method is defined as a pointer to a function whose  //
   // first parameter is a pointer to the structure type. //
   typedef struct _myObj MyObj;
   struct _myObj
   {
       int   ( *method1 )(MyObj * t, int x, int y);
       void  ( *method2 )(MyObj * t, char * str);
       char* ( *method3 )(MyObj * t);
   };
   // createMyObj - Interface used to instantiate the C-based object.     //
   // *ppObj will be declared as opaque to obtain the object's address.   //
   // The object's address can then be passed in as the first             //
   // parameter for each of the method calls.                             //
   void createMyObj (MyObj ** ppObj);
   static  MyObj * bindMyObj(void * pObj)
   {
       return (MyObj *) pObj;
   };
   #ifdef _SCL
   // Use the scl_function pragma to associate an object with the        //
   // interface.                                                         //
   // Use the scl_ptr pragma to define the parameter ppObj as an OUT     //
   // pointer.                                                           //
   // Use the scl_ptr_opaque pragma to opaque the child pointer to the   //
   // object.                                                            //
   #pragma scl_function(createMyObj)
   #pragma scl_ptr(createMyObj, ppObj, OUT, PRIVATE)
   #pragma scl_ptr_opaque(createMyObj, *ppObj)
   // Use the scl_function pragma to associate an object with the interface //
   #pragma scl_function(bindMyObj)
   #pragma scl_brew_class(MyObj)
   // Use the scl_string pragma to declare the char pointers as ASCII strings. //
   // The method names are derived from <class-name>, <field-name>              //
   #pragma scl_string(MyObj_method2, str, MAX_STR_SIZE)
   #pragma scl_string(MyObj_method3(), MAX_STR_SIZE)
   #endif //_SCL//