OLD | NEW |
(Empty) | |
| 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 |
OLD | NEW |