michael@0: /* michael@0: ******************************************************************************* michael@0: * Copyright (C) 2009-2010, International Business Machines Corporation and michael@0: * others. All Rights Reserved. michael@0: ******************************************************************************* michael@0: */ michael@0: michael@0: #include "unicode/utypes.h" michael@0: michael@0: #if !UCONFIG_NO_FORMATTING michael@0: michael@0: #include "fphdlimp.h" michael@0: #include "uvectr32.h" michael@0: michael@0: U_NAMESPACE_BEGIN michael@0: michael@0: // utility FieldPositionHandler michael@0: // base class, null implementation michael@0: michael@0: FieldPositionHandler::~FieldPositionHandler() { michael@0: } michael@0: michael@0: void michael@0: FieldPositionHandler::addAttribute(int32_t, int32_t, int32_t) { michael@0: } michael@0: michael@0: void michael@0: FieldPositionHandler::shiftLast(int32_t) { michael@0: } michael@0: michael@0: UBool michael@0: FieldPositionHandler::isRecording(void) { michael@0: return FALSE; michael@0: } michael@0: michael@0: michael@0: // utility subclass FieldPositionOnlyHandler michael@0: michael@0: FieldPositionOnlyHandler::FieldPositionOnlyHandler(FieldPosition& _pos) michael@0: : pos(_pos) { michael@0: } michael@0: michael@0: FieldPositionOnlyHandler::~FieldPositionOnlyHandler() { michael@0: } michael@0: michael@0: void michael@0: FieldPositionOnlyHandler::addAttribute(int32_t id, int32_t start, int32_t limit) { michael@0: if (pos.getField() == id) { michael@0: pos.setBeginIndex(start); michael@0: pos.setEndIndex(limit); michael@0: } michael@0: } michael@0: michael@0: void michael@0: FieldPositionOnlyHandler::shiftLast(int32_t delta) { michael@0: if (delta != 0 && pos.getField() != FieldPosition::DONT_CARE && pos.getBeginIndex() != -1) { michael@0: pos.setBeginIndex(delta + pos.getBeginIndex()); michael@0: pos.setEndIndex(delta + pos.getEndIndex()); michael@0: } michael@0: } michael@0: michael@0: UBool michael@0: FieldPositionOnlyHandler::isRecording(void) { michael@0: return pos.getField() != FieldPosition::DONT_CARE; michael@0: } michael@0: michael@0: michael@0: // utility subclass FieldPositionIteratorHandler michael@0: michael@0: FieldPositionIteratorHandler::FieldPositionIteratorHandler(FieldPositionIterator* posIter, michael@0: UErrorCode& _status) michael@0: : iter(posIter), vec(NULL), status(_status) { michael@0: if (iter && U_SUCCESS(status)) { michael@0: vec = new UVector32(status); michael@0: } michael@0: } michael@0: michael@0: FieldPositionIteratorHandler::~FieldPositionIteratorHandler() { michael@0: // setData adopts the vec regardless of status, so it's safe to null it michael@0: if (iter) { michael@0: iter->setData(vec, status); michael@0: } michael@0: // if iter is null, we never allocated vec, so no need to free it michael@0: vec = NULL; michael@0: } michael@0: michael@0: void michael@0: FieldPositionIteratorHandler::addAttribute(int32_t id, int32_t start, int32_t limit) { michael@0: if (iter && U_SUCCESS(status) && start < limit) { michael@0: int32_t size = vec->size(); michael@0: vec->addElement(id, status); michael@0: vec->addElement(start, status); michael@0: vec->addElement(limit, status); michael@0: if (!U_SUCCESS(status)) { michael@0: vec->setSize(size); michael@0: } michael@0: } michael@0: } michael@0: michael@0: void michael@0: FieldPositionIteratorHandler::shiftLast(int32_t delta) { michael@0: if (U_SUCCESS(status) && delta != 0) { michael@0: int32_t i = vec->size(); michael@0: if (i > 0) { michael@0: --i; michael@0: vec->setElementAt(delta + vec->elementAti(i), i); michael@0: --i; michael@0: vec->setElementAt(delta + vec->elementAti(i), i); michael@0: } michael@0: } michael@0: } michael@0: michael@0: UBool michael@0: FieldPositionIteratorHandler::isRecording(void) { michael@0: return U_SUCCESS(status); michael@0: } michael@0: michael@0: U_NAMESPACE_END michael@0: michael@0: #endif /* !UCONFIG_NO_FORMATTING */