You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.7 KiB
98 lines
2.7 KiB
// © 2017 and later: Unicode, Inc. and others.
|
|
// License & terms of use: http://www.unicode.org/copyright.html
|
|
|
|
#include "unicode/utypes.h"
|
|
|
|
#if !UCONFIG_NO_FORMATTING
|
|
#ifndef __NUMBER_COMPACT_H__
|
|
#define __NUMBER_COMPACT_H__
|
|
|
|
#include "standardplural.h"
|
|
#include "number_types.h"
|
|
#include "unicode/unum.h"
|
|
#include "uvector.h"
|
|
#include "resource.h"
|
|
#include "number_patternmodifier.h"
|
|
|
|
U_NAMESPACE_BEGIN namespace number {
|
|
namespace impl {
|
|
|
|
static const int32_t COMPACT_MAX_DIGITS = 15;
|
|
|
|
class CompactData : public MultiplierProducer {
|
|
public:
|
|
CompactData();
|
|
|
|
void populate(const Locale &locale, const char *nsName, CompactStyle compactStyle,
|
|
CompactType compactType, UErrorCode &status);
|
|
|
|
int32_t getMultiplier(int32_t magnitude) const U_OVERRIDE;
|
|
|
|
const UChar *getPattern(int32_t magnitude, StandardPlural::Form plural) const;
|
|
|
|
void getUniquePatterns(UVector &output, UErrorCode &status) const;
|
|
|
|
private:
|
|
const UChar *patterns[(COMPACT_MAX_DIGITS + 1) * StandardPlural::COUNT];
|
|
int8_t multipliers[COMPACT_MAX_DIGITS + 1];
|
|
int8_t largestMagnitude;
|
|
UBool isEmpty;
|
|
|
|
class CompactDataSink : public ResourceSink {
|
|
public:
|
|
explicit CompactDataSink(CompactData &data) : data(data) {}
|
|
|
|
void put(const char *key, ResourceValue &value, UBool /*noFallback*/, UErrorCode &status) U_OVERRIDE;
|
|
|
|
private:
|
|
CompactData &data;
|
|
};
|
|
};
|
|
|
|
struct CompactModInfo {
|
|
const ImmutablePatternModifier *mod;
|
|
const UChar* patternString;
|
|
};
|
|
|
|
class CompactHandler : public MicroPropsGenerator, public UMemory {
|
|
public:
|
|
CompactHandler(
|
|
CompactStyle compactStyle,
|
|
const Locale &locale,
|
|
const char *nsName,
|
|
CompactType compactType,
|
|
const PluralRules *rules,
|
|
MutablePatternModifier *buildReference,
|
|
bool safe,
|
|
const MicroPropsGenerator *parent,
|
|
UErrorCode &status);
|
|
|
|
~CompactHandler() U_OVERRIDE;
|
|
|
|
void
|
|
processQuantity(DecimalQuantity &quantity, MicroProps µs, UErrorCode &status) const U_OVERRIDE;
|
|
|
|
private:
|
|
const PluralRules *rules;
|
|
const MicroPropsGenerator *parent;
|
|
// Initial capacity of 12 for 0K, 00K, 000K, ...M, ...B, and ...T
|
|
MaybeStackArray<CompactModInfo, 12> precomputedMods;
|
|
int32_t precomputedModsLength = 0;
|
|
CompactData data;
|
|
ParsedPatternInfo unsafePatternInfo;
|
|
MutablePatternModifier* unsafePatternModifier;
|
|
UBool safe;
|
|
|
|
/** Used by the safe code path */
|
|
void precomputeAllModifiers(MutablePatternModifier &buildReference, UErrorCode &status);
|
|
};
|
|
|
|
|
|
} // namespace impl
|
|
} // namespace number
|
|
U_NAMESPACE_END
|
|
|
|
#endif //__NUMBER_COMPACT_H__
|
|
|
|
#endif /* #if !UCONFIG_NO_FORMATTING */
|