#ifndef OBJECT_H
#define OBJECT_H

/** **********************************************************************
** Module:  Object \file object.h
** Description: This module implements the Object abstraction.
** Constants:
**  OBJECT_NULL - the null class
**
************************************************************************/

/*
 * This software was developed by U.S. Government employees as part of
 * their official duties and is not subject to copyright.
 *
 * $Log: object.h,v $
 * Revision 1.9  1997/01/21 19:17:11  dar
 * made C++ compatible
 *
 * Revision 1.8  1995/05/17  14:27:40  libes
 * Exported UNK_get_symbol.
 *
 * Revision 1.7  1993/10/15  18:49:23  libes
 * CADDETC certified
 *
 * Revision 1.6  1993/01/19  22:17:27  libes
 * *** empty log message ***
 *
 * Revision 1.5  1992/08/18  17:15:40  libes
 * rm'd extraneous error messages
 *
 * Revision 1.4  1992/06/08  18:07:35  libes
 * prettied up interface to print_objects_when_running
 *
 * Revision 1.3  1992/05/31  23:33:15  libes
 * implemented ALIAS resolution
 *
 * Revision 1.2  1992/05/31  08:36:48  libes
 * multiple files
 *
 * Revision 1.1  1992/05/28  03:56:02  libes
 * Initial revision
 */

/*************/
/* constants */
/*************/

/** each object has an index - current the index is a mnemonic character
 * hence the array is rather sparse, but the extra slop is only a hundred
 * or so bytes, so it's nothing to sweat about */
#define MAX_OBJECT_TYPES    127 /* really could be a LOT less */

/*****************/
/* packages used */
/*****************/

#include <scl_export.h>
#include "basic.h"  /* get basic definitions */
#include "symbol.h"

/************/
/* typedefs */
/************/

/***************************/
/* hidden type definitions */
/***************************/

struct Object {
    struct Symbol_ * ( *get_symbol )();
    char * type; /**< should complete the phrase "X is ..." - i.e., "an entity", "a type", "of unknown type" */
    int bits;   /**< a bitwise selector of a type, i.e. OBJ_XX_BITS */
};

/****************/
/* modules used */
/****************/

/********************/
/* global variables */
/********************/

#ifdef OBJECT_C
#include "defstart.h"
#else
#include "decstart.h"
#endif /*OBJECT_C */

GLOBAL SCL_EXPRESS_EXPORT struct Object * OBJ;

#include "de_end.h"

/******************************/
/* macro function definitions */
/******************************/

#define OBJget_symbol(obj,type)     (*OBJ[(int)type].get_symbol)(obj)
#define OBJget_type(_type_)     (OBJ[(int)_type_].type)
#define OBJget_bits(_type_)     (OBJ[(int)_type_].bits)
#define OBJtype_is_oneof(_type_,class)  (OBJ[(int)_type_].bits & (class))
#define OBJget_name(obj,type)       (OBJget_symbol(obj,type)->name)

/* removed #define statements for obsolete fn macros OBJequal OBJfree OBJreference OBJget_data */

/***********************/
/* function prototypes */
/***********************/

extern SCL_EXPRESS_EXPORT void OBJinitialize PROTO( ( void ) );
extern SCL_EXPRESS_EXPORT void OBJcreate PROTO( ( char, struct Symbol_ * ( * )( Generic ), char *, int ) );
extern SCL_EXPRESS_EXPORT Symbol * UNK_get_symbol PROTO( ( Generic x ) );

#endif /*OBJECT_H*/
