]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/i18n/fphdlimp.h
ICU-64260.0.1.tar.gz
[apple/icu.git] / icuSources / i18n / fphdlimp.h
index 6071580b7ff42525eb7436328eee7174c0f6aad1..00937830fe7b801463c81bfa31ab6dc3d2d7d4c8 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    *
 #ifndef FPHDLIMP_H
 #define FPHDLIMP_H
 
+#include "unicode/utypes.h"
+
 #if !UCONFIG_NO_FORMATTING
 
-#include "unicode/utypes.h"
 #include "unicode/fieldpos.h"
 #include "unicode/fpositer.h"
+#include "unicode/formattedvalue.h"
 
 U_NAMESPACE_BEGIN
 
@@ -20,11 +24,16 @@ U_NAMESPACE_BEGIN
 // base class, null implementation
 
 class U_I18N_API FieldPositionHandler: public UMemory {
+ protected:
+  int32_t fShift = 0;
+
  public:
   virtual ~FieldPositionHandler();
-  virtual void addAttribute(int32_t id, int32_t start, int32_t limit);
-  virtual void shiftLast(int32_t delta);
-  virtual UBool isRecording(void) const;
+  virtual void addAttribute(int32_t id, int32_t start, int32_t limit) = 0;
+  virtual void shiftLast(int32_t delta) = 0;
+  virtual UBool isRecording(void) const = 0;
+
+  void setShift(int32_t delta);
 };
 
 
@@ -32,14 +41,23 @@ class U_I18N_API FieldPositionHandler: public UMemory {
 
 class FieldPositionOnlyHandler : public FieldPositionHandler {
   FieldPosition& pos;
+  UBool acceptFirstOnly = FALSE;
+  UBool seenFirst = FALSE;
 
  public:
   FieldPositionOnlyHandler(FieldPosition& pos);
   virtual ~FieldPositionOnlyHandler();
 
-  virtual void addAttribute(int32_t id, int32_t start, int32_t limit);
-  virtual void shiftLast(int32_t delta);
-  virtual UBool isRecording(void) const;
+  void addAttribute(int32_t id, int32_t start, int32_t limit) U_OVERRIDE;
+  void shiftLast(int32_t delta) U_OVERRIDE;
+  UBool isRecording(void) const U_OVERRIDE;
+
+  /**
+   * Enable this option to lock in the FieldPosition value after seeing the
+   * first occurrence of the field. The default behavior is to take the last
+   * occurrence.
+   */
+  void setAcceptFirstOnly(UBool acceptFirstOnly);
 };
 
 
@@ -49,21 +67,38 @@ class FieldPositionIteratorHandler : public FieldPositionHandler {
   FieldPositionIterator* iter; // can be NULL
   UVector32* vec;
   UErrorCode status;
+  UFieldCategory fCategory;
 
   // Note, we keep a reference to status, so if status is on the stack, we have
   // to be destroyed before status goes out of scope.  Easiest thing is to
   // allocate us on the stack in the same (or narrower) scope as status has.
   // This attempts to encourage that by blocking heap allocation.
-  void *operator new(size_t s);
-  void *operator new[](size_t s);
+  static void* U_EXPORT2 operator new(size_t) U_NOEXCEPT = delete;
+  static void* U_EXPORT2 operator new[](size_t) U_NOEXCEPT = delete;
+#if U_HAVE_PLACEMENT_NEW
+  static void* U_EXPORT2 operator new(size_t, void*) U_NOEXCEPT = delete;
+#endif
 
  public:
   FieldPositionIteratorHandler(FieldPositionIterator* posIter, UErrorCode& status);
+  /** If using this constructor, you must call getError() when done formatting! */
+  FieldPositionIteratorHandler(UVector32* vec, UErrorCode& status);
   ~FieldPositionIteratorHandler();
 
-  virtual void addAttribute(int32_t id, int32_t start, int32_t limit);
-  virtual void shiftLast(int32_t delta);
-  virtual UBool isRecording(void) const;
+  void addAttribute(int32_t id, int32_t start, int32_t limit) U_OVERRIDE;
+  void shiftLast(int32_t delta) U_OVERRIDE;
+  UBool isRecording(void) const U_OVERRIDE;
+
+  /** Copies a failed error code into _status. */
+  inline void getError(UErrorCode& _status) {
+    if (U_SUCCESS(_status) && U_FAILURE(status)) {
+      _status = status;
+    }
+  }
+
+  inline void setCategory(UFieldCategory category) {
+    fCategory = category;
+  }
 };
 
 U_NAMESPACE_END