Split ICU UText providers out into their own files
[WebKit-https.git] / Source / WebCore / platform / text / icu / UTextProvider.h
1 /*
2  * Copyright (C) 2014 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef UTextProvider_h
27 #define UTextProvider_h
28
29 #include <unicode/utext.h>
30 #include <wtf/unicode/Unicode.h>
31
32 namespace WebCore {
33
34 enum class UTextProviderContext {
35     NoContext,
36     PriorContext,
37     PrimaryContext
38 };
39
40 inline UTextProviderContext uTextProviderContext(const UText* text, int64_t nativeIndex, UBool forward)
41 {
42     if (!text->b || nativeIndex > text->b)
43         return UTextProviderContext::PrimaryContext;
44     if (nativeIndex == text->b)
45         return forward ? UTextProviderContext::PrimaryContext : UTextProviderContext::PriorContext;
46     return UTextProviderContext::PriorContext;
47 }
48
49 inline void uTextInitialize(UText* text, const UTextFuncs* funcs, const void* string, unsigned length, const UChar* priorContext, int priorContextLength)
50 {
51     text->pFuncs = funcs;
52     text->providerProperties = 1 << UTEXT_PROVIDER_STABLE_CHUNKS;
53     text->context = string;
54     text->p = string;
55     text->a = length;
56     text->q = priorContext;
57     text->b = priorContextLength;
58 }
59
60 // Shared implementation for the UTextClone function on UTextFuncs.
61
62 UText* uTextCloneImpl(UText* destination, const UText* source, UBool deep, UErrorCode* status);
63
64
65 // Helpers for the UTextAccess function on UTextFuncs.
66
67 inline int64_t uTextAccessPinIndex(int64_t& index, int64_t limit)
68 {
69     if (index < 0)
70         index = 0;
71     else if (index > limit)
72         index = limit;
73     return index;
74 }
75
76 inline bool uTextAccessInChunkOrOutOfRange(UText* text, int64_t nativeIndex, int64_t nativeLength, UBool forward, UBool& isAccessible)
77 {
78     if (forward) {
79         if (nativeIndex >= text->chunkNativeStart && nativeIndex < text->chunkNativeLimit) {
80             int64_t offset = nativeIndex - text->chunkNativeStart;
81             // Ensure chunk offset is well formed if computed offset exceeds int32_t range.
82             ASSERT(offset < std::numeric_limits<int32_t>::max());
83             text->chunkOffset = offset < std::numeric_limits<int32_t>::max() ? static_cast<int32_t>(offset) : 0;
84             isAccessible = TRUE;
85             return true;
86         }
87         if (nativeIndex >= nativeLength && text->chunkNativeLimit == nativeLength) {
88             text->chunkOffset = text->chunkLength;
89             isAccessible = FALSE;
90             return true;
91         }
92     } else {
93         if (nativeIndex > text->chunkNativeStart && nativeIndex <= text->chunkNativeLimit) {
94             int64_t offset = nativeIndex - text->chunkNativeStart;
95             // Ensure chunk offset is well formed if computed offset exceeds int32_t range.
96             ASSERT(offset < std::numeric_limits<int32_t>::max());
97             text->chunkOffset = offset < std::numeric_limits<int32_t>::max() ? static_cast<int32_t>(offset) : 0;
98             isAccessible = TRUE;
99             return true;
100         }
101         if (nativeIndex <= 0 && !text->chunkNativeStart) {
102             text->chunkOffset = 0;
103             isAccessible = FALSE;
104             return true;
105         }
106     }
107     return false;
108 }
109
110 } // namespace WebCore
111
112 #endif // UTextProvider_h