• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 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 
~FieldPositionHandler()22 FieldPositionHandler::~FieldPositionHandler() {
23 }
24 
25 void
addAttribute(int32_t,int32_t,int32_t)26 FieldPositionHandler::addAttribute(int32_t, int32_t, int32_t) {
27 }
28 
29 void
shiftLast(int32_t)30 FieldPositionHandler::shiftLast(int32_t) {
31 }
32 
33 UBool
isRecording(void) const34 FieldPositionHandler::isRecording(void) const {
35   return FALSE;
36 }
37 
38 
39 // utility subclass FieldPositionOnlyHandler
40 
FieldPositionOnlyHandler(FieldPosition & _pos)41 FieldPositionOnlyHandler::FieldPositionOnlyHandler(FieldPosition& _pos)
42   : pos(_pos) {
43 }
44 
~FieldPositionOnlyHandler()45 FieldPositionOnlyHandler::~FieldPositionOnlyHandler() {
46 }
47 
48 void
addAttribute(int32_t id,int32_t start,int32_t limit)49 FieldPositionOnlyHandler::addAttribute(int32_t id, int32_t start, int32_t limit) {
50   if (pos.getField() == id) {
51     pos.setBeginIndex(start);
52     pos.setEndIndex(limit);
53   }
54 }
55 
56 void
shiftLast(int32_t delta)57 FieldPositionOnlyHandler::shiftLast(int32_t delta) {
58   if (delta != 0 && pos.getField() != FieldPosition::DONT_CARE && pos.getBeginIndex() != -1) {
59     pos.setBeginIndex(delta + pos.getBeginIndex());
60     pos.setEndIndex(delta + pos.getEndIndex());
61   }
62 }
63 
64 UBool
isRecording(void) const65 FieldPositionOnlyHandler::isRecording(void) const {
66   return pos.getField() != FieldPosition::DONT_CARE;
67 }
68 
69 
70 // utility subclass FieldPositionIteratorHandler
71 
FieldPositionIteratorHandler(FieldPositionIterator * posIter,UErrorCode & _status)72 FieldPositionIteratorHandler::FieldPositionIteratorHandler(FieldPositionIterator* posIter,
73                                                            UErrorCode& _status)
74     : iter(posIter), vec(NULL), status(_status) {
75   if (iter && U_SUCCESS(status)) {
76     vec = new UVector32(status);
77   }
78 }
79 
~FieldPositionIteratorHandler()80 FieldPositionIteratorHandler::~FieldPositionIteratorHandler() {
81   // setData adopts the vec regardless of status, so it's safe to null it
82   if (iter) {
83     iter->setData(vec, status);
84   }
85   // if iter is null, we never allocated vec, so no need to free it
86   vec = NULL;
87 }
88 
89 void
addAttribute(int32_t id,int32_t start,int32_t limit)90 FieldPositionIteratorHandler::addAttribute(int32_t id, int32_t start, int32_t limit) {
91   if (iter && U_SUCCESS(status) && start < limit) {
92     int32_t size = vec->size();
93     vec->addElement(id, status);
94     vec->addElement(start, status);
95     vec->addElement(limit, status);
96     if (!U_SUCCESS(status)) {
97       vec->setSize(size);
98     }
99   }
100 }
101 
102 void
shiftLast(int32_t delta)103 FieldPositionIteratorHandler::shiftLast(int32_t delta) {
104   if (U_SUCCESS(status) && delta != 0) {
105     int32_t i = vec->size();
106     if (i > 0) {
107       --i;
108       vec->setElementAt(delta + vec->elementAti(i), i);
109       --i;
110       vec->setElementAt(delta + vec->elementAti(i), i);
111     }
112   }
113 }
114 
115 UBool
isRecording(void) const116 FieldPositionIteratorHandler::isRecording(void) const {
117   return U_SUCCESS(status);
118 }
119 
120 U_NAMESPACE_END
121 
122 #endif /* !UCONFIG_NO_FORMATTING */
123