]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/i18n/fphdlimp.cpp
ICU-64243.0.1.tar.gz
[apple/icu.git] / icuSources / i18n / fphdlimp.cpp
index a8fa6f46e60025b20e78663d0afb8b4919e52b9c..f51bf4bae7889c12ac8c8f62897df4558ba068ac 100644 (file)
@@ -1,3 +1,5 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 *******************************************************************************
 * Copyright (C) 2009-2015, International Business Machines Corporation and
@@ -20,17 +22,8 @@ U_NAMESPACE_BEGIN
 FieldPositionHandler::~FieldPositionHandler() {
 }
 
-void
-FieldPositionHandler::addAttribute(int32_t, int32_t, int32_t) {
-}
-
-void
-FieldPositionHandler::shiftLast(int32_t) {
-}
-
-UBool
-FieldPositionHandler::isRecording(void) const {
-  return FALSE;
+void FieldPositionHandler::setShift(int32_t delta) {
+  fShift = delta;
 }
 
 
@@ -45,9 +38,10 @@ FieldPositionOnlyHandler::~FieldPositionOnlyHandler() {
 
 void
 FieldPositionOnlyHandler::addAttribute(int32_t id, int32_t start, int32_t limit) {
-  if (pos.getField() == id) {
-    pos.setBeginIndex(start);
-    pos.setEndIndex(limit);
+  if (pos.getField() == id && (!acceptFirstOnly || !seenFirst)) {
+    seenFirst = TRUE;
+    pos.setBeginIndex(start + fShift);
+    pos.setEndIndex(limit + fShift);
   }
 }
 
@@ -64,17 +58,27 @@ FieldPositionOnlyHandler::isRecording(void) const {
   return pos.getField() != FieldPosition::DONT_CARE;
 }
 
+void FieldPositionOnlyHandler::setAcceptFirstOnly(UBool acceptFirstOnly) {
+  this->acceptFirstOnly = acceptFirstOnly;
+}
+
 
 // utility subclass FieldPositionIteratorHandler
 
 FieldPositionIteratorHandler::FieldPositionIteratorHandler(FieldPositionIterator* posIter,
                                                            UErrorCode& _status)
-    : iter(posIter), vec(NULL), status(_status) {
+    : iter(posIter), vec(NULL), status(_status), fCategory(UFIELD_CATEGORY_UNDEFINED) {
   if (iter && U_SUCCESS(status)) {
     vec = new UVector32(status);
   }
 }
 
+FieldPositionIteratorHandler::FieldPositionIteratorHandler(
+    UVector32* vec,
+    UErrorCode& status)
+    : iter(nullptr), vec(vec), status(status), fCategory(UFIELD_CATEGORY_UNDEFINED) {
+}
+
 FieldPositionIteratorHandler::~FieldPositionIteratorHandler() {
   // setData adopts the vec regardless of status, so it's safe to null it
   if (iter) {
@@ -86,11 +90,12 @@ FieldPositionIteratorHandler::~FieldPositionIteratorHandler() {
 
 void
 FieldPositionIteratorHandler::addAttribute(int32_t id, int32_t start, int32_t limit) {
-  if (iter && U_SUCCESS(status) && start < limit) {
+  if (vec && U_SUCCESS(status) && start < limit) {
     int32_t size = vec->size();
+    vec->addElement(fCategory, status);
     vec->addElement(id, status);
-    vec->addElement(start, status);
-    vec->addElement(limit, status);
+    vec->addElement(start + fShift, status);
+    vec->addElement(limit + fShift, status);
     if (!U_SUCCESS(status)) {
       vec->setSize(size);
     }