#ifndef __INC_POS_PEXEC_CLASS_H
#define __INC_POS_PEXEC_CLASS_H
/*******************************************************************
 Includes Release 24
 (C) Copyright 1995-1997 proDAD
     All Rights Reserved

 $AUT Holger Burkarth
 $DAT >>Class.h<<   24 Mar 1997    10:17:46 - (C) ProDAD
*******************************************************************/
#ifndef __INC_POS_PEXEC_LIST_H
#include <pExec/List.h>
#endif
 #ifndef __INC_POS_PEXEC_EXECBASE_H
 #include <pExec/ExecBase.h>
 #endif


/*----------------------------------
-----------------------------------*/
struct pOS_Method
{
  ULONG  mth_ID;
};


/*----------------------------------
-----------------------------------*/
struct pOS_Class
{
  ULONG (*cl_Dispatcher)(_R_LB struct pOS_ExecBase*,_R_A0 const struct pOS_Class*,_R_A1 APTR,_R_A2 struct pOS_Method*);
  size_t      cl_ObjSize;       /* without sizeof(pOS_Object) */
  size_t      cl_ObjOffset;
  UWORD       cl_ClassNr;
  UWORD       cl_Pad;           /* damit sizeof==16 wird */
};




/*----------------------------------
-----------------------------------*/
struct pOS_Member
{
  struct pOS_NClass *mb_NClass;
  size_t             mb_MembOffset;
};




/*----------------------------------
-----------------------------------*/
struct pOS_NClass
{
  struct pOS_ExNode        ncl_Node;        /* Public-Class => ln_Name for ClassName */
  UWORD                    ncl_OpenCnt;
  UWORD                    ncl_Version;
  size_t                   ncl_SumSize;     /* with sizeof(pOS_Object) */
  ULONG                    ncl_UserData;    /* for the User own use */
  struct pOS_Library      *ncl_Library;     /* ~NULL, wurde nachgeladen */
  size_t                   ncl_NASize;      /* beinhaltet die dynamische Länge von pOS_NClass */
                                          /* Null => wurde nicht dyn. erzeugt */
  const struct pOS_NClass *ncl_SupClass;    /* ~NULL => SuperClass */

  UBYTE  ncl_Reserved[18];

  UWORD                    ncl_MembCnt;   /* Anzahl der Member-Objekte */
  UWORD                    ncl_ClassCnt;  /* Anzahl der Klassen */
  struct pOS_Class         ncl_Class[1];

/*\
*** pOS_Class  x[ncl_ClassCnt-1]
*** pOS_Member y[ncl_MembCnt]
\*/
};


/*----------------------------------
-----------------------------------*/
struct pOS_Object
{
  struct pOS_NClass *obj_Class;
};









struct pOS_NClass* pOS_GETNCLASS(APTR);

#define pOS_GETNCLASS(obj) \
  ( (((struct pOS_Object*)(obj))-1)->obj_Class  )


/* Error from Dispatcher */
#define pOS_CLASSERR  (~0l)

#endif
