/**********************************************************************
This file is part of Crack dot Com's free source code release of
Golgotha.
for
information about compiling & licensing issues visit this URL
If that doesn't help, contact Jonathan Clark at
golgotha_source@usa.net (Subject should have "GOLG" in it)
***********************************************************************/
#ifndef LI_OBJREF_HH
#define LI_OBJREF_HH
#include "lisp/li_types.hh"
#include "global_id.hh"
#include "lisp/li_class.hh"
class g1_object_class;
class g1_draw_context_class;
extern li_type_number li_g1_ref_type_number;
class li_g1_ref : public li_object
{
friend class li_g1_ref_function;
w32 _global_id;
public:
li_g1_ref(w32 global_id)
: li_object(li_g1_ref_type_number)
{
_global_id=global_id;
}
li_g1_ref(g1_object_class *o);
w32 id() { return _global_id; }
g1_object_class *value()
{
if (g1_global_id.check_id(_global_id))
return g1_global_id.get(_global_id);
else
return 0;
}
static li_g1_ref *get(li_object *o, li_environment *env)
{
check_type(o, li_g1_ref_type_number, env);
return ((li_g1_ref *)o);
}
void draw(g1_object_class *start, w32 color, g1_draw_context_class *context);
} ;
li_g1_ref *li_g1_null_ref();
// this li_object stores a list of references to g1_object
// the storage is an array of w32, the first being how many are in list
// the rest are actual references
extern li_type_number li_g1_ref_list_type_number;
class li_g1_ref_list : public li_object
{
friend class li_g1_ref_list_function;
w32 *list;
void free();
public:
li_g1_ref_list *clone();
li_g1_ref_list()
: li_object(li_g1_ref_list_type_number)
{
list=0;
}
int size() { if (!list) return 0; else return list[0]; }
w32 get_id(int list_num);
g1_object_class *value(int list_num);
void add(w32 id);
void add(g1_object_class *obj);
void remove(w32 id);
void remove(g1_object_class *o);
// gets rid of invalid object id's that might be in the list
void compact();
int find(w32 id); // return -1 if not found in list, else returns position
int find(g1_object_class *o); // return -1 if not found in list, else returns position
static li_g1_ref_list *get(li_object *o, li_environment *env)
{
check_type(o, li_g1_ref_list_type_number, env);
return ((li_g1_ref_list *)o);
}
void draw(g1_object_class *start, w32 color, g1_draw_context_class *context);
} ;
struct li_g1_ref_class_member : public li_class_member
{
li_g1_ref_class_member(char *name) : li_class_member(name) {}
li_g1_ref *operator()() { return li_g1_ref::get(li_this->get(*this),0); }
};
struct li_g1_ref_list_class_member : public li_class_member
{
li_g1_ref_list_class_member(char *name) : li_class_member(name) {}
li_g1_ref_list *operator()() { return li_g1_ref_list::get(li_this->get(*this),0); }
};
#endif