Basic Class

We will introduce the concept of a basic class through an example:

#include <diablosupport_class.h>
#ifndef CLASS
#define CLASS ins
#define ins_field_select_prefix INS
#define ins_function_prefix Ins

We define a new class ins. This will result in a new type t_ins. The ins_field_select_prefix will be used in the getters and setters. The ins_function_prefix will be used in functions.

DIABLO_CLASS_BEGIN
EXTENDS(t_relocatable)

The class ins is an extension of the class relocatable. As such, it will inherit the getters, setters and non-private functions of the class relocatable. We will come back to this later.

MEMBER(t_cfg *, cfg, CFG)

A core members (as opposed to a dynamic member for a managed class) is defined using the MEMBER mechanism. This will create a member of the type t_cfg. The second and third argument indicate the name of the member in lowercase and uppercase. This mechanism will automatically generate a getter and setter, in this example: t_cfg * INS_CFG(t_ins * ins) and void INS_SET_CFG(t_ins * ins, t_cfg * cfg)

FUNCTION1(void, Kill, t_CLASS *){Free(ins);}

This mechanism will create the function with signature void InsKill(t_ins *){Free(ins);}.
This function can be inherited if other classes are extended from this class. To this end, t_CLASS is used instead of t_ins. Similarly, functions with multiple arguments can be defined by using FUNCTION2(), FUNCTION3(), ...

PFUNCTION1(void, Print, t_CLASS *){VERBOSE((0,"@I",ins));}

A PFUNCTION differs from a FUNCTION in that it can not be inherited (it is Private).

DIABLO_CLASS_END
#undef BASECLASS
#define BASECLASS relocatable
#include 
#undef BASECLASS

To enable the inheritance mechanism, the definition of the base class needs to be included. The getters, setters and non-private functions of the base class will be inherited. If the base class contains the following definition of a member:

MEMBER(t_address, caddress, CADDRESS);

then this will have o.a. resulted in the getter t_address RELOCATABLE_CADDRESS(t_relocatable * rel). This will be inherited by the class ins and thus the getter t_address INS_CADDRESS(t_ins * ins) will be available. The same applies to setters and non-private functions.

later