]>
git.saurik.com Git - apple/icu.git/blob - icuSources/i18n/fphdlimp.cpp
1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
4 *******************************************************************************
5 * Copyright (C) 2009-2015, International Business Machines Corporation and
6 * others. All Rights Reserved.
7 *******************************************************************************
10 #include "unicode/utypes.h"
12 #if !UCONFIG_NO_FORMATTING
19 // utility FieldPositionHandler
20 // base class, null implementation
22 FieldPositionHandler::~FieldPositionHandler() {
25 void FieldPositionHandler::setShift(int32_t delta
) {
30 // utility subclass FieldPositionOnlyHandler
32 FieldPositionOnlyHandler::FieldPositionOnlyHandler(FieldPosition
& _pos
)
36 FieldPositionOnlyHandler::~FieldPositionOnlyHandler() {
40 FieldPositionOnlyHandler::addAttribute(int32_t id
, int32_t start
, int32_t limit
) {
41 if (pos
.getField() == id
) {
42 pos
.setBeginIndex(start
+ fShift
);
43 pos
.setEndIndex(limit
+ fShift
);
48 FieldPositionOnlyHandler::shiftLast(int32_t delta
) {
49 if (delta
!= 0 && pos
.getField() != FieldPosition::DONT_CARE
&& pos
.getBeginIndex() != -1) {
50 pos
.setBeginIndex(delta
+ pos
.getBeginIndex());
51 pos
.setEndIndex(delta
+ pos
.getEndIndex());
56 FieldPositionOnlyHandler::isRecording(void) const {
57 return pos
.getField() != FieldPosition::DONT_CARE
;
61 // utility subclass FieldPositionIteratorHandler
63 FieldPositionIteratorHandler::FieldPositionIteratorHandler(FieldPositionIterator
* posIter
,
65 : iter(posIter
), vec(NULL
), status(_status
) {
66 if (iter
&& U_SUCCESS(status
)) {
67 vec
= new UVector32(status
);
71 FieldPositionIteratorHandler::~FieldPositionIteratorHandler() {
72 // setData adopts the vec regardless of status, so it's safe to null it
74 iter
->setData(vec
, status
);
76 // if iter is null, we never allocated vec, so no need to free it
81 FieldPositionIteratorHandler::addAttribute(int32_t id
, int32_t start
, int32_t limit
) {
82 if (iter
&& U_SUCCESS(status
) && start
< limit
) {
83 int32_t size
= vec
->size();
84 vec
->addElement(id
, status
);
85 vec
->addElement(start
+ fShift
, status
);
86 vec
->addElement(limit
+ fShift
, status
);
87 if (!U_SUCCESS(status
)) {
94 FieldPositionIteratorHandler::shiftLast(int32_t delta
) {
95 if (U_SUCCESS(status
) && delta
!= 0) {
96 int32_t i
= vec
->size();
99 vec
->setElementAt(delta
+ vec
->elementAti(i
), i
);
101 vec
->setElementAt(delta
+ vec
->elementAti(i
), i
);
107 FieldPositionIteratorHandler::isRecording(void) const {
108 return U_SUCCESS(status
);
113 #endif /* !UCONFIG_NO_FORMATTING */