// Copyright (C) 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
 *******************************************************************************
 * Copyright (C) 2008, Google, International Business Machines Corporation and *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */ 

#include "unicode/tmutamt.h"

#if !UCONFIG_NO_FORMATTING

U_NAMESPACE_BEGIN

UOBJECT_DEFINE_RTTI_IMPLEMENTATION(TimeUnitAmount)


TimeUnitAmount::TimeUnitAmount(const Formattable& number, 
                               TimeUnit::UTimeUnitFields timeUnitField,
                               UErrorCode& status)
:    Measure(number, TimeUnit::createInstance(timeUnitField, status), status) {
}


TimeUnitAmount::TimeUnitAmount(double amount, 
                               TimeUnit::UTimeUnitFields timeUnitField,
                               UErrorCode& status)
:   Measure(Formattable(amount), 
            TimeUnit::createInstance(timeUnitField, status),
            status) {
}


TimeUnitAmount::TimeUnitAmount(const TimeUnitAmount& other)
:   Measure(other)
{
}


TimeUnitAmount& 
TimeUnitAmount::operator=(const TimeUnitAmount& other) {
    Measure::operator=(other);
    return *this;
}


UBool
TimeUnitAmount::operator==(const UObject& other) const {
    return Measure::operator==(other);
}

UObject* 
TimeUnitAmount::clone() const {
    return new TimeUnitAmount(*this);
}

    
TimeUnitAmount::~TimeUnitAmount() {
}



const TimeUnit&
TimeUnitAmount::getTimeUnit() const {
    return (const TimeUnit&) getUnit();
}


TimeUnit::UTimeUnitFields
TimeUnitAmount::getTimeUnitField() const {
    return getTimeUnit().getTimeUnitField();
}
    

U_NAMESPACE_END

#endif
