/*
*******************************************************************************
*                                                                             *
* COPYRIGHT:                                                                  *
*   (C) Copyright International Business Machines Corporation, 1998, 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 rbdata.h
*
* Modification History:
*
*   Date        Name        Description
*   06/11/99    stephen     Creation. (Moved here from resbund.cpp)
*******************************************************************************
*/

#ifndef RBDATA_H
#define RBDATA_H 1

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

/**
 * Abstract base class for data stored in resource bundles.  These
 * objects are kept in hashtables, indexed by strings.  We never need
 * to copy or clone these objects, since they are created once and
 * never deleted.  
 */
class ResourceBundleData
{
public:
  virtual ~ResourceBundleData() {}
  virtual ClassID getDynamicClassID(void) const = 0;
};

/** Concrete data class representing a list of strings.  */
class StringList : public ResourceBundleData
{
public:
  StringList();
  StringList(UnicodeString* adopted, int32_t count);
  virtual ~StringList();
  const UnicodeString& operator[](int32_t i) const;
  virtual ClassID getDynamicClassID(void) const;
  static ClassID getStaticClassID(void);

  static ClassID  fgClassID;
  int32_t         fCount;
  UnicodeString   *fStrings;
};

/** Concrete data class representing a 2-dimensional list of strings. */
class String2dList : public ResourceBundleData
{
public:
  String2dList();
  String2dList(UnicodeString** adopted, int32_t rowCount, int32_t colCount);
  virtual ~String2dList();
  const UnicodeString& getString(int32_t rowIndex, int32_t colIndex);
  virtual ClassID getDynamicClassID(void) const;
  static ClassID getStaticClassID(void);

  static ClassID  fgClassID;
  int32_t         fRowCount;
  int32_t         fColCount;
  UnicodeString   **fStrings;
};

/**
 * Concrete data class representing a tagged list of strings.  This is
 * implemented using a hash table.  
 */
class TaggedList : public ResourceBundleData
{
public:
  TaggedList();
  virtual ~TaggedList();
  void put(const UnicodeString& tag, const UnicodeString& data);
  const UnicodeString* get(const UnicodeString& tag) const;
  virtual ClassID getDynamicClassID(void) const;
  static ClassID getStaticClassID(void);

  static void deleteValue(void* value);

  static ClassID  fgClassID;
  UHashtable      *fHashtableValues;
  UHashtable      *fHashtableKeys;
};

#endif
