/*
*******************************************************************************
*                                                                             *
* COPYRIGHT:                                                                  *
*   (C) Copyright International Business Machines Corporation, 1998           *
*   Licensed Material - Program-Property of IBM - All Rights Reserved.        *
*   US Government Users Restricted Rights - Use, duplication, or disclosure   *
*   restricted by GSA ADP Schedule Contract with IBM Corp.                    *
*                                                                             *
*******************************************************************************
*
*
*
*  ucnv_imp.h:
*  Contains all internal and external data structure definitions
* Created & Maitained by Bertrand A. Damiba
*
*
*
* ATTENTION:
* ---------
* Although the data structures in this file are open and stack allocatable
* we reserve the right to hide them in further releases.
*/

#ifndef UCNV_IMP_H
#define UCNV_IMP_H

#include "utypes.h"

#ifndef UHASH_H
typedef struct _UHashtable UHashtable;
#endif

/*Hashtable used to store UConverterSharedData objects supporting
 *the Caching mechanism
 */
extern UHashtable *SHARED_DATA_HASHTABLE;

/*Hashtable generated (lazy eval) by algorithmicConverterNames for fast lookup
 *Behaviour is completely different for the Algorithmic conversions.
 *we use this table to as a litmus test.
 */
extern UHashtable *ALGORITHMIC_CONVERTERS_HASHTABLE;


/* figures out if we need to go to file to read in the data tables.
 */
UConverter *createConverter (const char *converterName, UErrorCode * err);

/* Stores the shared data in the SHARED_DATA_HASHTABLE
 */
void shareConverterData (UConverterSharedData * data);

/* gets the shared data from the SHARED_DATA_HASHTABLE (might return NULL if it isn't there)
 */
UConverterSharedData *getSharedConverterData (const char *name);

/* Deletes (frees) the Shared data it's passed. first it checks the referenceCounter to
 * see if anyone is using it, if not it frees all the memory stemming from sharedConverterData and
 * returns TRUE,
 * otherwise returns FALSE
 */
bool_t deleteSharedConverterData (UConverterSharedData * sharedConverterData);

/* returns true if "name" is in algorithmicConverterNames
 */
bool_t isDataBasedConverter (const char *name);

void copyPlatformString (char *platformString, UConverterPlatform pltfrm);


#endif /* _UCNV_IMP */
