1ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert// © 2017 and later: Unicode, Inc. and others.
2ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html
3ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert
4ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert#include "unicode/utypes.h"
5ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert
6ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert#if !UCONFIG_NO_FORMATTING && !UPRV_INCOMPLETE_CPP11_SUPPORT
7ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert
8ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert#include "unicode/numberformatter.h"
9ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert#include "number_patternstring.h"
10ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert
11ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubertusing namespace icu;
12ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubertusing namespace icu::number;
13ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubertusing namespace icu::number::impl;
14ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert
15ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertGrouper Grouper::defaults() {
16ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    return {-2, -2, false};
17ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert}
18ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert
19ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertGrouper Grouper::minTwoDigits() {
20ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    return {-2, -2, true};
21ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert}
22ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert
23ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertGrouper Grouper::none() {
24ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    return {-1, -1, false};
25ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert}
26ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert
27ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubertvoid Grouper::setLocaleData(const impl::ParsedPatternInfo &patternInfo) {
28ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    if (fGrouping1 != -2) {
29ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return;
30ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
31ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    auto grouping1 = static_cast<int8_t> (patternInfo.positive.groupingSizes & 0xffff);
32ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    auto grouping2 = static_cast<int8_t> ((patternInfo.positive.groupingSizes >> 16) & 0xffff);
33ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    auto grouping3 = static_cast<int8_t> ((patternInfo.positive.groupingSizes >> 32) & 0xffff);
34ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    if (grouping2 == -1) {
35ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        grouping1 = -1;
36ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
37ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    if (grouping3 == -1) {
38ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        grouping2 = grouping1;
39ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
40ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    fGrouping1 = grouping1;
41ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    fGrouping2 = grouping2;
42ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert}
43ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert
44ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubertbool Grouper::groupAtPosition(int32_t position, const impl::DecimalQuantity &value) const {
45ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    U_ASSERT(fGrouping1 > -2);
46ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    if (fGrouping1 == -1 || fGrouping1 == 0) {
47ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        // Either -1 or 0 means "no grouping"
48ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert        return false;
49ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    }
50ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    position -= fGrouping1;
51ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    return position >= 0 && (position % fGrouping2) == 0
52ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert           && value.getUpperDisplayMagnitude() - fGrouping1 + 1 >= (fMin2 ? 2 : 1);
53ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert}
54ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert
55ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert#endif /* #if !UCONFIG_NO_FORMATTING */
56