Difference between revisions of "Studio:Scl brew class"

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

Revision as of 18:03, 1 October 2008

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//