• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 ******************************************************************************
3 * Copyright (C) 2009-2012, 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 
~FieldPositionIterator()21 FieldPositionIterator::~FieldPositionIterator() {
22   delete data;
23   data = NULL;
24   pos = -1;
25 }
26 
FieldPositionIterator()27 FieldPositionIterator::FieldPositionIterator()
28     : data(NULL), pos(-1) {
29 }
30 
FieldPositionIterator(const FieldPositionIterator & rhs)31 FieldPositionIterator::FieldPositionIterator(const FieldPositionIterator &rhs)
32   : UObject(rhs), data(NULL), pos(rhs.pos) {
33 
34   if (rhs.data) {
35     UErrorCode status = U_ZERO_ERROR;
36     data = new UVector32(status);
37     data->assign(*rhs.data, status);
38     if (status != U_ZERO_ERROR) {
39       delete data;
40       data = NULL;
41       pos = -1;
42     }
43   }
44 }
45 
operator ==(const FieldPositionIterator & rhs) const46 UBool FieldPositionIterator::operator==(const FieldPositionIterator &rhs) const {
47   if (&rhs == this) {
48     return TRUE;
49   }
50   if (pos != rhs.pos) {
51     return FALSE;
52   }
53   if (!data) {
54     return rhs.data == NULL;
55   }
56   return rhs.data ? data->operator==(*rhs.data) : FALSE;
57 }
58 
setData(UVector32 * adopt,UErrorCode & status)59 void FieldPositionIterator::setData(UVector32 *adopt, UErrorCode& status) {
60   // Verify that adopt has valid data, and update status if it doesn't.
61   if (U_SUCCESS(status)) {
62     if (adopt) {
63       if ((adopt->size() % 3) != 0) {
64         status = U_ILLEGAL_ARGUMENT_ERROR;
65       } else {
66         for (int i = 1; i < adopt->size(); i += 3) {
67           if (adopt->elementAti(i) >= adopt->elementAti(i+1)) {
68             status = U_ILLEGAL_ARGUMENT_ERROR;
69             break;
70           }
71         }
72       }
73     }
74   }
75 
76   // We own the data, even if status is in error, so we need to delete it now
77   // if we're not keeping track of it.
78   if (!U_SUCCESS(status)) {
79     delete adopt;
80     return;
81   }
82 
83   delete data;
84   data = adopt;
85   pos = (adopt == NULL || adopt->size() == 0) ? -1 : 0; // android-changed: http://bugs.icu-project.org/trac/ticket/10354
86 }
87 
next(FieldPosition & fp)88 UBool FieldPositionIterator::next(FieldPosition& fp) {
89   if (pos == -1) {
90     return FALSE;
91   }
92 
93   fp.setField(data->elementAti(pos++));
94   fp.setBeginIndex(data->elementAti(pos++));
95   fp.setEndIndex(data->elementAti(pos++));
96 
97   if (pos == data->size()) {
98     pos = -1;
99   }
100 
101   return TRUE;
102 }
103 
104 U_NAMESPACE_END
105 
106 #endif /* #if !UCONFIG_NO_FORMATTING */
107