/*
*******************************************************************************
*                                                                             *
* 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.cpp
*
* Modification History:
*
*   Date        Name        Description
*   06/11/99    stephen     Creation. (Moved here from resbund.cpp)
*******************************************************************************
*/

#include "rbdata.h"

ClassID StringList::fgClassID = 0; // Value is irrelevant
ClassID String2dList::fgClassID = 0; // Value is irrelevant
ClassID TaggedList::fgClassID = 0; // Value is irrelevant

//-----------------------------------------------------------------------------

StringList::StringList()
  : fStrings(0), fCount(0) 
{}

StringList::StringList(UnicodeString *adopted, 
		       int32_t count) 
  : fStrings(adopted), fCount(count) 
{}

StringList::~StringList() 
{ delete [] fStrings; }
  
const UnicodeString& 
StringList::operator[](int32_t i) const 
{ return fStrings[i]; }

ClassID 
StringList::getDynamicClassID() const 
{ return getStaticClassID(); }

ClassID 
StringList::getStaticClassID() 
{ return (ClassID)&fgClassID; }

//-----------------------------------------------------------------------------

String2dList::String2dList() 
  : fStrings(0), fRowCount(0), fColCount(0) 
{}
  
String2dList::String2dList(UnicodeString **adopted, 
			   int32_t rowCount, 
			   int32_t colCount) 
  : fStrings(adopted), fRowCount(rowCount), fColCount(colCount) 
{}

String2dList::~String2dList() 
{ 
  for(int32_t i = 0; i < fRowCount; ++i) {
    delete[] fStrings[i]; 
  }
}
  
const UnicodeString& 
String2dList::getString(int32_t rowIndex, 
			int32_t colIndex) 
{ return fStrings[rowIndex][colIndex]; }
  
ClassID 
String2dList::getDynamicClassID() const 
{ return getStaticClassID(); }

ClassID 
String2dList::getStaticClassID() 
{ return (ClassID)&fgClassID; }

//-----------------------------------------------------------------------------

TaggedList::TaggedList()
{
  UErrorCode err = ZERO_ERROR;
  fHashtableValues = uhash_open((UHashFunction)uhash_hashUString, &err);
  uhash_setValueDeleter(fHashtableValues, deleteValue);
  
  fHashtableKeys = uhash_open((UHashFunction)uhash_hashUString, &err);
}
  
TaggedList::~TaggedList()
{
  uhash_close(fHashtableValues);
  uhash_close(fHashtableKeys);
}

void 
TaggedList::put(const UnicodeString& tag, 
		const UnicodeString& data)
{
  UErrorCode err = ZERO_ERROR;
  
  uhash_putKey(fHashtableValues, 
	       tag.hashCode() & 0x7FFFFFFF,
	       (new UnicodeString(data)),
	       &err);
  
  uhash_putKey(fHashtableKeys,
	       uhash_size(fHashtableValues),
	       (new UnicodeString(tag)),
	       &err);
}

const UnicodeString* 
TaggedList::get(const UnicodeString& tag) const
{
  return (const UnicodeString*)
    uhash_get(fHashtableValues, tag.hashCode() & 0x7FFFFFFF);
}

void
TaggedList::deleteValue(void *value)
{
  delete (UnicodeString*)value;
}

  
ClassID 
TaggedList::getDynamicClassID() const 
{ return getStaticClassID(); }

ClassID 
TaggedList::getStaticClassID() 
{ return (ClassID)&fgClassID; }
