You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
3.3 KiB
110 lines
3.3 KiB
4 months ago
|
// © 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 *
|
||
|
* others. All Rights Reserved. *
|
||
|
*******************************************************************************
|
||
|
*/
|
||
|
|
||
|
#ifndef FPHDLIMP_H
|
||
|
#define FPHDLIMP_H
|
||
|
|
||
|
#include "unicode/utypes.h"
|
||
|
|
||
|
#if !UCONFIG_NO_FORMATTING
|
||
|
|
||
|
#include "unicode/fieldpos.h"
|
||
|
#include "unicode/fpositer.h"
|
||
|
#include "unicode/formattedvalue.h"
|
||
|
|
||
|
U_NAMESPACE_BEGIN
|
||
|
|
||
|
// utility FieldPositionHandler
|
||
|
// 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) = 0;
|
||
|
virtual void shiftLast(int32_t delta) = 0;
|
||
|
virtual UBool isRecording(void) const = 0;
|
||
|
|
||
|
void setShift(int32_t delta);
|
||
|
};
|
||
|
|
||
|
|
||
|
// utility subclass FieldPositionOnlyHandler
|
||
|
|
||
|
class FieldPositionOnlyHandler : public FieldPositionHandler {
|
||
|
FieldPosition& pos;
|
||
|
UBool acceptFirstOnly = false;
|
||
|
UBool seenFirst = false;
|
||
|
|
||
|
public:
|
||
|
FieldPositionOnlyHandler(FieldPosition& pos);
|
||
|
virtual ~FieldPositionOnlyHandler();
|
||
|
|
||
|
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);
|
||
|
};
|
||
|
|
||
|
|
||
|
// utility subclass FieldPositionIteratorHandler
|
||
|
// exported as U_I18N_API for tests
|
||
|
|
||
|
class U_I18N_API 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.
|
||
|
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();
|
||
|
|
||
|
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
|
||
|
|
||
|
#endif /* !UCONFIG_NO_FORMATTING */
|
||
|
|
||
|
#endif /* FPHDLIMP_H */
|