OLD | NEW |
(Empty) | |
| 1 /* |
| 2 ******************************************************************************* |
| 3 * Copyright (C) 2009-2010, International Business Machines Corporation and |
| 4 * others. All Rights Reserved. |
| 5 ******************************************************************************* |
| 6 */ |
| 7 |
| 8 #include "unicode/utypes.h" |
| 9 |
| 10 #if !UCONFIG_NO_FORMATTING |
| 11 |
| 12 #include "fphdlimp.h" |
| 13 #include "uvectr32.h" |
| 14 |
| 15 U_NAMESPACE_BEGIN |
| 16 |
| 17 // utility FieldPositionHandler |
| 18 // base class, null implementation |
| 19 |
| 20 FieldPositionHandler::~FieldPositionHandler() { |
| 21 } |
| 22 |
| 23 void |
| 24 FieldPositionHandler::addAttribute(int32_t, int32_t, int32_t) { |
| 25 } |
| 26 |
| 27 void |
| 28 FieldPositionHandler::shiftLast(int32_t) { |
| 29 } |
| 30 |
| 31 UBool |
| 32 FieldPositionHandler::isRecording(void) { |
| 33 return FALSE; |
| 34 } |
| 35 |
| 36 |
| 37 // utility subclass FieldPositionOnlyHandler |
| 38 |
| 39 FieldPositionOnlyHandler::FieldPositionOnlyHandler(FieldPosition& _pos) |
| 40 : pos(_pos) { |
| 41 } |
| 42 |
| 43 FieldPositionOnlyHandler::~FieldPositionOnlyHandler() { |
| 44 } |
| 45 |
| 46 void |
| 47 FieldPositionOnlyHandler::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 |
| 54 void |
| 55 FieldPositionOnlyHandler::shiftLast(int32_t delta) { |
| 56 if (delta != 0 && pos.getField() != FieldPosition::DONT_CARE && pos.getBeginIn
dex() != -1) { |
| 57 pos.setBeginIndex(delta + pos.getBeginIndex()); |
| 58 pos.setEndIndex(delta + pos.getEndIndex()); |
| 59 } |
| 60 } |
| 61 |
| 62 UBool |
| 63 FieldPositionOnlyHandler::isRecording(void) { |
| 64 return pos.getField() != FieldPosition::DONT_CARE; |
| 65 } |
| 66 |
| 67 |
| 68 // utility subclass FieldPositionIteratorHandler |
| 69 |
| 70 FieldPositionIteratorHandler::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 |
| 78 FieldPositionIteratorHandler::~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 |
| 87 void |
| 88 FieldPositionIteratorHandler::addAttribute(int32_t id, int32_t start, int32_t li
mit) { |
| 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 |
| 100 void |
| 101 FieldPositionIteratorHandler::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 |
| 113 UBool |
| 114 FieldPositionIteratorHandler::isRecording(void) { |
| 115 return U_SUCCESS(status); |
| 116 } |
| 117 |
| 118 U_NAMESPACE_END |
| 119 |
| 120 #endif /* !UCONFIG_NO_FORMATTING */ |
OLD | NEW |