#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
[Back to Amiga Developer Docs]