intl/icu/source/i18n/fphdlimp.cpp

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/intl/icu/source/i18n/fphdlimp.cpp	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,120 @@
     1.4 +/*
     1.5 +*******************************************************************************
     1.6 +* Copyright (C) 2009-2010, International Business Machines Corporation and
     1.7 +* others. All Rights Reserved.
     1.8 +*******************************************************************************
     1.9 +*/
    1.10 +
    1.11 +#include "unicode/utypes.h"
    1.12 +
    1.13 +#if !UCONFIG_NO_FORMATTING
    1.14 +
    1.15 +#include "fphdlimp.h"
    1.16 +#include "uvectr32.h"
    1.17 +
    1.18 +U_NAMESPACE_BEGIN
    1.19 +
    1.20 +// utility FieldPositionHandler
    1.21 +// base class, null implementation
    1.22 +
    1.23 +FieldPositionHandler::~FieldPositionHandler() {
    1.24 +}
    1.25 +
    1.26 +void
    1.27 +FieldPositionHandler::addAttribute(int32_t, int32_t, int32_t) {
    1.28 +}
    1.29 +
    1.30 +void
    1.31 +FieldPositionHandler::shiftLast(int32_t) {
    1.32 +}
    1.33 +
    1.34 +UBool
    1.35 +FieldPositionHandler::isRecording(void) {
    1.36 +  return FALSE;
    1.37 +}
    1.38 +
    1.39 +
    1.40 +// utility subclass FieldPositionOnlyHandler
    1.41 +
    1.42 +FieldPositionOnlyHandler::FieldPositionOnlyHandler(FieldPosition& _pos)
    1.43 +  : pos(_pos) {
    1.44 +}
    1.45 +
    1.46 +FieldPositionOnlyHandler::~FieldPositionOnlyHandler() {
    1.47 +}
    1.48 +
    1.49 +void
    1.50 +FieldPositionOnlyHandler::addAttribute(int32_t id, int32_t start, int32_t limit) {
    1.51 +  if (pos.getField() == id) {
    1.52 +    pos.setBeginIndex(start);
    1.53 +    pos.setEndIndex(limit);
    1.54 +  }
    1.55 +}
    1.56 +
    1.57 +void
    1.58 +FieldPositionOnlyHandler::shiftLast(int32_t delta) {
    1.59 +  if (delta != 0 && pos.getField() != FieldPosition::DONT_CARE && pos.getBeginIndex() != -1) {
    1.60 +    pos.setBeginIndex(delta + pos.getBeginIndex());
    1.61 +    pos.setEndIndex(delta + pos.getEndIndex());
    1.62 +  }
    1.63 +}
    1.64 +
    1.65 +UBool
    1.66 +FieldPositionOnlyHandler::isRecording(void) {
    1.67 +  return pos.getField() != FieldPosition::DONT_CARE;
    1.68 +}
    1.69 +
    1.70 +
    1.71 +// utility subclass FieldPositionIteratorHandler
    1.72 +
    1.73 +FieldPositionIteratorHandler::FieldPositionIteratorHandler(FieldPositionIterator* posIter,
    1.74 +                                                           UErrorCode& _status)
    1.75 +    : iter(posIter), vec(NULL), status(_status) {
    1.76 +  if (iter && U_SUCCESS(status)) {
    1.77 +    vec = new UVector32(status);
    1.78 +  }
    1.79 +}
    1.80 +
    1.81 +FieldPositionIteratorHandler::~FieldPositionIteratorHandler() {
    1.82 +  // setData adopts the vec regardless of status, so it's safe to null it
    1.83 +  if (iter) {
    1.84 +    iter->setData(vec, status);
    1.85 +  }
    1.86 +  // if iter is null, we never allocated vec, so no need to free it
    1.87 +  vec = NULL;
    1.88 +}
    1.89 +
    1.90 +void
    1.91 +FieldPositionIteratorHandler::addAttribute(int32_t id, int32_t start, int32_t limit) {
    1.92 +  if (iter && U_SUCCESS(status) && start < limit) {
    1.93 +    int32_t size = vec->size();
    1.94 +    vec->addElement(id, status);
    1.95 +    vec->addElement(start, status);
    1.96 +    vec->addElement(limit, status);
    1.97 +    if (!U_SUCCESS(status)) {
    1.98 +      vec->setSize(size);
    1.99 +    }
   1.100 +  }
   1.101 +}
   1.102 +
   1.103 +void
   1.104 +FieldPositionIteratorHandler::shiftLast(int32_t delta) {
   1.105 +  if (U_SUCCESS(status) && delta != 0) {
   1.106 +    int32_t i = vec->size();
   1.107 +    if (i > 0) {
   1.108 +      --i;
   1.109 +      vec->setElementAt(delta + vec->elementAti(i), i);
   1.110 +      --i;
   1.111 +      vec->setElementAt(delta + vec->elementAti(i), i);
   1.112 +    }
   1.113 +  }
   1.114 +}
   1.115 +
   1.116 +UBool
   1.117 +FieldPositionIteratorHandler::isRecording(void) {
   1.118 +  return U_SUCCESS(status);
   1.119 +}
   1.120 +
   1.121 +U_NAMESPACE_END
   1.122 +
   1.123 +#endif /* !UCONFIG_NO_FORMATTING */

mercurial