Home | History | Annotate | Download | only in i18n
      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 
     21 FieldPositionIterator::~FieldPositionIterator() {
     22   delete data;
     23   data = NULL;
     24   pos = -1;
     25 }
     26 
     27 FieldPositionIterator::FieldPositionIterator()
     28     : data(NULL), pos(-1) {
     29 }
     30 
     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 
     46 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 
     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 
     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