150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* 250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho****************************************************************************** 38393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius* Copyright (C) 2009-2012, International Business Machines Corporation and 450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* others. All Rights Reserved. 550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho****************************************************************************** 650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* Date Name Description 750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* 12/14/09 doug Creation. 850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho****************************************************************************** 950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*/ 1050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/utypes.h" 1250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FORMATTING 1450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/fpositer.h" 1650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "cmemory.h" 1750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "uvectr32.h" 1850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_BEGIN 2050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoFieldPositionIterator::~FieldPositionIterator() { 2250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete data; 2350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho data = NULL; 2450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho pos = -1; 2550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 2650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoFieldPositionIterator::FieldPositionIterator() 2850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho : data(NULL), pos(-1) { 2950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 3050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoFieldPositionIterator::FieldPositionIterator(const FieldPositionIterator &rhs) 3250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho : UObject(rhs), data(NULL), pos(rhs.pos) { 3350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (rhs.data) { 3550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode status = U_ZERO_ERROR; 3650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho data = new UVector32(status); 3750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho data->assign(*rhs.data, status); 3850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (status != U_ZERO_ERROR) { 3950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete data; 4050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho data = NULL; 4150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho pos = -1; 4250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 4350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 4450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 4550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 4650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUBool FieldPositionIterator::operator==(const FieldPositionIterator &rhs) const { 4750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (&rhs == this) { 4850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return TRUE; 4950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 5050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (pos != rhs.pos) { 5150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return FALSE; 5250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 5350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (!data) { 5450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return rhs.data == NULL; 5550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 5650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return rhs.data ? data->operator==(*rhs.data) : FALSE; 5750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 5850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 5950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid FieldPositionIterator::setData(UVector32 *adopt, UErrorCode& status) { 6050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // Verify that adopt has valid data, and update status if it doesn't. 6150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_SUCCESS(status)) { 6250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (adopt) { 6350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if ((adopt->size() % 3) != 0) { 6450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ILLEGAL_ARGUMENT_ERROR; 6550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 6650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for (int i = 1; i < adopt->size(); i += 3) { 6750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (adopt->elementAti(i) >= adopt->elementAti(i+1)) { 6850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ILLEGAL_ARGUMENT_ERROR; 6950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho break; 7050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 7150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 7250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 7350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 7450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 7550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 7650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // We own the data, even if status is in error, so we need to delete it now 7750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // if we're not keeping track of it. 7850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (!U_SUCCESS(status)) { 7950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete adopt; 8050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 8150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 8250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 8350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete data; 8450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho data = adopt; 85a025b288326b11f7081940743c8c554f0036a057Elliott Hughes pos = (adopt == NULL || adopt->size() == 0) ? -1 : 0; // android-changed: http://bugs.icu-project.org/trac/ticket/10354 8650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 8750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 8850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUBool FieldPositionIterator::next(FieldPosition& fp) { 8950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (pos == -1) { 9050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return FALSE; 9150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 9250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 9350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fp.setField(data->elementAti(pos++)); 9450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fp.setBeginIndex(data->elementAti(pos++)); 9550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fp.setEndIndex(data->elementAti(pos++)); 9650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 9750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (pos == data->size()) { 9850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho pos = -1; 9950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 10050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 10150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return TRUE; 10250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 10350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 10450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_END 10550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 10650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif /* #if !UCONFIG_NO_FORMATTING */ 107