1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************
3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius*   Copyright (C) 2001-2014, International Business Machines
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File ucoleitr.cpp
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History:
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Date        Name        Description
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 02/15/2001  synwee      Modified all methods to process its own function
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*                         instead of calling the equivalent c++ api (coleitr.h)
14fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius* 2012-2014   markus      Rewritten in C++ again.
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************/
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_COLLATION
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "unicode/coleitr.h"
22fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "unicode/tblcoll.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucoleitr.h"
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/sortkey.h"
26c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#include "unicode/uobject.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
28fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#include "usrchimp.h"
29fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
30fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_USE
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define BUFFER_LENGTH             100
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
36c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define DEFAULT_BUFFER_SIZE 16
37c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define BUFFER_GROW 8
38c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
39c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define ARRAY_SIZE(array) (sizeof array / sizeof array[0])
40c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
41c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define ARRAY_COPY(dst, src, count) uprv_memcpy((void *) (dst), (void *) (src), (count) * sizeof (src)[0])
42c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
43c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define NEW_ARRAY(type, count) (type *) uprv_malloc((count) * sizeof(type))
44c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
45c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define GROW_ARRAY(array, newSize) uprv_realloc((void *) (array), (newSize) * sizeof (array)[0])
46c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
47c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define DELETE_ARRAY(array) uprv_free((void *) (array))
48c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
49c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustruct RCEI
50c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
51c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    uint32_t ce;
52c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t  low;
53c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t  high;
54c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru};
55c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
56c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruU_NAMESPACE_BEGIN
57c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
58c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustruct RCEBuffer
59c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
60c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    RCEI    defaultBuffer[DEFAULT_BUFFER_SIZE];
61c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    RCEI   *buffer;
62c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t bufferIndex;
63c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t bufferSize;
64c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
65c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    RCEBuffer();
66c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    ~RCEBuffer();
67c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
68c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UBool empty() const;
69c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    void  put(uint32_t ce, int32_t ixLow, int32_t ixHigh);
70c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    const RCEI *get();
71c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru};
72c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
73c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruRCEBuffer::RCEBuffer()
74c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
75c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    buffer = defaultBuffer;
76c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    bufferIndex = 0;
77fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    bufferSize = LENGTHOF(defaultBuffer);
78c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
79c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
80c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruRCEBuffer::~RCEBuffer()
81c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
82c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (buffer != defaultBuffer) {
83c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        DELETE_ARRAY(buffer);
84c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
85c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
86c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
87c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruUBool RCEBuffer::empty() const
88c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
89c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    return bufferIndex <= 0;
90c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
91c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
92c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid RCEBuffer::put(uint32_t ce, int32_t ixLow, int32_t ixHigh)
93c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
94c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (bufferIndex >= bufferSize) {
95c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        RCEI *newBuffer = NEW_ARRAY(RCEI, bufferSize + BUFFER_GROW);
96c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
97c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        ARRAY_COPY(newBuffer, buffer, bufferSize);
98c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
99c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (buffer != defaultBuffer) {
100c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            DELETE_ARRAY(buffer);
101c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
102c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
103c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        buffer = newBuffer;
104c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        bufferSize += BUFFER_GROW;
105c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
106c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
107c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    buffer[bufferIndex].ce   = ce;
108c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    buffer[bufferIndex].low  = ixLow;
109c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    buffer[bufferIndex].high = ixHigh;
110c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
111c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    bufferIndex += 1;
112c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
113c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
114c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruconst RCEI *RCEBuffer::get()
115c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
116c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (bufferIndex > 0) {
117c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     return &buffer[--bufferIndex];
118c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
119c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
120c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    return NULL;
121c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
122c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
123c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruPCEBuffer::PCEBuffer()
124c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
125c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    buffer = defaultBuffer;
126c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    bufferIndex = 0;
127fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    bufferSize = LENGTHOF(defaultBuffer);
128c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
129c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
130c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruPCEBuffer::~PCEBuffer()
131c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
132c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (buffer != defaultBuffer) {
133c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        DELETE_ARRAY(buffer);
134c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
135c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
136c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
137c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid PCEBuffer::reset()
138c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
139c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    bufferIndex = 0;
140c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
141c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
142c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruUBool PCEBuffer::empty() const
143c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
144c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    return bufferIndex <= 0;
145c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
146c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
147c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid PCEBuffer::put(uint64_t ce, int32_t ixLow, int32_t ixHigh)
148c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
149c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (bufferIndex >= bufferSize) {
150c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        PCEI *newBuffer = NEW_ARRAY(PCEI, bufferSize + BUFFER_GROW);
151c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
152c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        ARRAY_COPY(newBuffer, buffer, bufferSize);
153c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
154c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (buffer != defaultBuffer) {
155c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            DELETE_ARRAY(buffer);
156c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
157c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
158c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        buffer = newBuffer;
159c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        bufferSize += BUFFER_GROW;
160c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
161c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
162c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    buffer[bufferIndex].ce   = ce;
163c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    buffer[bufferIndex].low  = ixLow;
164c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    buffer[bufferIndex].high = ixHigh;
165c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
166c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    bufferIndex += 1;
167c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
168c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
169c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruconst PCEI *PCEBuffer::get()
170c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
171c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (bufferIndex > 0) {
172c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     return &buffer[--bufferIndex];
173c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
174c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
175c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    return NULL;
176c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
177c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
178fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusUCollationPCE::UCollationPCE(UCollationElements *elems) { init(elems); }
179c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
180fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusUCollationPCE::UCollationPCE(CollationElementIterator *iter) { init(iter); }
181c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
182fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid UCollationPCE::init(UCollationElements *elems) {
183fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    init(CollationElementIterator::fromUCollationElements(elems));
184fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius}
185c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
186fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid UCollationPCE::init(CollationElementIterator *iter)
187c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
188fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    cei = iter;
189fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    init(*iter->rbc_);
190c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
191c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
192fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusvoid UCollationPCE::init(const Collator &coll)
193c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
194c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
195c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
196fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    strength    = coll.getAttribute(UCOL_STRENGTH, status);
197fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    toShift     = coll.getAttribute(UCOL_ALTERNATE_HANDLING, status) == UCOL_SHIFTED;
198c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    isShifted   = FALSE;
199fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    variableTop = coll.getVariableTop(status);
200c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
201c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
202c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruUCollationPCE::~UCollationPCE()
203c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
204c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // nothing to do
205c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
206c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
207fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusuint64_t UCollationPCE::processCE(uint32_t ce)
208c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
209c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    uint64_t primary = 0, secondary = 0, tertiary = 0, quaternary = 0;
210c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
211c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // This is clean, but somewhat slow...
212c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // We could apply the mask to ce and then
213c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // just get all three orders...
214fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    switch(strength) {
215c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    default:
216c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        tertiary = ucol_tertiaryOrder(ce);
217c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        /* note fall-through */
218c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
219c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    case UCOL_SECONDARY:
220c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        secondary = ucol_secondaryOrder(ce);
221c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        /* note fall-through */
222c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
223c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    case UCOL_PRIMARY:
224c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        primary = ucol_primaryOrder(ce);
225c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
226c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
227b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // **** This should probably handle continuations too.  ****
228b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // **** That means that we need 24 bits for the primary ****
229b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // **** instead of the 16 that we're currently using.   ****
230b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // **** So we can lay out the 64 bits as: 24.12.12.16.  ****
231b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // **** Another complication with continuations is that ****
232b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // **** the *second* CE is marked as a continuation, so ****
233b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // **** we always have to peek ahead to know how long   ****
234b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // **** the primary is...                               ****
235fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if ((toShift && variableTop > ce && primary != 0)
236fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                || (isShifted && primary == 0)) {
237c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
238c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (primary == 0) {
239c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            return UCOL_IGNORABLE;
240c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
241c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
242fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        if (strength >= UCOL_QUATERNARY) {
243c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            quaternary = primary;
244c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
245c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
246c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        primary = secondary = tertiary = 0;
247fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        isShifted = TRUE;
248c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    } else {
249fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        if (strength >= UCOL_QUATERNARY) {
250c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            quaternary = 0xFFFF;
251c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
252c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
253fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        isShifted = FALSE;
254c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
255c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
256c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    return primary << 48 | secondary << 32 | tertiary << 16 | quaternary;
257c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
258c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
259fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_NAMESPACE_END
260c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* public methods ---------------------------------------------------- */
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UCollationElements* U_EXPORT2
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_openElements(const UCollator  *coll,
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  const UChar      *text,
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        int32_t    textLength,
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UErrorCode *status)
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
269c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_FAILURE(*status)) {
270c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return NULL;
271c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
272fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (coll == NULL || (text == NULL && textLength != 0)) {
273fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        *status = U_ILLEGAL_ARGUMENT_ERROR;
274fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return NULL;
275fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    }
276fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const RuleBasedCollator *rbc = RuleBasedCollator::rbcFromUCollator(coll);
277fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (rbc == NULL) {
278fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        *status = U_UNSUPPORTED_ERROR;  // coll is a Collator but not a RuleBasedCollator
279c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return NULL;
280c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
28150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
282fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString s((UBool)(textLength < 0), text, textLength);
283fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    CollationElementIterator *cei = rbc->createCollationElementIterator(s);
284fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (cei == NULL) {
285fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        *status = U_MEMORY_ALLOCATION_ERROR;
286fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return NULL;
287c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
289fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return cei->toUCollationElements();
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
292b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_closeElements(UCollationElements *elems)
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
296fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    delete CollationElementIterator::fromUCollationElements(elems);
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_reset(UCollationElements *elems)
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
302fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    CollationElementIterator::fromUCollationElements(elems)->reset();
303b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
304b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_next(UCollationElements *elems,
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UErrorCode         *status)
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
309c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_FAILURE(*status)) {
310c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return UCOL_NULLORDER;
311c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
313fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return CollationElementIterator::fromUCollationElements(elems)->next(*status);
314c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
315c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
316fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_NAMESPACE_BEGIN
317fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
318fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusint64_t
319fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusUCollationPCE::nextProcessed(
320c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                   int32_t            *ixLow,
321c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                   int32_t            *ixHigh,
322c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                   UErrorCode         *status)
323c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
324c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int64_t result = UCOL_IGNORABLE;
325c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    uint32_t low = 0, high = 0;
326c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
327c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_FAILURE(*status)) {
328c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return UCOL_PROCESSED_NULLORDER;
329c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
330c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
331fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    pceBuffer.reset();
332c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
333c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    do {
334fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        low = cei->getOffset();
335fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        int32_t ce = cei->next(*status);
336fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        high = cei->getOffset();
337c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
338fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        if (ce == UCOL_NULLORDER) {
339c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru             result = UCOL_PROCESSED_NULLORDER;
340c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru             break;
341c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
342c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
343fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        result = processCE((uint32_t)ce);
344c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    } while (result == UCOL_IGNORABLE);
345c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
346c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (ixLow != NULL) {
347c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        *ixLow = low;
348c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
349c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
350c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (ixHigh != NULL) {
351c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        *ixHigh = high;
352c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
353c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
354c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    return result;
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
357fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_NAMESPACE_END
358fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_previous(UCollationElements *elems,
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UErrorCode         *status)
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
363c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if(U_FAILURE(*status)) {
364c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return UCOL_NULLORDER;
365c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
366fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return CollationElementIterator::fromUCollationElements(elems)->previous(*status);
367c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
368c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
369fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_NAMESPACE_BEGIN
370fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
371fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusint64_t
372fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusUCollationPCE::previousProcessed(
373c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                   int32_t            *ixLow,
374c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                   int32_t            *ixHigh,
375c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                   UErrorCode         *status)
376c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{
377c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int64_t result = UCOL_IGNORABLE;
378c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t  low = 0, high = 0;
379c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
380c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_FAILURE(*status)) {
381c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return UCOL_PROCESSED_NULLORDER;
382c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
384fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // pceBuffer.reset();
385c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
386fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    while (pceBuffer.empty()) {
387c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // buffer raw CEs up to non-ignorable primary
388c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        RCEBuffer rceb;
389fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        int32_t ce;
390c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
391c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // **** do we need to reset rceb, or will it always be empty at this point ****
392c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        do {
393fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            high = cei->getOffset();
394fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            ce   = cei->previous(*status);
395fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            low  = cei->getOffset();
396c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
397fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            if (ce == UCOL_NULLORDER) {
398c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                if (! rceb.empty()) {
399c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    break;
400c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                }
401c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
402c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                goto finish;
403c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
404c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
405fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            rceb.put((uint32_t)ce, low, high);
406fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        } while ((ce & UCOL_PRIMARYORDERMASK) == 0 || isContinuation(ce));
407c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
408c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // process the raw CEs
409c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        while (! rceb.empty()) {
410c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            const RCEI *rcei = rceb.get();
411c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
412fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius            result = processCE(rcei->ce);
413c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
414c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            if (result != UCOL_IGNORABLE) {
415fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius                pceBuffer.put(result, rcei->low, rcei->high);
416c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
417c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
418c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
420c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querufinish:
421fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if (pceBuffer.empty()) {
422c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // **** Is -1 the right value for ixLow, ixHigh? ****
423c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    	if (ixLow != NULL) {
424c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    		*ixLow = -1;
425c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    	}
426c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
427c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    	if (ixHigh != NULL) {
428c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    		*ixHigh = -1
429c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    		;
430c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    	}
431c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return UCOL_PROCESSED_NULLORDER;
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
434fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    const PCEI *pcei = pceBuffer.get();
435c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
436c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (ixLow != NULL) {
437c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        *ixLow = pcei->low;
438c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
439c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
440c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (ixHigh != NULL) {
441c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        *ixHigh = pcei->high;
442c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
443c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
444c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    return pcei->ce;
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
447fceb39872958b9fa2505e63f8b8699a9e0f882f4ccorneliusU_NAMESPACE_END
448fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_getMaxExpansion(const UCollationElements *elems,
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           int32_t            order)
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
453fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return CollationElementIterator::fromUCollationElements(elems)->getMaxExpansion(order);
454c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
455fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // TODO: The old code masked the order according to strength and then did a binary search.
456fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // However this was probably at least partially broken because of the following comment.
457fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    // Still, it might have found a match when this version may not.
458c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
459c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // FIXME: with a masked search, there might be more than one hit,
460c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // so we need to look forward and backward from the match to find all
461c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // of the hits...
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
463fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_setText(      UCollationElements *elems,
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             const UChar              *text,
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   int32_t            textLength,
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   UErrorCode         *status)
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
470c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_FAILURE(*status)) {
471c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
472c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
474fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    if ((text == NULL && textLength != 0)) {
475fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        *status = U_ILLEGAL_ARGUMENT_ERROR;
476fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius        return;
47750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
478fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString s((UBool)(textLength < 0), text, textLength);
479fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return CollationElementIterator::fromUCollationElements(elems)->setText(s, *status);
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_getOffset(const UCollationElements *elems)
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
485fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return CollationElementIterator::fromUCollationElements(elems)->getOffset();
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_setOffset(UCollationElements    *elems,
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               int32_t           offset,
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UErrorCode            *status)
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
493c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (U_FAILURE(*status)) {
494c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return;
495c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
497fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    CollationElementIterator::fromUCollationElements(elems)->setOffset(offset, *status);
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_primaryOrder (int32_t order)
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
503fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return (order >> 16) & 0xffff;
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_secondaryOrder (int32_t order)
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
509fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return (order >> 8) & 0xff;
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucol_tertiaryOrder (int32_t order)
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
515fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return order & 0xff;
516b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
517b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_COLLATION */
519