/*   ncbicoll.h
* ===========================================================================
*
*                            PUBLIC DOMAIN NOTICE
*            National Center for Biotechnology Information (NCBI)
*
*  This software/database is a "United States Government Work" under the
*  terms of the United States Copyright Act.  It was written as part of
*  the author's official duties as a United States Government employee and
*  thus cannot be copyrighted.  This software/database is freely available
*  to the public for use. The National Library of Medicine and the U.S.
*  Government do not place any restriction on its use or reproduction.
*  We would, however, appreciate having the NCBI and the author cited in
*  any work or product based on this material
*
*  Although all reasonable efforts have been taken to ensure the accuracy
*  and reliability of the software and data, the NLM and the U.S.
*  Government do not and cannot warrant the performance or results that
*  may be obtained by using this software or data. The NLM and the U.S.
*  Government disclaim all warranties, express or implied, including
*  warranties of performance, merchantability or fitness for any particular
*  purpose.
*
* ===========================================================================
*
* File Name:  ncbicoll.h
*
* Author:  Sergei Egorov
*
* Version Creation Date:   12/16/94
*
* $Revision: 5.0 $
*
* File Description: 
*     prototypes for collection procedures
*
* Modifications:  
* --------------------------------------------------------------------------
* Date     Name        Description of modification
* -------  ----------  -----------------------------------------------------
*
* $Log: ncbicoll.h,v $
 * Revision 5.0  1996/05/28  13:18:57  ostell
 * Set to revision 5.0
 *
 * Revision 4.0  1995/07/26  13:46:50  ostell
 * force revision to 4.0
 *
 * Revision 1.3  1995/05/15  18:45:58  ostell
 * added Log line
 *
*
*
*
* ==========================================================================
*/

#ifndef _NCBICOLL_
#define _NCBICOLL_

#ifndef _NCBI_
#include <ncbi.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __STDC__
#define OPT_STRUCT_TAG(n)
#else
#define OPT_STRUCT_TAG(n) n
#endif

/*********************************************************************
 *  Macro definitions
 *********************************************************************/

#define Variant Nlm_Variant
#define VariantPtr Nlm_VariantPtr

#define PtrToVnt Nlm_PtrToVnt
#define HandToVnt Nlm_HandToVnt
#define IntToVnt Nlm_IntToVnt
#define FloatToVnt Nlm_FloatToVnt
#define FnPtrToVnt Nlm_FnPtrToVnt

#define VntProc Nlm_VntProc
#define VntScanProc Nlm_VntScanProc
#define VntCmpProc Nlm_VntCmpProc
#define VntTestProc Nlm_VntTestProc

#define VntFreePtr Nlm_VntVntFreePtr
#define VntFreeHand Nlm_VntFreeHand
#define VntTestEqToPtr Nlm_VntTestEqToPtr
#define VntTestEqToHand Nlm_VntTestEqToHand
#define VntTestEqToInt4 Nlm_VntTestEqToInt4
#define VntCmpStrings Nlm_VntCmpStrings
#define VntCmpIStrings Nlm_VntCmpIStrings

#define VntArrayPtr Nlm_VntArrayPtr

#define VntArrayNew Nlm_VntArrayNew
#define VntArrayFree Nlm_VntArrayFree
#define VntArrayLen Nlm_VntArrayLen
#define VntArraySetLen Nlm_VntArraySetLen
#define VntArrayIsEmpty Nlm_VntArrayIsEmpty
#define VntArrayRefAt Nlm_VntArrayRefAt 
#define VntArrayGetAt Nlm_VntArrayGetAt 
#define VntArraySetAt Nlm_VntArraySetAt 
#define VntArrayRefAtGrow Nlm_VntArrayRefAtGrow 
#define VntArrayGetAtGrow Nlm_VntArrayGetAtGrow 
#define VntArraySetAtGrow Nlm_VntArraySetAtGrow 
#define VntArrayAdd Nlm_VntArrayAdd 
#define VntArrayInsertAt Nlm_VntArrayInsertAt 
#define VntArrayRemoveAt Nlm_VntArrayRemoveAt 
#define VntArrayDeleteAt Nlm_VntArrayDeleteAt 
#define VntArrayDeleteAll Nlm_VntArrayDeleteAll 

#define VntPos Nlm_VntPos
#define VntPosPtr Nlm_VntPosPtr

#define VntListPtr Nlm_VntListPtr

#define VntListNew Nlm_VntListNew
#define VntListFree Nlm_VntListFree
#define VntListLen Nlm_VntListLen
#define VntListIsEmpty Nlm_VntListIsEmpty
#define VntListHeadPos Nlm_VntListHeadPos
#define VntListTailPos Nlm_VntListTailPos
#define VntListPrevPos Nlm_VntListPrevPos
#define VntListNextPos Nlm_VntListNextPos
#define VntListGetAt Nlm_VntListGetAt
#define VntListGetNext Nlm_VntListGetNext
#define VntListGetPrev Nlm_VntListGetPrev
#define VntListSetAt Nlm_VntListSetAt
#define VntListInsertBefore Nlm_VntListInsertBefore
#define VntListInsertAfter Nlm_VntListInsertAfter
#define VntListRemoveAt Nlm_VntListRemoveAt
#define VntListDeleteAt Nlm_VntListDeleteAt
#define VntListDeleteAll Nlm_VntListDeleteAll
#define VntListFindNextPos Nlm_VntListFindNextPos
#define VntListFindPrevPos Nlm_VntListFindPrevPos
#define VntSortedListLookupPos Nlm_VntSortedListLookupPos
#define VntSortedListInsert Nlm_VntSortedListInsert

#define VntMapPtr Nlm_VntMapPtr

#define VntMapNew Nlm_VntMapNew
#define VntMapFree Nlm_VntMapFree
#define VntMapLen Nlm_VntMapLen
#define VntMapIsEmpty Nlm_VntMapIsEmpty
#define VntMapStartPos Nlm_VntMapStartPos
#define VntMapNextPos Nlm_VntMapNextPos
#define VntMapGetKeyAt Nlm_VntMapGetKeyAt
#define VntMapGetValAt Nlm_VntMapGetValAt
#define VntMapReplaceValAt Nlm_VntMapReplaceValAt
#define VntMapGetNextAssoc Nlm_VntMapGetNextAssoc
#define VntMapLookupPos Nlm_VntMapLookupPos
#define VntMapLookup Nlm_VntMapLookup
#define VntMapDeleteAt Nlm_VntMapDeleteAt
#define VntMapDeleteAll Nlm_VntMapDeleteAll
#define VntMapAddNewAssoc Nlm_VntMapAddNewAssoc


/*********************************************************************
 *  Variant - a(nother) universal data type
 *********************************************************************/

typedef union variant {
  Handle   handvalue;
  Pointer  ptrvalue;
  Int4     intvalue;
  FloatHi  realvalue;
  FnPtr    funcvalue;
} Variant, PNTR VariantPtr;

#define VntToHand(v) ((v).handvalue)
#define VntToPtr(v) ((v).ptrvalue)
#define VntToStr(v) ((CharPtr)((v).ptrvalue))
#define VntToInt(v) ((v).intvalue)
#define VntToFloat(v) ((v).realvalue)
#define VntToFnPtr(v) ((v).funcvalue)

extern Variant LIBCALL PtrToVnt PROTO((Pointer p));
#define StrToVnt PtrToVnt
extern Variant LIBCALL HandToVnt PROTO((Handle h));
extern Variant LIBCALL IntToVnt PROTO((Int4 i));
extern Variant LIBCALL FloatToVnt PROTO((FloatHi f));
extern Variant LIBCALL FnPtrToVnt PROTO((FnPtr f));

/* Variant procedure types */
typedef void    (*VntProc) PROTO((VariantPtr vp));
typedef void    (*VntScanProc) PROTO((VariantPtr vp, Pointer pdata));
typedef Int2    (*VntCmpProc) PROTO((VariantPtr vp1, VariantPtr vp2)); /* -1,0,1 */
typedef Boolean (*VntTestProc) PROTO((VariantPtr vp1, Pointer pdata));

/* Common Variant procedures */
extern void    VntFreePtr PROTO((VariantPtr vp));
extern void    VntFreeHand PROTO((VariantPtr pv));
extern Boolean VntTestEqToPtr PROTO((VariantPtr vp, VoidPtr ptr));
extern Boolean VntTestEqToHand PROTO((VariantPtr vp1, Handle PNTR phand));
extern Boolean VntTestEqToInt4 PROTO((VariantPtr vp1, Int4Ptr pint));
extern Int2    VntCmpStrings PROTO((VariantPtr vp1, VariantPtr vp2));
extern Int2    VntCmpIStrings PROTO((VariantPtr vp1, VariantPtr vp2));

/*********************************************************************
 *  Collections of Variants
 *********************************************************************/

/* VntPos - common 'position' type for collections */
typedef struct OPT_STRUCT_TAG(vntpos) {
  Int2 dummy;
} PNTR VntPos, PNTR PNTR VntPosPtr;


/*********************************************************************
 *  VntArray - dynamic array of Variants
 *********************************************************************/

typedef struct OPT_STRUCT_TAG(vntarray) {
  Int2 dummy;
} PNTR VntArrayPtr;

extern VntArrayPtr LIBCALL VntArrayNew PROTO((Int2 delta));
extern VntArrayPtr LIBCALL VntArrayFree PROTO((VntArrayPtr vap, VntProc fini));
extern Int4        LIBCALL VntArrayLen PROTO((VntArrayPtr vap));
extern void        LIBCALL VntArraySetLen PROTO((VntArrayPtr vap, Int4 len, VntProc init, VntProc fini));
extern Boolean     LIBCALL VntArrayIsEmpty PROTO((VntArrayPtr vap));
extern VariantPtr  LIBCALL VntArrayRefAt PROTO((VntArrayPtr vap, Int4 index));
extern Variant     LIBCALL VntArrayGetAt PROTO((VntArrayPtr vap, Int4 index));
extern void        LIBCALL VntArraySetAt PROTO((VntArrayPtr vap, Int4 index, Variant v));
extern VariantPtr  LIBCALL VntArrayRefAtGrow PROTO((VntArrayPtr vap, Int4 index, VntProc init));
extern Variant     LIBCALL VntArrayGetAtGrow PROTO((VntArrayPtr vap, Int4 index, VntProc init));
extern void        LIBCALL VntArraySetAtGrow PROTO((VntArrayPtr vap, Int4 index, Variant v, VntProc init));
extern Int4        LIBCALL VntArrayAdd PROTO((VntArrayPtr vap, Variant v));
extern void        LIBCALL VntArrayInsertAt PROTO((VntArrayPtr vap, Int4 index, Variant v));
extern Variant     LIBCALL VntArrayRemoveAt PROTO((VntArrayPtr vap, Int4 index));
extern void        LIBCALL VntArrayDeleteAt PROTO((VntArrayPtr vap, Int4 index, VntProc fini));
extern void        LIBCALL VntArrayDeleteAll PROTO((VntArrayPtr vap, VntProc fini));


/*********************************************************************
 *  VntList - doubly-linked list of Variants
 *********************************************************************/

typedef struct OPT_STRUCT_TAG(vntlist) {
  Int2 dummy;
} PNTR VntListPtr;

extern VntListPtr LIBCALL VntListNew PROTO((Int2 delta));
extern VntListPtr LIBCALL VntListFree PROTO((VntListPtr vlp, VntProc fini));
extern Int4       LIBCALL VntListLen PROTO((VntListPtr vlp));
extern Boolean    LIBCALL VntListIsEmpty PROTO((VntListPtr vlp));
extern VntPos     LIBCALL VntListHeadPos PROTO((VntListPtr vlp));
extern VntPos     LIBCALL VntListTailPos PROTO((VntListPtr vlp));
extern VntPos     LIBCALL VntListIndexPos PROTO((VntListPtr vlp, Int4 index));
extern VntPos     LIBCALL VntListPrevPos PROTO((VntListPtr vlp, VntPos vnp));
extern VntPos     LIBCALL VntListNextPos PROTO((VntListPtr vlp, VntPos vnp));
extern Variant    LIBCALL VntListGetAt PROTO((VntListPtr vlp, VntPos vnp));
extern Variant    LIBCALL VntListGetNext PROTO((VntListPtr vlp, VntPosPtr vnpp));
extern Variant    LIBCALL VntListGetPrev PROTO((VntListPtr vlp, VntPosPtr vnpp));
extern void       LIBCALL VntListSetAt PROTO((VntListPtr vlp, VntPos vnp, Variant v));
extern VntPos     LIBCALL VntListInsertBefore PROTO((VntListPtr vlp, VntPos vnp, Variant v));
extern VntPos     LIBCALL VntListInsertAfter PROTO((VntListPtr vlp, VntPos vnp, Variant v));
extern Variant    LIBCALL VntListRemoveAt PROTO((VntListPtr vlp, VntPos vnp));
extern void       LIBCALL VntListDeleteAt PROTO((VntListPtr vlp, VntPos vnp, VntProc fini));
extern void       LIBCALL VntListDeleteAll PROTO((VntListPtr vlp, VntProc fini));
extern VntPos     LIBCALL VntListFindNextPos PROTO((VntListPtr vlp, VntPos vnp, VntTestProc tp, VoidPtr pdata));
extern VntPos     LIBCALL VntListFindPrevPos PROTO((VntListPtr vlp, VntPos vnp, VntTestProc tp, VoidPtr pdata));
extern VntPos     LIBCALL VntSortedListLookupPos PROTO((VntListPtr vlp, Variant v, VntCmpProc cmp));
extern VntPos     LIBCALL VntSortedListInsert PROTO((VntListPtr vlp, Variant v, VntCmpProc cmp));


/*********************************************************************
 *  VntMap - maps Variants to Variants
 *********************************************************************/

typedef struct OPT_STRUCT_TAG(vntmap) {
  Int2 dummy;
} PNTR VntMapPtr;

extern VntMapPtr LIBCALL VntMapNew PROTO((Int2 delta));
extern VntMapPtr LIBCALL VntMapFree PROTO((VntMapPtr vmp, VntProc finikey, VntProc finival));
extern Int4      LIBCALL VntMapLen PROTO((VntMapPtr vmp));
extern Boolean   LIBCALL VntMapIsEmpty PROTO((VntMapPtr vmp));
extern VntPos    LIBCALL VntMapStartPos PROTO((VntMapPtr vmp));
extern VntPos    LIBCALL VntMapNextPos PROTO((VntMapPtr vmp, VntPos vnp));
extern Variant   LIBCALL VntMapGetKeyAt PROTO((VntMapPtr vmp, VntPos vnp));
extern Variant   LIBCALL VntMapGetValAt PROTO((VntMapPtr vmp, VntPos vnp));
extern Variant   LIBCALL VntMapReplaceValAt PROTO((VntMapPtr vmp, VntPos vnp, Variant newv));
extern void      LIBCALL VntMapGetNextAssoc PROTO((VntMapPtr vmp, VntPosPtr vnpp, VariantPtr pkey, VariantPtr pval));
extern VntPos    LIBCALL VntMapLookupPos PROTO((VntMapPtr vmp, Variant key, VntCmpProc cmpkeys));
extern Boolean   LIBCALL VntMapLookup PROTO((VntMapPtr vmp, Variant key, VntCmpProc cmpkeys, VariantPtr pval));
extern void      LIBCALL VntMapDeleteAt PROTO((VntMapPtr vmp, VntPos vnp, VntProc finikey, VntProc finival));
extern void      LIBCALL VntMapDeleteAll PROTO((VntMapPtr vmp, VntProc finikey, VntProc finival));
extern Boolean   LIBCALL VntMapAddNewAssoc PROTO((VntMapPtr vmp, Variant key, VntCmpProc cmpkeys, Variant val));

#ifdef __cplusplus
}
#endif

#endif /* ndef _NCBICOLL_ */

