160916893Sopenharmony_ci/*
260916893Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
360916893Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
460916893Sopenharmony_ci * you may not use this file except in compliance with the License.
560916893Sopenharmony_ci * You may obtain a copy of the License at
660916893Sopenharmony_ci *
760916893Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
860916893Sopenharmony_ci *
960916893Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1060916893Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1160916893Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1260916893Sopenharmony_ci * See the License for the specific language governing permissions and
1360916893Sopenharmony_ci * limitations under the License.
1460916893Sopenharmony_ci */
1560916893Sopenharmony_ci
1660916893Sopenharmony_ci#ifndef GLOBAL_I18N_PATTERN_H
1760916893Sopenharmony_ci#define GLOBAL_I18N_PATTERN_H
1860916893Sopenharmony_ci
1960916893Sopenharmony_ci#include <string>
2060916893Sopenharmony_ci#include "date_time_data.h"
2160916893Sopenharmony_ci#include "str_util.h"
2260916893Sopenharmony_ci
2360916893Sopenharmony_ci// this file should only be included by date_time_format_impl.cpp
2460916893Sopenharmony_ci#define HOUR12_MINUTE_INDEX                     0x00000000
2560916893Sopenharmony_ci#define HOUR24_MINUTE_INDEX                     0x00000001
2660916893Sopenharmony_ci#define HOUR_MINUTE_INDEX                       0x00000002
2760916893Sopenharmony_ci#define ABBR_MONTH_WEEKDAY_DAY_INDEX            0x00010000
2860916893Sopenharmony_ci#define ABBR_MONTH_DAY_INDEX                    0x00010001
2960916893Sopenharmony_ci#define YEAR_ABBR_MONTH_ABBR_WEEKDAY_DAY_INDEX  0x00010002
3060916893Sopenharmony_ci#define YEAR_WIDE_MONTH_ABBR_WEEKDAY_DAY_INDEX  0x00010003
3160916893Sopenharmony_ci#define YEAR_SHORT_MONTH_WIDE_WEEKDAY_DAY_INDEX 0x00010004
3260916893Sopenharmony_ci#define YEAR_SHORT_MONTH_ABBR_WEEKDAY_DAY_INDEX 0x00010005
3360916893Sopenharmony_ci#define YEAR_ABBR_MONTH_WIDE_WEEKDAY_DAY_INDEX  0x00010006
3460916893Sopenharmony_ci#define YEAR_WIDE_MONTH_DAY_INDEX               0x00010007
3560916893Sopenharmony_ci#define WEEK_DAY_INDEX                          0x00010008
3660916893Sopenharmony_ci#define NUMBER_MONTH_ABBR_WEEK_DAY_INDEX        0x00010009
3760916893Sopenharmony_ci#define NUMBER_MONTH_DAY_INDEX                  0x0001000A
3860916893Sopenharmony_ci#define HOUR12_MINUTE_SECOND_INDEX              0x00020000
3960916893Sopenharmony_ci#define HOUR24_MINUTE_SECOND_INDEX              0x00020001
4060916893Sopenharmony_ci#define HOUR_MINUTE_SECOND_INDEX                0x00020002
4160916893Sopenharmony_ci#define FULL_INDEX                              0x00030000
4260916893Sopenharmony_ci#define MEDIUM_INDEX                            0x00030001
4360916893Sopenharmony_ci#define SHORT_INDEX                             0x00030002
4460916893Sopenharmony_ci#define ELAPSED_MINUTE_SECOND_INDEX             0x00040000
4560916893Sopenharmony_ci#define ELAPSED_MINUTE_SECOND_MILLISECOND_INDEX 0x00040001
4660916893Sopenharmony_ci
4760916893Sopenharmony_ci#define PATTERN_TYPE_SHIFT 16
4860916893Sopenharmony_ci#define PATTERN_INDEX_MASK 0x0000ffff
4960916893Sopenharmony_ci
5060916893Sopenharmony_cinamespace OHOS {
5160916893Sopenharmony_cinamespace I18N {
5260916893Sopenharmony_cienum PatternType {
5360916893Sopenharmony_ci    PATTERN_TYPE_BEGIN = 0,
5460916893Sopenharmony_ci    TIME_PATTERN = PATTERN_TYPE_BEGIN,
5560916893Sopenharmony_ci    DATE_PATTERN,
5660916893Sopenharmony_ci    HOUR_MINUTE_SECOND_PATTERN,
5760916893Sopenharmony_ci    FULL_MEDIUM_SHORT_PATTERN,
5860916893Sopenharmony_ci    ELAPSED_PATTERN,
5960916893Sopenharmony_ci    PATTERN_TYPE_END,
6060916893Sopenharmony_ci};
6160916893Sopenharmony_ci
6260916893Sopenharmony_cistd::string GetPatternFromIndex(uint32_t index, const DateTimeData * const data)
6360916893Sopenharmony_ci{
6460916893Sopenharmony_ci    uint32_t type = index >> PATTERN_TYPE_SHIFT;
6560916893Sopenharmony_ci    if (type > PatternType::PATTERN_TYPE_END) {
6660916893Sopenharmony_ci        return "";
6760916893Sopenharmony_ci    }
6860916893Sopenharmony_ci    uint32_t ind = index & PATTERN_INDEX_MASK;
6960916893Sopenharmony_ci    PatternType patternType = static_cast<PatternType>(type);
7060916893Sopenharmony_ci    switch (patternType) {
7160916893Sopenharmony_ci        case TIME_PATTERN: {
7260916893Sopenharmony_ci            return Parse(data->timePatterns, ind);
7360916893Sopenharmony_ci        }
7460916893Sopenharmony_ci        case DATE_PATTERN: {
7560916893Sopenharmony_ci            return Parse(data->datePatterns, ind);
7660916893Sopenharmony_ci        }
7760916893Sopenharmony_ci        case HOUR_MINUTE_SECOND_PATTERN: {
7860916893Sopenharmony_ci            return Parse(data->hourMinuteSecondPatterns, ind);
7960916893Sopenharmony_ci        }
8060916893Sopenharmony_ci        case FULL_MEDIUM_SHORT_PATTERN: {
8160916893Sopenharmony_ci            return Parse(data->fullMediumShortPatterns, ind);
8260916893Sopenharmony_ci        }
8360916893Sopenharmony_ci        default: {
8460916893Sopenharmony_ci            return Parse(data->elapsedPatterns, ind);
8560916893Sopenharmony_ci        }
8660916893Sopenharmony_ci    }
8760916893Sopenharmony_ci}
8860916893Sopenharmony_ci
8960916893Sopenharmony_cistd::string GetStringFromPattern2(const AvailableDateTimeFormatPattern &requestPattern, const DateTimeData * const data)
9060916893Sopenharmony_ci{
9160916893Sopenharmony_ci    switch (requestPattern) {
9260916893Sopenharmony_ci        case ABBR_MONTH_WEEKDAY_DAY: {
9360916893Sopenharmony_ci            return GetPatternFromIndex(ABBR_MONTH_WEEKDAY_DAY_INDEX, data);
9460916893Sopenharmony_ci        }
9560916893Sopenharmony_ci        case FULL: {
9660916893Sopenharmony_ci            return GetPatternFromIndex(FULL_INDEX, data);
9760916893Sopenharmony_ci        }
9860916893Sopenharmony_ci        case MEDIUM: {
9960916893Sopenharmony_ci            return GetPatternFromIndex(MEDIUM_INDEX, data);
10060916893Sopenharmony_ci        }
10160916893Sopenharmony_ci        case SHORT: {
10260916893Sopenharmony_ci            return GetPatternFromIndex(SHORT_INDEX, data);
10360916893Sopenharmony_ci        }
10460916893Sopenharmony_ci        case YEAR_ABBR_MONTH_ABBR_WEEKDAY_DAY: {
10560916893Sopenharmony_ci            return GetPatternFromIndex(YEAR_ABBR_MONTH_ABBR_WEEKDAY_DAY_INDEX, data);
10660916893Sopenharmony_ci        }
10760916893Sopenharmony_ci        case YEAR_WIDE_MONTH_ABBR_WEEKDAY_DAY: {
10860916893Sopenharmony_ci            return GetPatternFromIndex(YEAR_WIDE_MONTH_ABBR_WEEKDAY_DAY_INDEX, data);
10960916893Sopenharmony_ci        }
11060916893Sopenharmony_ci        case YEAR_SHORT_MONTH_WIDE_WEEKDAY_DAY: {
11160916893Sopenharmony_ci            return GetPatternFromIndex(YEAR_SHORT_MONTH_WIDE_WEEKDAY_DAY_INDEX, data);
11260916893Sopenharmony_ci        }
11360916893Sopenharmony_ci        case YEAR_SHORT_MONTH_ABBR_WEEKDAY_DAY: {
11460916893Sopenharmony_ci            return GetPatternFromIndex(YEAR_SHORT_MONTH_ABBR_WEEKDAY_DAY_INDEX, data);
11560916893Sopenharmony_ci        }
11660916893Sopenharmony_ci        case YEAR_ABBR_MONTH_WIDE_WEEKDAY_DAY: {
11760916893Sopenharmony_ci            return GetPatternFromIndex(YEAR_ABBR_MONTH_WIDE_WEEKDAY_DAY_INDEX, data);
11860916893Sopenharmony_ci        }
11960916893Sopenharmony_ci        case YEAR_WIDE_MONTH_DAY: {
12060916893Sopenharmony_ci            return GetPatternFromIndex(YEAR_WIDE_MONTH_DAY_INDEX, data);
12160916893Sopenharmony_ci        }
12260916893Sopenharmony_ci        case WEEK_DAY: {
12360916893Sopenharmony_ci            return GetPatternFromIndex(WEEK_DAY_INDEX, data);
12460916893Sopenharmony_ci        }
12560916893Sopenharmony_ci        case NUMBER_MONTH_ABBR_WEEK_DAY: {
12660916893Sopenharmony_ci            return GetPatternFromIndex(NUMBER_MONTH_ABBR_WEEK_DAY_INDEX, data);
12760916893Sopenharmony_ci        }
12860916893Sopenharmony_ci        case NUMBER_MONTH_DAY: {
12960916893Sopenharmony_ci            return GetPatternFromIndex(NUMBER_MONTH_DAY_INDEX, data);
13060916893Sopenharmony_ci        }
13160916893Sopenharmony_ci        default: {
13260916893Sopenharmony_ci            return "";
13360916893Sopenharmony_ci        }
13460916893Sopenharmony_ci    }
13560916893Sopenharmony_ci}
13660916893Sopenharmony_ci
13760916893Sopenharmony_cistd::string GetStringFromPattern(const AvailableDateTimeFormatPattern &requestPattern, const DateTimeData * const data)
13860916893Sopenharmony_ci{
13960916893Sopenharmony_ci    if (data == nullptr) {
14060916893Sopenharmony_ci        return "";
14160916893Sopenharmony_ci    }
14260916893Sopenharmony_ci    switch (requestPattern) {
14360916893Sopenharmony_ci        case HOUR12_MINUTE_SECOND: {
14460916893Sopenharmony_ci            return GetPatternFromIndex(HOUR12_MINUTE_SECOND_INDEX, data);
14560916893Sopenharmony_ci        }
14660916893Sopenharmony_ci        case HOUR24_MINUTE_SECOND: {
14760916893Sopenharmony_ci            return GetPatternFromIndex(HOUR24_MINUTE_SECOND_INDEX, data);
14860916893Sopenharmony_ci        }
14960916893Sopenharmony_ci        case HOUR_MINUTE_SECOND: {
15060916893Sopenharmony_ci            return GetPatternFromIndex(HOUR_MINUTE_SECOND_INDEX, data);
15160916893Sopenharmony_ci        }
15260916893Sopenharmony_ci        case ABBR_MONTH_DAY: {
15360916893Sopenharmony_ci            return GetPatternFromIndex(ABBR_MONTH_DAY_INDEX, data);
15460916893Sopenharmony_ci        }
15560916893Sopenharmony_ci        case HOUR12_MINUTE: {
15660916893Sopenharmony_ci            return GetPatternFromIndex(HOUR12_MINUTE_INDEX, data);
15760916893Sopenharmony_ci        }
15860916893Sopenharmony_ci        case HOUR24_MINUTE: {
15960916893Sopenharmony_ci            return GetPatternFromIndex(HOUR24_MINUTE_INDEX, data);
16060916893Sopenharmony_ci        }
16160916893Sopenharmony_ci        case HOUR_MINUTE: {
16260916893Sopenharmony_ci            return GetPatternFromIndex(HOUR_MINUTE_INDEX, data);
16360916893Sopenharmony_ci        }
16460916893Sopenharmony_ci        default: {
16560916893Sopenharmony_ci            return GetStringFromPattern2(requestPattern, data);
16660916893Sopenharmony_ci        }
16760916893Sopenharmony_ci    }
16860916893Sopenharmony_ci}
16960916893Sopenharmony_ci
17060916893Sopenharmony_cistd::string GetStringFromElapsedPattern(const ElapsedPatternType &type, const DateTimeData * const data)
17160916893Sopenharmony_ci{
17260916893Sopenharmony_ci    if (data == nullptr) {
17360916893Sopenharmony_ci        return "";
17460916893Sopenharmony_ci    }
17560916893Sopenharmony_ci    switch (type) {
17660916893Sopenharmony_ci        case ELAPSED_MINUTE_SECOND: {
17760916893Sopenharmony_ci            return GetPatternFromIndex(ELAPSED_MINUTE_SECOND_INDEX, data);
17860916893Sopenharmony_ci        }
17960916893Sopenharmony_ci        case ELAPSED_MINUTE_SECOND_MILLISECOND: {
18060916893Sopenharmony_ci            return GetPatternFromIndex(ELAPSED_MINUTE_SECOND_MILLISECOND_INDEX, data);
18160916893Sopenharmony_ci        }
18260916893Sopenharmony_ci        case ELAPSED_HOUR_MINUTE: {
18360916893Sopenharmony_ci            return GetPatternFromIndex(HOUR24_MINUTE_INDEX, data);
18460916893Sopenharmony_ci        }
18560916893Sopenharmony_ci        case ELAPSED_HOUR_MINUTE_SECOND: {
18660916893Sopenharmony_ci            return GetPatternFromIndex(HOUR24_MINUTE_SECOND_INDEX, data);
18760916893Sopenharmony_ci        }
18860916893Sopenharmony_ci        default: {
18960916893Sopenharmony_ci            return "";
19060916893Sopenharmony_ci        }
19160916893Sopenharmony_ci    }
19260916893Sopenharmony_ci}
19360916893Sopenharmony_ci} // namespace I18N
19460916893Sopenharmony_ci} // namespace OHOS
19560916893Sopenharmony_ci#endif