// © 2017 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
 *******************************************************************************
 * Copyright (C) 2009-2017, International Business Machines Corporation,       *
 * Google, and others. All Rights Reserved.                                    *
 *******************************************************************************
 */

#ifndef __NOUNIT_H__
#define __NOUNIT_H__

#include "unicode/utypes.h"

#if !UCONFIG_NO_FORMATTING
#ifndef U_HIDE_DRAFT_API

#include "unicode/measunit.h"

/**
 * \file
 * \brief C++ API: units for percent and permille
 */

U_NAMESPACE_BEGIN

/**
 * Dimensionless unit for percent and permille.
 * @see NumberFormatter
 * @draft ICU 60
 */
class U_I18N_API NoUnit: public MeasureUnit {
public:
    /**
     * Returns an instance for the base unit (dimensionless and no scaling).
     *
     * @return               a NoUnit instance
     * @draft ICU 60
     */
    static NoUnit U_EXPORT2 base();

    /**
     * Returns an instance for percent, or 1/100 of a base unit.
     *
     * @return               a NoUnit instance
     * @draft ICU 60
     */
    static NoUnit U_EXPORT2 percent();

    /**
     * Returns an instance for permille, or 1/1000 of a base unit.
     *
     * @return               a NoUnit instance
     * @draft ICU 60
     */
    static NoUnit U_EXPORT2 permille();

    /**
     * Copy operator.
     * @draft ICU 60
     */
    NoUnit(const NoUnit& other);

    /**
     * Destructor.
     * @draft ICU 60
     */
    virtual ~NoUnit();

    /**
     * Return a polymorphic clone of this object.  The result will
     * have the same class as returned by getDynamicClassID().
     * @draft ICU 60
     */
    virtual UObject* clone() const;

    /**
     * Returns a unique class ID for this object POLYMORPHICALLY.
     * This method implements a simple form of RTTI used by ICU.
     * @return The class ID for this object. All objects of a given
     * class have the same class ID.  Objects of other classes have
     * different class IDs.
     * @draft ICU 60
     */
    virtual UClassID getDynamicClassID() const;

    /**
     * Returns the class ID for this class. This is used to compare to
     * the return value of getDynamicClassID().
     * @return The class ID for all objects of this class.
     * @draft ICU 60
     */
    static UClassID U_EXPORT2 getStaticClassID();

private:
    /**
     * Constructor
     * @internal (private)
     */
    NoUnit(const char* subtype);

};

U_NAMESPACE_END

#endif  /* U_HIDE_DRAFT_API */
#endif /* #if !UCONFIG_NO_FORMATTING */

#endif // __NOUNIT_H__
//eof
//
