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