136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/*
236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines*******************************************************************************
336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines* Copyright (C) 2009-2010, International Business Machines Corporation and
436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines* others. All Rights Reserved.
536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines*******************************************************************************
636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines*/
736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "unicode/utypes.h"
936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#if !UCONFIG_NO_FORMATTING
1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "fphdlimp.h"
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "uvectr32.h"
1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesU_NAMESPACE_BEGIN
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// utility FieldPositionHandler
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// base class, null implementation
1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesFieldPositionHandler::~FieldPositionHandler() {
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesFieldPositionHandler::addAttribute(int32_t, int32_t, int32_t) {
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid
28FieldPositionHandler::shiftLast(int32_t) {
29}
30
31UBool
32FieldPositionHandler::isRecording(void) {
33  return FALSE;
34}
35
36
37// utility subclass FieldPositionOnlyHandler
38
39FieldPositionOnlyHandler::FieldPositionOnlyHandler(FieldPosition& _pos)
40  : pos(_pos) {
41}
42
43FieldPositionOnlyHandler::~FieldPositionOnlyHandler() {
44}
45
46void
47FieldPositionOnlyHandler::addAttribute(int32_t id, int32_t start, int32_t limit) {
48  if (pos.getField() == id) {
49    pos.setBeginIndex(start);
50    pos.setEndIndex(limit);
51  }
52}
53
54void
55FieldPositionOnlyHandler::shiftLast(int32_t delta) {
56  if (delta != 0 && pos.getField() != FieldPosition::DONT_CARE && pos.getBeginIndex() != -1) {
57    pos.setBeginIndex(delta + pos.getBeginIndex());
58    pos.setEndIndex(delta + pos.getEndIndex());
59  }
60}
61
62UBool
63FieldPositionOnlyHandler::isRecording(void) {
64  return pos.getField() != FieldPosition::DONT_CARE;
65}
66
67
68// utility subclass FieldPositionIteratorHandler
69
70FieldPositionIteratorHandler::FieldPositionIteratorHandler(FieldPositionIterator* posIter,
71                                                           UErrorCode& _status)
72    : iter(posIter), vec(NULL), status(_status) {
73  if (iter && U_SUCCESS(status)) {
74    vec = new UVector32(status);
75  }
76}
77
78FieldPositionIteratorHandler::~FieldPositionIteratorHandler() {
79  // setData adopts the vec regardless of status, so it's safe to null it
80  if (iter) {
81    iter->setData(vec, status);
82  }
83  // if iter is null, we never allocated vec, so no need to free it
84  vec = NULL;
85}
86
87void
88FieldPositionIteratorHandler::addAttribute(int32_t id, int32_t start, int32_t limit) {
89  if (iter && U_SUCCESS(status) && start < limit) {
90    int32_t size = vec->size();
91    vec->addElement(id, status);
92    vec->addElement(start, status);
93    vec->addElement(limit, status);
94    if (!U_SUCCESS(status)) {
95      vec->setSize(size);
96    }
97  }
98}
99
100void
101FieldPositionIteratorHandler::shiftLast(int32_t delta) {
102  if (U_SUCCESS(status) && delta != 0) {
103    int32_t i = vec->size();
104    if (i > 0) {
105      --i;
106      vec->setElementAt(delta + vec->elementAti(i), i);
107      --i;
108      vec->setElementAt(delta + vec->elementAti(i), i);
109    }
110  }
111}
112
113UBool
114FieldPositionIteratorHandler::isRecording(void) {
115  return U_SUCCESS(status);
116}
117
118U_NAMESPACE_END
119
120#endif /* !UCONFIG_NO_FORMATTING */
121