/*
*****************************************************************************************
*                                                                                       *
* COPYRIGHT:                                                                            *
*   (C) Copyright Taligent, Inc.,  1997                                                 *
*   (C) Copyright International Business Machines Corporation,  1997-1999                    *
*   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.                              *
*                                                                                       *
*****************************************************************************************
*/
//===============================================================================
//
// File colcache.h
//
// CollationCache implements a persistent in-memory cache for
// TableCollationData objects.  The goal of CollationCache is to improve
// the memory footprint of a process which may have multiple threads
// loading up the same TableCollation object.  Performance improvement is
// strictly a secondary goal.
//
// Created by: Alan Liu
//
// Modification History:
//
//  Date        Name        Description
//  2/11/97     aliu        Creation.
//  2/12/97     aliu        Modified to work with TableCollationData.
//  8/18/97     helena      Added internal API documentation.
//
//===============================================================================

#ifndef COLCACHE_H
#define COLCACHE_H

#include "uhash.h"
#include "unistr.h"

class TableCollationData;

// Tell the VC++ compiler not to warn about DLL interface
#ifdef _WIN32
#pragma warning( disable : 4251 )
#endif

//-------------------------------------------------------------------------------
/**
 * CollationCache implements a simple cache for TableCollationData objects.
 * TableCollationData objects may be added to the cache, and looked up in the
 * cache.  When the cache is destroyed, all the TableCollationData objects are
 * deleted.
 */

class CollationCache
{
public:
    /**
     * Default constructor.
     */
    CollationCache();
    /**
     * Destructor.
     */
    virtual ~CollationCache();

    /** 
     * ::Add and ::Find use a UnicodeString as the key to Collation objects in the
     * cache.  If Add is called twice with equivalent keys, but different
     * collation objects, the first collation object will be deleted when the
     * second one is added.  In general, this is undesirable; objects in the
     * cache are usually pointed to by various clients in the system.  For this
     * reason, clients should call Find to ensure a Collation object does not
     * already exist in the cache for the given key before calling Add.
     * @param key the unique key.
     * @param data the collation data object.
     * @return the found collation data object
     */
    void                Add(const UnicodeString& key, TableCollationData* data);
    TableCollationData* Find(const UnicodeString& key);

private:
    UHashtable*   fHashtable;
};

#endif
//eof
