[Contents] [Index] [Help] [Retrace] [Browse <] [Browse >]

#ifndef INTUITION_CLASSES_H
#define INTUITION_CLASSES_H
/*
**  $VER: classes.h 40.0 (15.2.1994)
**  Includes Release 44.1
**
**  Used only by class implementors
**
**  (C) Copyright 1989-1999 Amiga, Inc.
**          All Rights Reserved
*/

/*****************************************************************************/

#ifndef EXEC_TYPES_H
#include <exec/types.h>
#endif

#ifndef EXEC_LIBRARIES_H
#include <exec/libraries.h>
#endif

#ifndef UTILITY_HOOKS_H
#include <utility/hooks.h>
#endif

#ifndef INTUITION_CLASSUSR_H
#include <intuition/classusr.h>
#endif

/*****************************************************************************/
/***************** "White Box" access to struct IClass ***********************/
/*****************************************************************************/

/* This structure is READ-ONLY, and allocated only by Intuition */
typedef struct IClass
{
    struct Hook          cl_Dispatcher;         /* Class dispatcher */
    ULONG                cl_Reserved;           /* Must be 0  */
    struct IClass       *cl_Super;              /* Pointer to superclass */
    ClassID              cl_ID;                 /* Class ID */

    UWORD                cl_InstOffset;         /* Offset of instance data */
    UWORD                cl_InstSize;           /* Size of instance data */

    ULONG                cl_UserData;           /* Class global data */
    ULONG                cl_SubclassCount;      /* Number of subclasses */
    ULONG                cl_ObjectCount;        /* Number of objects */
    ULONG                cl_Flags;

} Class;

#define CLF_INLIST      0x00000001L
    /* class is in public class list */

/*****************************************************************************/

/* add offset for instance data to an object handle */
#define INST_DATA(cl,o)         ((void *)(((UBYTE *)o)+cl->cl_InstOffset))

/*****************************************************************************/

/* sizeof the instance data for a given class */
#define SIZEOF_INSTANCE(cl)     ((cl)->cl_InstOffset + (cl)->cl_InstSize \
                        + sizeof (struct _Object))

/*****************************************************************************/
/***************** "White box" access to struct _Object **********************/
/*****************************************************************************/

/* We have this, the instance data of the root class, PRECEDING the "object".
 * This is so that Gadget objects are Gadget pointers, and so on.  If this
 * structure grows, it will always have o_Class at the end, so the macro
 * OCLASS(o) will always have the same offset back from the pointer returned
 * from NewObject().
 *
 * This data structure is subject to change.  Do not use the o_Node embedded
 * structure. */
struct _Object
{
    struct MinNode       o_Node;
    struct IClass       *o_Class;

};

/*****************************************************************************/

/* convenient typecast  */
#define _OBJ(o)                 ((struct _Object *)(o))

/* get "public" handle on baseclass instance from real beginning of obj data */
#define BASEOBJECT(_obj)        ((Object *)(_OBJ(_obj)+1))

/* get back to object data struct from public handle */
#define _OBJECT(o)              (_OBJ(o) - 1)

/* get class pointer from an object handle      */
#define OCLASS(o)               ((_OBJECT(o))->o_Class)

/*****************************************************************************/

/* BOOPSI class libraries should use this structure as the base for their
 * library data.  This allows developers to obtain the class pointer for
 * performing object-less inquiries. */
struct ClassLibrary
{
    struct Library       cl_Lib;        /* Embedded library */
    UWORD                cl_Pad;        /* Align the structure */
    Class               *cl_Class;      /* Class pointer */

};

/*****************************************************************************/

#endif