Coverage Report

Created: 2018-09-25 14:53

/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 */