Home | History | Annotate | Download | only in i18n
      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 
     19 U_NAMESPACE_BEGIN
     20 
     21 UOBJECT_DEFINE_NO_RTTI_IMPLEMENTATION(FieldPositionIterator)
     22 
     23 FieldPositionIterator::~FieldPositionIterator() {
     24   delete data;
     25   data = NULL;
     26   pos = -1;
     27 }
     28 
     29 FieldPositionIterator::FieldPositionIterator()
     30     : data(NULL), pos(-1) {
     31 }
     32 
     33 FieldPositionIterator::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 
     48 UBool 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 
     61 void 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 
     90 UBool 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 
    106 U_NAMESPACE_END
    107 
    108 #endif /* #if !UCONFIG_NO_FORMATTING */
    109 
    110