/***********************************************************************/
/* Open Visualization Data Explorer                                    */
/* (C) Copyright IBM Corp. 1989,1999                                   */
/* ALL RIGHTS RESERVED                                                 */
/* This code licensed under the                                        */
/*    "IBM PUBLIC LICENSE - Open Visualization Data Explorer"          */
/***********************************************************************/

#include <dxconfig.h>


#include <dx/dx.h>
#include <math.h>

#define ICH InvalidComponentHandle   

/* max supported is 32 dimensional */
#define MAXRANK 32

/* number of parallel tasks * (number of processors - 1) */
#define PFACTOR 4

#define LISTJUMP 64

#define DEFAULTCOMP "data"
#define STR_DATA "data"
#define STR_POSITIONS "positions"

/* only used when computing categorize groups in parallel */
typedef struct {
    Object h;		/* the categorize itself */
    char *name;		/* the group member name */
    int didwork;	/* global copy of didwork flag */
    /* slicecnt here? */
} parinfo;

/* values for the 'XXXset' flags below - 
 *  indicates whether or how the values were determined.
 */
#define NOTSET   0	/* no value yet */
#define EXPLICIT 1	/* user-given input parameter to module */
#define BYOBJECT 2	/* statistics of input object used */

#define CAT_SCALAR    0
#define CAT_STRING    1
#define CAT_ARBITRARY 2

#define CAT_I_CASE	1
#define CAT_I_SPACE	2
#define CAT_I_LSPACE	4
#define CAT_I_RSPACE	8
#define CAT_I_LRSPACE	16
#define CAT_I_PUNCT	32

/* parm list */
typedef struct _catinfo{
    Object o;		/* use component of this object */
    char *comp_name;	/* current component name in use */
    char **comp_list;	/* component list to use */
    int comp_rank;
    int comp_shape[30];
    Array comp_array;	/* component array */
    Pointer comp_data;	/* array data */
    int free_data;	/* data was copied so must be freed */
    int cat_type;	/* scalar, string, arbitrary */
    Type comp_type;	/* component type */
    uint num;		/* number in list */
    int obj_size;	/* component object size, including shape and rank */
    int count;          /* number of constituent components */
    int intsize;	/* number of integers in object size */
    int remainder;	/* bytes remaining after integer division */
    Array new_comp;	/* New array component */
    Error (*cmpcat)(struct _catinfo *cp, Pointer s, Pointer t);
    int (*hashcmp)(Key searckey, Element element);
    PseudoKey (*catkey) (Key key);
    uint *cind;		/* component indices into built list. Pre-allocd full size */
    uint ncats;		/* number of categories */
    Array unique_array;	/* unique array of component values*/
    int maxparallel;    /* max number of parallel tasks; based on nproc */
    int goneparallel;	/* number of parallel tasks already spawned */
    ICH invalid;        /* if set, there are invalid data values */
    struct parinfo *p;	/* if computing in parallel, where to put the output */
} catinfo;

typedef struct {
    PseudoKey key;
    uint index;
    Pointer p;
    catinfo *cp;
} hashelement;

typedef struct {
    hashelement *ph;
    uint sortindex;
    catinfo *cp;
} sortelement;

typedef struct {
    Pointer lookup;
    Pointer value;
    uint sortindex;
    catinfo *cp;
} table_entry;

Error _dxf_cat_FindCompType(catinfo *cp);
int _dxf_cat_cmp_char(catinfo *cp, Pointer s, Pointer t);
int _dxf_cat_cmp_ubyte(catinfo *cp, Pointer s, Pointer t);
int _dxf_cat_cmp_short(catinfo *cp, Pointer s, Pointer t);
int _dxf_cat_cmp_ushort(catinfo *cp, Pointer s, Pointer t);
int _dxf_cat_cmp_float(catinfo *cp, Pointer s, Pointer t);
int _dxf_cat_cmp_int(catinfo *cp, Pointer s, Pointer t);
int _dxf_cat_cmp_uint(catinfo *cp, Pointer s, Pointer t);
int _dxf_cat_cmp_double(catinfo *cp, Pointer s, Pointer t);
int _dxf_cat_cmp_str(catinfo *cp, Pointer s, Pointer t);
int _dxf_cat_cmp_any(catinfo *cp, Pointer s, Pointer t);

int _dxf_cat_ignore(char *s, int ignore);

#define INTERNALERROR DXSetError(ERROR_INTERNAL, \
		      "unexpected error, file %s line %d",  __FILE__, __LINE__)

#ifndef MAX
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#endif

typedef struct {
    catinfo *data;
    catinfo *lookup;
    catinfo *value;
    catinfo *dest;
    table_entry *lut;
    int ignore;
} lookupinfo;

