1 /* 2 ****************************************************************************** 3 * Copyright (C) 2009-2010, International Business Machines Corporation and 4 * others. All Rights Reserved. 5 ****************************************************************************** 6 * Date Name Description 7 * 12/14/09 doug Creation. 8 ****************************************************************************** 9 */ 10 11 #include "unicode/utypes.h" 12 13 #if !UCONFIG_NO_FORMATTING 14 15 #include "unicode/fpositer.h" 16 #include "cmemory.h" 17 #include "uvectr32.h" 18 19 U_NAMESPACE_BEGIN 20 21 UOBJECT_DEFINE_NO_RTTI_IMPLEMENTATION(FieldPositionIterator) 22 23 FieldPositionIterator::~FieldPositionIterator() { 24 delete data; 25 data = NULL; 26 pos = -1; 27 } 28 29 FieldPositionIterator::FieldPositionIterator() 30 : data(NULL), pos(-1) { 31 } 32 33 FieldPositionIterator::FieldPositionIterator(const FieldPositionIterator &rhs) 34 : UObject(rhs), data(NULL), pos(rhs.pos) { 35 36 if (rhs.data) { 37 UErrorCode status = U_ZERO_ERROR; 38 data = new UVector32(status); 39 data->assign(*rhs.data, status); 40 if (status != U_ZERO_ERROR) { 41 delete data; 42 data = NULL; 43 pos = -1; 44 } 45 } 46 } 47 48 UBool FieldPositionIterator::operator==(const FieldPositionIterator &rhs) const { 49 if (&rhs == this) { 50 return TRUE; 51 } 52 if (pos != rhs.pos) { 53 return FALSE; 54 } 55 if (!data) { 56 return rhs.data == NULL; 57 } 58 return rhs.data ? data->operator==(*rhs.data) : FALSE; 59 } 60 61 void FieldPositionIterator::setData(UVector32 *adopt, UErrorCode& status) { 62 // Verify that adopt has valid data, and update status if it doesn't. 63 if (U_SUCCESS(status)) { 64 if (adopt) { 65 if ((adopt->size() % 3) != 0) { 66 status = U_ILLEGAL_ARGUMENT_ERROR; 67 } else { 68 for (int i = 1; i < adopt->size(); i += 3) { 69 if (adopt->elementAti(i) >= adopt->elementAti(i+1)) { 70 status = U_ILLEGAL_ARGUMENT_ERROR; 71 break; 72 } 73 } 74 } 75 } 76 } 77 78 // We own the data, even if status is in error, so we need to delete it now 79 // if we're not keeping track of it. 80 if (!U_SUCCESS(status)) { 81 delete adopt; 82 return; 83 } 84 85 delete data; 86 data = adopt; 87 pos = adopt == NULL ? -1 : 0; 88 } 89 90 UBool FieldPositionIterator::next(FieldPosition& fp) { 91 if (pos == -1) { 92 return FALSE; 93 } 94 95 fp.setField(data->elementAti(pos++)); 96 fp.setBeginIndex(data->elementAti(pos++)); 97 fp.setEndIndex(data->elementAti(pos++)); 98 99 if (pos == data->size()) { 100 pos = -1; 101 } 102 103 return TRUE; 104 } 105 106 U_NAMESPACE_END 107 108 #endif /* #if !UCONFIG_NO_FORMATTING */ 109 110