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.getBeginIndex() != -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 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 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 */ 121