1// Copyright (C) 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
21U_NAMESPACE_BEGIN
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() == 0) {
66        delete adopt;
67        adopt = NULL;
68      } else if ((adopt->size() % 3) != 0) {
69        status = U_ILLEGAL_ARGUMENT_ERROR;
70      } else {
71        for (int i = 1; i < adopt->size(); i += 3) {
72          if (adopt->elementAti(i) >= adopt->elementAti(i+1)) {
73            status = U_ILLEGAL_ARGUMENT_ERROR;
74            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  if (!U_SUCCESS(status)) {
84    delete adopt;
85    return;
86  }
87
88  delete data;
89  data = adopt;
90  pos = (adopt == NULL || adopt->size() == 0) ? -1 : 0; // android-changed: http://bugs.icu-project.org/trac/ticket/10354
91}
92
93UBool FieldPositionIterator::next(FieldPosition& fp) {
94  if (pos == -1) {
95    return FALSE;
96  }
97
98  fp.setField(data->elementAti(pos++));
99  fp.setBeginIndex(data->elementAti(pos++));
100  fp.setEndIndex(data->elementAti(pos++));
101
102  if (pos == data->size()) {
103    pos = -1;
104  }
105
106  return TRUE;
107}
108
109U_NAMESPACE_END
110
111#endif /* #if !UCONFIG_NO_FORMATTING */
112