1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/intl/icu/source/i18n/fphdlimp.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,120 @@ 1.4 +/* 1.5 +******************************************************************************* 1.6 +* Copyright (C) 2009-2010, International Business Machines Corporation and 1.7 +* others. All Rights Reserved. 1.8 +******************************************************************************* 1.9 +*/ 1.10 + 1.11 +#include "unicode/utypes.h" 1.12 + 1.13 +#if !UCONFIG_NO_FORMATTING 1.14 + 1.15 +#include "fphdlimp.h" 1.16 +#include "uvectr32.h" 1.17 + 1.18 +U_NAMESPACE_BEGIN 1.19 + 1.20 +// utility FieldPositionHandler 1.21 +// base class, null implementation 1.22 + 1.23 +FieldPositionHandler::~FieldPositionHandler() { 1.24 +} 1.25 + 1.26 +void 1.27 +FieldPositionHandler::addAttribute(int32_t, int32_t, int32_t) { 1.28 +} 1.29 + 1.30 +void 1.31 +FieldPositionHandler::shiftLast(int32_t) { 1.32 +} 1.33 + 1.34 +UBool 1.35 +FieldPositionHandler::isRecording(void) { 1.36 + return FALSE; 1.37 +} 1.38 + 1.39 + 1.40 +// utility subclass FieldPositionOnlyHandler 1.41 + 1.42 +FieldPositionOnlyHandler::FieldPositionOnlyHandler(FieldPosition& _pos) 1.43 + : pos(_pos) { 1.44 +} 1.45 + 1.46 +FieldPositionOnlyHandler::~FieldPositionOnlyHandler() { 1.47 +} 1.48 + 1.49 +void 1.50 +FieldPositionOnlyHandler::addAttribute(int32_t id, int32_t start, int32_t limit) { 1.51 + if (pos.getField() == id) { 1.52 + pos.setBeginIndex(start); 1.53 + pos.setEndIndex(limit); 1.54 + } 1.55 +} 1.56 + 1.57 +void 1.58 +FieldPositionOnlyHandler::shiftLast(int32_t delta) { 1.59 + if (delta != 0 && pos.getField() != FieldPosition::DONT_CARE && pos.getBeginIndex() != -1) { 1.60 + pos.setBeginIndex(delta + pos.getBeginIndex()); 1.61 + pos.setEndIndex(delta + pos.getEndIndex()); 1.62 + } 1.63 +} 1.64 + 1.65 +UBool 1.66 +FieldPositionOnlyHandler::isRecording(void) { 1.67 + return pos.getField() != FieldPosition::DONT_CARE; 1.68 +} 1.69 + 1.70 + 1.71 +// utility subclass FieldPositionIteratorHandler 1.72 + 1.73 +FieldPositionIteratorHandler::FieldPositionIteratorHandler(FieldPositionIterator* posIter, 1.74 + UErrorCode& _status) 1.75 + : iter(posIter), vec(NULL), status(_status) { 1.76 + if (iter && U_SUCCESS(status)) { 1.77 + vec = new UVector32(status); 1.78 + } 1.79 +} 1.80 + 1.81 +FieldPositionIteratorHandler::~FieldPositionIteratorHandler() { 1.82 + // setData adopts the vec regardless of status, so it's safe to null it 1.83 + if (iter) { 1.84 + iter->setData(vec, status); 1.85 + } 1.86 + // if iter is null, we never allocated vec, so no need to free it 1.87 + vec = NULL; 1.88 +} 1.89 + 1.90 +void 1.91 +FieldPositionIteratorHandler::addAttribute(int32_t id, int32_t start, int32_t limit) { 1.92 + if (iter && U_SUCCESS(status) && start < limit) { 1.93 + int32_t size = vec->size(); 1.94 + vec->addElement(id, status); 1.95 + vec->addElement(start, status); 1.96 + vec->addElement(limit, status); 1.97 + if (!U_SUCCESS(status)) { 1.98 + vec->setSize(size); 1.99 + } 1.100 + } 1.101 +} 1.102 + 1.103 +void 1.104 +FieldPositionIteratorHandler::shiftLast(int32_t delta) { 1.105 + if (U_SUCCESS(status) && delta != 0) { 1.106 + int32_t i = vec->size(); 1.107 + if (i > 0) { 1.108 + --i; 1.109 + vec->setElementAt(delta + vec->elementAti(i), i); 1.110 + --i; 1.111 + vec->setElementAt(delta + vec->elementAti(i), i); 1.112 + } 1.113 + } 1.114 +} 1.115 + 1.116 +UBool 1.117 +FieldPositionIteratorHandler::isRecording(void) { 1.118 + return U_SUCCESS(status); 1.119 +} 1.120 + 1.121 +U_NAMESPACE_END 1.122 + 1.123 +#endif /* !UCONFIG_NO_FORMATTING */