intl/icu/source/i18n/fphdlimp.cpp

Wed, 31 Dec 2014 07:22:50 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:22:50 +0100
branch
TOR_BUG_3246
changeset 4
fc2d59ddac77
permissions
-rw-r--r--

Correct previous dual key logic pending first delivery installment.

     1 /*
     2 *******************************************************************************
     3 * Copyright (C) 2009-2010, International Business Machines Corporation and
     4 * others. All Rights Reserved.
     5 *******************************************************************************
     6 */
     8 #include "unicode/utypes.h"
    10 #if !UCONFIG_NO_FORMATTING
    12 #include "fphdlimp.h"
    13 #include "uvectr32.h"
    15 U_NAMESPACE_BEGIN
    17 // utility FieldPositionHandler
    18 // base class, null implementation
    20 FieldPositionHandler::~FieldPositionHandler() {
    21 }
    23 void
    24 FieldPositionHandler::addAttribute(int32_t, int32_t, int32_t) {
    25 }
    27 void
    28 FieldPositionHandler::shiftLast(int32_t) {
    29 }
    31 UBool
    32 FieldPositionHandler::isRecording(void) {
    33   return FALSE;
    34 }
    37 // utility subclass FieldPositionOnlyHandler
    39 FieldPositionOnlyHandler::FieldPositionOnlyHandler(FieldPosition& _pos)
    40   : pos(_pos) {
    41 }
    43 FieldPositionOnlyHandler::~FieldPositionOnlyHandler() {
    44 }
    46 void
    47 FieldPositionOnlyHandler::addAttribute(int32_t id, int32_t start, int32_t limit) {
    48   if (pos.getField() == id) {
    49     pos.setBeginIndex(start);
    50     pos.setEndIndex(limit);
    51   }
    52 }
    54 void
    55 FieldPositionOnlyHandler::shiftLast(int32_t delta) {
    56   if (delta != 0 && pos.getField() != FieldPosition::DONT_CARE && pos.getBeginIndex() != -1) {
    57     pos.setBeginIndex(delta + pos.getBeginIndex());
    58     pos.setEndIndex(delta + pos.getEndIndex());
    59   }
    60 }
    62 UBool
    63 FieldPositionOnlyHandler::isRecording(void) {
    64   return pos.getField() != FieldPosition::DONT_CARE;
    65 }
    68 // utility subclass FieldPositionIteratorHandler
    70 FieldPositionIteratorHandler::FieldPositionIteratorHandler(FieldPositionIterator* posIter,
    71                                                            UErrorCode& _status)
    72     : iter(posIter), vec(NULL), status(_status) {
    73   if (iter && U_SUCCESS(status)) {
    74     vec = new UVector32(status);
    75   }
    76 }
    78 FieldPositionIteratorHandler::~FieldPositionIteratorHandler() {
    79   // setData adopts the vec regardless of status, so it's safe to null it
    80   if (iter) {
    81     iter->setData(vec, status);
    82   }
    83   // if iter is null, we never allocated vec, so no need to free it
    84   vec = NULL;
    85 }
    87 void
    88 FieldPositionIteratorHandler::addAttribute(int32_t id, int32_t start, int32_t limit) {
    89   if (iter && U_SUCCESS(status) && start < limit) {
    90     int32_t size = vec->size();
    91     vec->addElement(id, status);
    92     vec->addElement(start, status);
    93     vec->addElement(limit, status);
    94     if (!U_SUCCESS(status)) {
    95       vec->setSize(size);
    96     }
    97   }
    98 }
   100 void
   101 FieldPositionIteratorHandler::shiftLast(int32_t delta) {
   102   if (U_SUCCESS(status) && delta != 0) {
   103     int32_t i = vec->size();
   104     if (i > 0) {
   105       --i;
   106       vec->setElementAt(delta + vec->elementAti(i), i);
   107       --i;
   108       vec->setElementAt(delta + vec->elementAti(i), i);
   109     }
   110   }
   111 }
   113 UBool
   114 FieldPositionIteratorHandler::isRecording(void) {
   115   return U_SUCCESS(status);
   116 }
   118 U_NAMESPACE_END
   120 #endif /* !UCONFIG_NO_FORMATTING */

mercurial