]> git.saurik.com Git - apple/icu.git/blame - icuSources/i18n/fpositer.cpp
ICU-461.18.tar.gz
[apple/icu.git] / icuSources / i18n / fpositer.cpp
CommitLineData
729e4ab9
A
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
19U_NAMESPACE_BEGIN
20
21UOBJECT_DEFINE_NO_RTTI_IMPLEMENTATION(FieldPositionIterator)
22
23FieldPositionIterator::~FieldPositionIterator() {
24 delete data;
25 data = NULL;
26 pos = -1;
27}
28
29FieldPositionIterator::FieldPositionIterator()
30 : data(NULL), pos(-1) {
31}
32
33FieldPositionIterator::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
48UBool 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
61void 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
90UBool 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
106U_NAMESPACE_END
107
108#endif /* #if !UCONFIG_NO_FORMATTING */
109