#ifndef OBJECT_H
#define OBJECT_H 1
#pragma interface

#include "Structures.h"
#include "command.h"

/************************************************************************
************ Object:  the big deal ... one object.  *********************
************************************************************************/

#define MAXPARENTS 20   /** basically, nothing should have more, but */
                        /** if they do, this will cope.              */
#define NOPARENTS -1

class intlist{
  friend class Object;
  friend class Object_Store;
  friend class Frame;
protected:
  int allocated;
  int size;             
  int *list;
  void grow(int by = MAXPARENTS);
public:
  intlist(char** inbuff_ptr, int max = MAXPARENTS);
  intlist(int iparent, int max = MAXPARENTS);
  intlist(int* vallist, int max = MAXPARENTS);    /** -1 terminated **/
  intlist();                           /** creates an empty intlist **/
  ~intlist();
  int check_is_inlist (int i);
  void set_contents (intlist source);
  void push (int);
  void pop ();
  int peek ();
  char* dump (char*);
  void dump_to_stdout();
  Value* toval ();
};


class Object {
  friend class intlist;
  friend class Value;
  friend class StringValHash;
  friend class ReStringHash;
  friend class Object_Store;
 public:
  Object (ifstream*, int onum);               // compile an object
  Object (char* buffer, int object_num);      // construct from packed memory
  Object (int oid, int iparent = NOPARENTS);  // creates a blank new object
  ~Object();
  int set_var (String* name, Value* initial_val)
    {return symbols.add(initial_val, name);}
  Value* lookup_var (String* name)           {return symbols.lookup(name);}
  char* pack_object(char* buf);
  Value* get_parent_list();
  Value* tostr();
  Value* list_vars ()                        {return symbols.list_vars();}
  int set_sym (Value*, String*);    /* returns 0 if string not already used */
  int rm_sym  (String*);
  int add_cmd (Val_List* key, String* data);
  int rm_cmd  (String*);
  void purge_cmds ();
  Value* list_cmds ()                       {return commands.list_cmds();}
  String* match_cmd (String* pattern)       {return commands.lookup (pattern);}
  Val_List* all_matches (String* pattern)
           {return commands.lookup_all (pattern);}
  void dump_to_stdout();
  int change_parents (int* ilist);
 protected:
  StringValHash symbols;
  CommandList commands;
  intlist *parents;
  int id;
};

#endif  /* OBJECT_H */