/* -----------------------------------------------------------------------------
 * This file is part of SWIG, which is licensed as a whole under version 3 
 * (or any later version) of the GNU General Public License. Some additional
 * terms also apply to certain portions of SWIG. The full details of the SWIG
 * license and copyrights can be found in the LICENSE and COPYRIGHT files
 * included with the SWIG source code as distributed by the SWIG developers
 * and at http://www.swig.org/legal.html.
 *
 * dohint.h
 *
 *     This file describes internally managed objects.
 * ----------------------------------------------------------------------------- */

#ifndef _DOHINT_H
#define _DOHINT_H

#include "doh.h"

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>
#include <stdarg.h>

/* Hash objects */
typedef struct {
  DOH *(*doh_getattr) (DOH *obj, DOH *name);	/* Get attribute */
  int (*doh_setattr) (DOH *obj, DOH *name, DOH *value);	/* Set attribute */
  int (*doh_delattr) (DOH *obj, DOH *name);	/* Del attribute */
  DOH *(*doh_keys) (DOH *obj);	/* All keys as a list */
} DohHashMethods;

/* List objects */
typedef struct {
  DOH *(*doh_getitem) (DOH *obj, int index);	/* Get item      */
  int (*doh_setitem) (DOH *obj, int index, DOH *value);	/* Set item      */
  int (*doh_delitem) (DOH *obj, int index);	/* Delete item   */
  int (*doh_insitem) (DOH *obj, int index, DOH *value);	/* Insert item   */
  int (*doh_delslice) (DOH *obj, int sindex, int eindex);	/* Delete slice  */
} DohListMethods;

/* File methods */
typedef struct {
  int (*doh_read) (DOH *obj, void *buffer, int nbytes);	/* Read bytes */
  int (*doh_write) (DOH *obj, const void *buffer, int nbytes);	/* Write bytes */
  int (*doh_putc) (DOH *obj, int ch);	/* Put character */
  int (*doh_getc) (DOH *obj);	/* Get character */
  int (*doh_ungetc) (DOH *obj, int ch);	/* Unget character */
  int (*doh_seek) (DOH *obj, long offset, int whence);	/* Seek */
  long (*doh_tell) (DOH *obj);	/* Tell */
} DohFileMethods;

/* String methods */
typedef struct {
  int (*doh_replace) (DOH *obj, const DOHString_or_char *old, const DOHString_or_char *rep, int flags);
  void (*doh_chop) (DOH *obj);
} DohStringMethods;

/* -----------------------------------------------------------------------------
 * DohObjInfo
 * ----------------------------------------------------------------------------- */

typedef struct DohObjInfo {
  const char *objname;		/* Object name        */

  /* Basic object methods */
  void (*doh_del) (DOH *obj);	/* Delete object      */
  DOH *(*doh_copy) (DOH *obj);	/* Copy and object    */
  void (*doh_clear) (DOH *obj);	/* Clear an object    */

  /* I/O methods */
  DOH *(*doh_str) (DOH *obj);	/* Make a full string */
  void *(*doh_data) (DOH *obj);	/* Return raw data    */
  int (*doh_dump) (DOH *obj, DOH *out);	/* Serialize on out   */

  /* Length and hash values */
  int (*doh_len) (DOH *obj);
  int (*doh_hashval) (DOH *obj);

  /* Compare */
  int (*doh_cmp) (DOH *obj1, DOH *obj2);

  /* Equal */
  int (*doh_equal) (DOH *obj1, DOH *obj2);

  /* Iterators */
  DohIterator (*doh_first) (DOH *obj);
  DohIterator (*doh_next) (DohIterator);

  /* Positional */
  void (*doh_setfile) (DOH *obj, DOHString_or_char *file);
  DOH *(*doh_getfile) (DOH *obj);
  void (*doh_setline) (DOH *obj, int line);
  int (*doh_getline) (DOH *obj);

  DohHashMethods *doh_hash;	/* Hash methods       */
  DohListMethods *doh_list;	/* List methods       */
  DohFileMethods *doh_file;	/* File methods       */
  DohStringMethods *doh_string;	/* String methods     */
  void *doh_reserved;		/* Reserved           */
  void *clientdata;		/* User data          */
} DohObjInfo;

typedef struct {
  void *data;			/* Data pointer */
  DohObjInfo *type;
  void *meta;			/* Meta data */
  unsigned int flag_intern:1;	/* Interned object */
  unsigned int flag_marked:1;	/* Mark flag. Used to avoid recursive loops in places */
  unsigned int flag_user:1;	/* User flag */
  unsigned int flag_usermark:1;	/* User marked */
  unsigned int refcount:28;	/* Reference count (max 16 million) */
} DohBase;

/* Macros for decrefing and increfing (safe for null objects). */

#define Decref(a)         if (a) ((DohBase *) a)->refcount--
#define Incref(a)         if (a) ((DohBase *) a)->refcount++
#define Refcount(a)       ((DohBase *) a)->refcount

/* Macros for manipulating objects in a safe manner */
#define ObjData(a)        ((DohBase *)a)->data
#define ObjSetMark(a,x)   ((DohBase *)a)->flag_marked = x
#define ObjGetMark(a)     ((DohBase *)a)->flag_marked
#define ObjType(a)        ((DohBase *)a)->type

extern DOH *DohObjMalloc(DohObjInfo *type, void *data);	/* Allocate a DOH object */
extern void DohObjFree(DOH *ptr);	/* Free a DOH object     */

#endif				/* DOHINT_H */
