/src/mozilla-central/intl/icu/source/i18n/fphdlimp.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | // © 2016 and later: Unicode, Inc. and others. |
2 | | // License & terms of use: http://www.unicode.org/copyright.html |
3 | | /* |
4 | | ******************************************************************************* |
5 | | * Copyright (C) 2009-2015, International Business Machines Corporation and |
6 | | * others. All Rights Reserved. |
7 | | ******************************************************************************* |
8 | | */ |
9 | | |
10 | | #include "unicode/utypes.h" |
11 | | |
12 | | #if !UCONFIG_NO_FORMATTING |
13 | | |
14 | | #include "fphdlimp.h" |
15 | | #include "uvectr32.h" |
16 | | |
17 | | U_NAMESPACE_BEGIN |
18 | | |
19 | | // utility FieldPositionHandler |
20 | | // base class, null implementation |
21 | | |
22 | 0 | FieldPositionHandler::~FieldPositionHandler() { |
23 | 0 | } |
24 | | |
25 | 0 | void FieldPositionHandler::setShift(int32_t delta) { |
26 | 0 | fShift = delta; |
27 | 0 | } |
28 | | |
29 | | |
30 | | // utility subclass FieldPositionOnlyHandler |
31 | | |
32 | | FieldPositionOnlyHandler::FieldPositionOnlyHandler(FieldPosition& _pos) |
33 | 0 | : pos(_pos) { |
34 | 0 | } |
35 | | |
36 | | FieldPositionOnlyHandler::~FieldPositionOnlyHandler() { |
37 | | } |
38 | | |
39 | | void |
40 | 0 | FieldPositionOnlyHandler::addAttribute(int32_t id, int32_t start, int32_t limit) { |
41 | 0 | if (pos.getField() == id) { |
42 | 0 | pos.setBeginIndex(start + fShift); |
43 | 0 | pos.setEndIndex(limit + fShift); |
44 | 0 | } |
45 | 0 | } |
46 | | |
47 | | void |
48 | 0 | FieldPositionOnlyHandler::shiftLast(int32_t delta) { |
49 | 0 | if (delta != 0 && pos.getField() != FieldPosition::DONT_CARE && pos.getBeginIndex() != -1) { |
50 | 0 | pos.setBeginIndex(delta + pos.getBeginIndex()); |
51 | 0 | pos.setEndIndex(delta + pos.getEndIndex()); |
52 | 0 | } |
53 | 0 | } |
54 | | |
55 | | UBool |
56 | 0 | FieldPositionOnlyHandler::isRecording(void) const { |
57 | 0 | return pos.getField() != FieldPosition::DONT_CARE; |
58 | 0 | } |
59 | | |
60 | | |
61 | | // utility subclass FieldPositionIteratorHandler |
62 | | |
63 | | FieldPositionIteratorHandler::FieldPositionIteratorHandler(FieldPositionIterator* posIter, |
64 | | UErrorCode& _status) |
65 | 0 | : iter(posIter), vec(NULL), status(_status) { |
66 | 0 | if (iter && U_SUCCESS(status)) { |
67 | 0 | vec = new UVector32(status); |
68 | 0 | } |
69 | 0 | } |
70 | | |
71 | 0 | FieldPositionIteratorHandler::~FieldPositionIteratorHandler() { |
72 | 0 | // setData adopts the vec regardless of status, so it's safe to null it |
73 | 0 | if (iter) { |
74 | 0 | iter->setData(vec, status); |
75 | 0 | } |
76 | 0 | // if iter is null, we never allocated vec, so no need to free it |
77 | 0 | vec = NULL; |
78 | 0 | } |
79 | | |
80 | | void |
81 | 0 | FieldPositionIteratorHandler::addAttribute(int32_t id, int32_t start, int32_t limit) { |
82 | 0 | if (iter && U_SUCCESS(status) && start < limit) { |
83 | 0 | int32_t size = vec->size(); |
84 | 0 | vec->addElement(id, status); |
85 | 0 | vec->addElement(start + fShift, status); |
86 | 0 | vec->addElement(limit + fShift, status); |
87 | 0 | if (!U_SUCCESS(status)) { |
88 | 0 | vec->setSize(size); |
89 | 0 | } |
90 | 0 | } |
91 | 0 | } |
92 | | |
93 | | void |
94 | 0 | FieldPositionIteratorHandler::shiftLast(int32_t delta) { |
95 | 0 | if (U_SUCCESS(status) && delta != 0) { |
96 | 0 | int32_t i = vec->size(); |
97 | 0 | if (i > 0) { |
98 | 0 | --i; |
99 | 0 | vec->setElementAt(delta + vec->elementAti(i), i); |
100 | 0 | --i; |
101 | 0 | vec->setElementAt(delta + vec->elementAti(i), i); |
102 | 0 | } |
103 | 0 | } |
104 | 0 | } |
105 | | |
106 | | UBool |
107 | 0 | FieldPositionIteratorHandler::isRecording(void) const { |
108 | 0 | return U_SUCCESS(status); |
109 | 0 | } |
110 | | |
111 | | U_NAMESPACE_END |
112 | | |
113 | | #endif /* !UCONFIG_NO_FORMATTING */ |