| Index: icu46/source/i18n/tmunit.cpp
|
| ===================================================================
|
| --- icu46/source/i18n/tmunit.cpp (revision 0)
|
| +++ icu46/source/i18n/tmunit.cpp (revision 0)
|
| @@ -0,0 +1,117 @@
|
| +/*
|
| + *******************************************************************************
|
| + * Copyright (C) 2008-2010, Google, International Business Machines Corporation and
|
| + * others. All Rights Reserved.
|
| + *******************************************************************************
|
| + */
|
| +
|
| +#include <typeinfo> // for 'typeid' to work
|
| +
|
| +#include "unicode/tmunit.h"
|
| +
|
| +#if !UCONFIG_NO_FORMATTING
|
| +
|
| +U_NAMESPACE_BEGIN
|
| +
|
| +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TimeUnit)
|
| +
|
| +
|
| +/*
|
| + * There are only 7 time units.
|
| + * So, TimeUnit could be made as singleton
|
| + * (similar to uniset_props.cpp, or unorm.cpp,
|
| + * in which a static TimeUnit* array is created, and
|
| + * the creatInstance() returns a const TimeUnit*).
|
| + * But the constraint is TimeUnit is a data member of Measure.
|
| + * But Measure (which is an existing API) does not expect it's "unit" member
|
| + * as singleton. Meaure takes ownership of the "unit" member.
|
| + * In its constructor, it does not take a const "unit" pointer.
|
| + * Also, Measure can clone and destruct the "unit" pointer.
|
| + * In order to preserve the old behavior and let Measure handle singleton "unit",
|
| + * 1. a flag need to be added in Measure;
|
| + * 2. a new constructor which takes const "unit" as parameter need to be added,
|
| + * and this new constructor will set the flag on.
|
| + * 3. clone and destructor need to check upon this flag to distinguish on how
|
| + * to handle the "unit".
|
| + *
|
| + * Since TimeUnit is such a light weight object, comparing with the heavy weight
|
| + * format operation, we decided to avoid the above complication.
|
| + *
|
| + * So, both TimeUnit and CurrencyUnit (the 2 subclasses of MeasureUnit) are
|
| + * immutable and non-singleton.
|
| + *
|
| + * Currently, TimeUnitAmount and CurrencyAmount are immutable.
|
| + * If an application needs to create a long list of TimeUnitAmount on the same
|
| + * time unit but different number, for example,
|
| + * 1 hour, 2 hour, 3 hour, ................. 10,000 hour,
|
| + * there might be performance hit because 10,000 TimeUnit object,
|
| + * although all are the same time unit, will be created in heap and deleted.
|
| + *
|
| + * To address this performance issue, if there is any in the future,
|
| + * we should and need to change TimeUnitAmount and CurrencyAmount to be
|
| + * immutable by allowing a setter on the number.
|
| + * Or we need to add 2 parallel mutable classes in order to
|
| + * preserve the existing API.
|
| + * Or we can use freezable.
|
| + */
|
| +TimeUnit* U_EXPORT2
|
| +TimeUnit::createInstance(TimeUnit::UTimeUnitFields timeUnitField,
|
| + UErrorCode& status) {
|
| + if (U_FAILURE(status)) {
|
| + return NULL;
|
| + }
|
| + if (timeUnitField < 0 || timeUnitField >= UTIMEUNIT_FIELD_COUNT) {
|
| + status = U_ILLEGAL_ARGUMENT_ERROR;
|
| + return NULL;
|
| + }
|
| + return new TimeUnit(timeUnitField);
|
| +}
|
| +
|
| +
|
| +TimeUnit::TimeUnit(TimeUnit::UTimeUnitFields timeUnitField) {
|
| + fTimeUnitField = timeUnitField;
|
| +}
|
| +
|
| +
|
| +TimeUnit::TimeUnit(const TimeUnit& other)
|
| +: MeasureUnit(other) {
|
| + *this = other;
|
| +}
|
| +
|
| +
|
| +UObject*
|
| +TimeUnit::clone() const {
|
| + return new TimeUnit(*this);
|
| +}
|
| +
|
| +
|
| +TimeUnit&
|
| +TimeUnit::operator=(const TimeUnit& other) {
|
| + if (this == &other) {
|
| + return *this;
|
| + }
|
| + fTimeUnitField = other.fTimeUnitField;
|
| + return *this;
|
| +}
|
| +
|
| +
|
| +UBool
|
| +TimeUnit::operator==(const UObject& other) const {
|
| + return (typeid(*this) == typeid(other)
|
| + && fTimeUnitField == ((TimeUnit*)&other)->fTimeUnitField);
|
| +}
|
| +
|
| +
|
| +TimeUnit::UTimeUnitFields
|
| +TimeUnit::getTimeUnitField() const {
|
| + return fTimeUnitField;
|
| +}
|
| +
|
| +
|
| +TimeUnit::~TimeUnit() {
|
| +}
|
| +
|
| +
|
| +U_NAMESPACE_END
|
| +
|
| +#endif
|
|
|
| Property changes on: icu46/source/i18n/tmunit.cpp
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|