/* ******************************************************************************** * * * COPYRIGHT: * * (C) Copyright Taligent, Inc., 1997 * * (C) Copyright International Business Machines Corporation, 1997-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. * * * ******************************************************************************** * * File FMTABLE.CPP * * Modification History: * * Date Name Description * 03/25/97 clhuang Initial Implementation. ******************************************************************************** */ #ifndef _FMTABLE #include "fmtable.h" #endif #ifndef _CMEMORY #include "cmemory.h" #endif // ***************************************************************************** // class Formattable // ***************************************************************************** // ------------------------------------- // default constructor. // Creates a formattable object with a long value 0. Formattable::Formattable() : fType(kLong) { fValue.fLong = 0; } // ------------------------------------- // Creates a formattable object with a Date instance. Formattable::Formattable(UDate date, ISDATE isDate) : fType(kDate) { fValue.fDate = date; } // ------------------------------------- // Creates a formattable object with a double value. Formattable::Formattable(double value) : fType(kDouble) { fValue.fDouble = value; } // ------------------------------------- // Creates a formattable object with a long value. Formattable::Formattable(int32_t value) : fType(kLong) { fValue.fLong = value; } // ------------------------------------- // Creates a formattable object with a char* string. Formattable::Formattable(const char* stringToCopy) : fType(kString) { fValue.fString = new UnicodeString(stringToCopy); } // ------------------------------------- // Creates a formattable object with a UnicodeString instance. Formattable::Formattable(const UnicodeString& stringToCopy) : fType(kString) { fValue.fString = new UnicodeString(stringToCopy); } // ------------------------------------- // Creates a formattable object with a UnicodeString* value. // (adopting symantics) Formattable::Formattable(UnicodeString* stringToAdopt) : fType(kString) { fValue.fString = stringToAdopt; } // ------------------------------------- Formattable::Formattable(const Formattable* arrayToCopy, int32_t count) : fType(kArray) { fValue.fArrayAndCount.fArray = createArrayCopy(arrayToCopy, count); fValue.fArrayAndCount.fCount = count; } // ------------------------------------- // copy constructor Formattable::Formattable(const Formattable &source) : fType(kLong) { *this = source; } // ------------------------------------- // assignment operator Formattable& Formattable::operator=(const Formattable& source) { if (this != &source) { // Disposes the current formattable value/setting. dispose(); // Sets the correct data type for this value. fType = source.fType; switch (fType) { case kArray: // Sets each element in the array one by one and records the array count. fValue.fArrayAndCount.fCount = source.fValue.fArrayAndCount.fCount; fValue.fArrayAndCount.fArray = createArrayCopy(source.fValue.fArrayAndCount.fArray, source.fValue.fArrayAndCount.fCount); break; case kString: // Sets the string value. fValue.fString = new UnicodeString(*source.fValue.fString); break; case kDouble: // Sets the double value. fValue.fDouble = source.fValue.fDouble; break; case kLong: // Sets the long value. fValue.fLong = source.fValue.fLong; break; case kDate: // Sets the Date value. fValue.fDate = source.fValue.fDate; break; } } return *this; } // ------------------------------------- bool_t Formattable::operator==(const Formattable& that) const { // Checks class ID. if (this == &that) return TRUE; // Returns FALSE if the data types are different. if (fType != that.fType) return FALSE; // Compares the actual data values. switch (fType) { case kDate: return fValue.fDate == that.fValue.fDate; case kDouble: return fValue.fDouble == that.fValue.fDouble; case kLong: return fValue.fLong == that.fValue.fLong; case kString: return *(fValue.fString) == *(that.fValue.fString); case kArray: if (fValue.fArrayAndCount.fCount != that.fValue.fArrayAndCount.fCount) return FALSE; // Checks each element for equality. for (int32_t i=0; iformat(obj.getDate(), buffer); stream << buffer; break; case Formattable::kDouble : // Output the double as is. stream << obj.getDouble() << 'D'; break; case Formattable::kLong : // Output the double as is. stream << obj.getLong() << 'L'; break; case Formattable::kString: // Output the double as is. Please see UnicodeString console // I/O routine for more details. stream << '"' << obj.getString(buffer) << '"'; break; case Formattable::kArray: int32_t i, count; const Formattable* array; array = obj.getArray(count); stream << '['; // Recursively calling the console I/O routine for each element in the array. for (i=0; i