Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Side by Side Diff: source/common/simplepatternformatter.h

Issue 1621843002: ICU 56 update step 1 (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/icu.git@561
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « source/common/sharedobject.cpp ('k') | source/common/simplepatternformatter.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 ****************************************************************************** 2 ******************************************************************************
3 * Copyright (C) 2014, International Business Machines 3 * Copyright (C) 2014, International Business Machines
4 * Corporation and others. All Rights Reserved. 4 * Corporation and others. All Rights Reserved.
5 ****************************************************************************** 5 ******************************************************************************
6 * simplepatternformatter.h 6 * simplepatternformatter.h
7 */ 7 */
8 8
9 #ifndef __SIMPLEPATTERNFORMATTER_H__ 9 #ifndef __SIMPLEPATTERNFORMATTER_H__
10 #define __SIMPLEPATTERNFORMATTER_H__ 10 #define __SIMPLEPATTERNFORMATTER_H__
11 11
12 #define EXPECTED_PLACEHOLDER_COUNT 3 12 #define EXPECTED_PLACEHOLDER_COUNT 3
13 13
14 #include "cmemory.h" 14 #include "cmemory.h"
15 #include "unicode/utypes.h" 15 #include "unicode/utypes.h"
16 #include "unicode/unistr.h" 16 #include "unicode/unistr.h"
17 17
18 U_NAMESPACE_BEGIN 18 U_NAMESPACE_BEGIN
19 19
20 class SimplePatternFormatterPlaceholderValues;
21
20 struct PlaceholderInfo { 22 struct PlaceholderInfo {
21 int32_t id; 23 int32_t id;
22 int32_t offset; 24 int32_t offset;
23 }; 25 };
24 26
25 /** 27 /**
26 * Compiled version of a pattern string such as "{1} was born in {0}". 28 * Compiled version of a pattern string such as "{1} was born in {0}".
27 * <p> 29 * <p>
28 * Using SimplePatternFormatter is both faster and safer than adhoc replacement. 30 * Using SimplePatternFormatter is both faster and safer than adhoc replacement.
29 * They are faster because they are precompiled; they are safer because they 31 * They are faster because they are precompiled; they are safer because they
30 * account for curly braces escaped by apostrophe ('). 32 * account for curly braces escaped by apostrophe (').
31 * 33 *
32 * Placeholders are of the form \{[0-9]+\}. If a curly brace is preceded 34 * Placeholders are of the form \{[0-9]+\}. If a curly brace is preceded
33 * by a single quote, it becomes a curly brace instead of the start of a 35 * by a single quote, it becomes a curly brace instead of the start of a
34 * placeholder. Two single quotes resolve to one single quote. 36 * placeholder. Two single quotes resolve to one single quote.
35 * <p> 37 * <p>
36 * Example: 38 * Example:
37 * <pre> 39 * <pre>
38 * SimplePatternFormatter fmt("{1} '{born} in {0}"); 40 * SimplePatternFormatter fmt("{1} '{born} in {0}");
39 * UnicodeString result; 41 * UnicodeString result;
40 * UErrorCode status = U_ZERO_ERROR; 42 * UErrorCode status = U_ZERO_ERROR;
41 * // Evaluates to: "paul {born} in england" 43 * // Evaluates to: "paul {born} in england"
42 * fmt.format("englad", "paul", result, status); 44 * fmt.format("england", "paul", result, status);
43 * </pre> 45 * </pre>
44 */ 46 */
45 class U_COMMON_API SimplePatternFormatter : public UMemory { 47 class U_COMMON_API SimplePatternFormatter : public UMemory {
46 public: 48 public:
47 /** 49 /**
48 * Default constructor 50 * Default constructor
49 */ 51 */
50 SimplePatternFormatter(); 52 SimplePatternFormatter();
51 53
52 /** 54 /**
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 * <code>SimplePatternFormatter("{0} {2}").getPlaceholderCount() 86 * <code>SimplePatternFormatter("{0} {2}").getPlaceholderCount()
85 * evaluates to 3. 87 * evaluates to 3.
86 * Callers use this function to find out how many values this object 88 * Callers use this function to find out how many values this object
87 * expects when formatting. 89 * expects when formatting.
88 */ 90 */
89 int32_t getPlaceholderCount() const { 91 int32_t getPlaceholderCount() const {
90 return placeholderCount; 92 return placeholderCount;
91 } 93 }
92 94
93 /** 95 /**
94 * Returns true if the pattern this object represents starts with
95 * placeholder id; otherwise, returns false.
96 */
97 UBool startsWithPlaceholder(int32_t id) const;
98
99 /**
100 * Returns this pattern with none of the placeholders. 96 * Returns this pattern with none of the placeholders.
101 */ 97 */
102 const UnicodeString &getPatternWithNoPlaceholders() const { 98 const UnicodeString &getPatternWithNoPlaceholders() const {
103 return noPlaceholders; 99 return noPlaceholders;
104 } 100 }
105 101
106 /** 102 /**
107 * Formats given value. 103 * Formats given value. arg0 cannot be appendTo.
108 */ 104 */
109 UnicodeString &format( 105 UnicodeString &format(
110 const UnicodeString &args0, 106 const UnicodeString &args0,
111 UnicodeString &appendTo, 107 UnicodeString &appendTo,
112 UErrorCode &status) const; 108 UErrorCode &status) const;
113 109
114 /** 110 /**
115 * Formats given values. 111 * Formats given values. Neither arg0 nor arg1 can be appendTo.
116 */ 112 */
117 UnicodeString &format( 113 UnicodeString &format(
118 const UnicodeString &args0, 114 const UnicodeString &args0,
119 const UnicodeString &args1, 115 const UnicodeString &args1,
120 UnicodeString &appendTo, 116 UnicodeString &appendTo,
121 UErrorCode &status) const; 117 UErrorCode &status) const;
122 118
123 /** 119 /**
124 * Formats given values. 120 * Formats given values. Neither arg0, arg1, nor arg2 can be appendTo.
125 */ 121 */
126 UnicodeString &format( 122 UnicodeString &format(
127 const UnicodeString &args0, 123 const UnicodeString &args0,
128 const UnicodeString &args1, 124 const UnicodeString &args1,
129 const UnicodeString &args2, 125 const UnicodeString &args2,
130 UnicodeString &appendTo, 126 UnicodeString &appendTo,
131 UErrorCode &status) const; 127 UErrorCode &status) const;
132 128
133 /** 129 /**
134 * Formats given values. 130 * Formats given values.
135 * 131 *
136 * The caller retains ownership of all pointers. 132 * The caller retains ownership of all pointers.
137 * @param placeholderValues 1st one corresponds to {0}; 2nd to {1}; 133 * @param placeholderValues 1st one corresponds to {0}; 2nd to {1};
138 * 3rd to {2} etc. 134 * 3rd to {2} etc. If any of these point to appendTo, this method
135 * sets status to U_ILLEGAL_ARGUMENT_ERROR.
139 * @param placeholderValueCount the number of placeholder values 136 * @param placeholderValueCount the number of placeholder values
140 * must be at least large enough to provide values for all placeholders 137 * must be at least large enough to provide values for all placeholders
141 * in this object. Otherwise status set to U_ILLEGAL_ARGUMENT_ERROR. 138 * in this object. Otherwise status set to U_ILLEGAL_ARGUMENT_ERROR.
142 * @param appendTo resulting string appended here. Optimization: If 139 * @param appendTo resulting string appended here.
143 * the pattern this object represents starts with a placeholder AND
144 * appendTo references the value of that same placeholder, then that
145 * placeholder value is not copied to appendTo (Its already there).
146 * If the value of the starting placeholder is a very large string,
147 * this optimization can offer huge savings.
148 * @param offsetArray The offset of each placeholder value in appendTo 140 * @param offsetArray The offset of each placeholder value in appendTo
149 * stored here. The first value gets the offset of the value for {0}; 141 * stored here. The first value gets the offset of the value for {0};
150 * the 2nd for {1}; the 3rd for {2} etc. -1 means that the corresponding 142 * the 2nd for {1}; the 3rd for {2} etc. -1 means that the corresponding
151 * placeholder does not exist in this object. If caller is not 143 * placeholder does not exist in this object. If caller is not
152 * interested in offsets, it may pass NULL and 0 for the length. 144 * interested in offsets, it may pass NULL and 0 for the length.
153 * @param offsetArrayLength the size of offsetArray may be less than 145 * @param offsetArrayLength the size of offsetArray. If less than
154 * placeholderValueCount. 146 * placeholderValueCount only the first offsets get recorded. If
147 * greater than placeholderValueCount, then extra values in offset
148 * array are set to -1.
155 * @param status any error stored here. 149 * @param status any error stored here.
156 */ 150 */
157 UnicodeString &format( 151 UnicodeString &formatAndAppend(
158 const UnicodeString * const *placeholderValues, 152 const UnicodeString * const *placeholderValues,
159 int32_t placeholderValueCount, 153 int32_t placeholderValueCount,
160 UnicodeString &appendTo, 154 UnicodeString &appendTo,
161 int32_t *offsetArray, 155 int32_t *offsetArray,
162 int32_t offsetArrayLength, 156 int32_t offsetArrayLength,
163 UErrorCode &status) const; 157 UErrorCode &status) const;
158
159 /**
160 * Formats given values.
161 *
162 * The caller retains ownership of all pointers.
163 * @param placeholderValues 1st one corresponds to {0}; 2nd to {1};
164 * 3rd to {2} etc. May include pointer to result in which case
165 * the previous value of result is used for the corresponding
166 * placeholder.
167 * @param placeholderValueCount the number of placeholder values
168 * must be at least large enough to provide values for all placeholders
169 * in this object. Otherwise status set to U_ILLEGAL_ARGUMENT_ERROR.
170 * @param result resulting string stored here overwriting any previous
171 * value.
172 * @param offsetArray The offset of each placeholder value in result
173 * stored here. The first value gets the offset of the value for {0};
174 * the 2nd for {1}; the 3rd for {2} etc. -1 means that the corresponding
175 * placeholder does not exist in this object. If caller is not
176 * interested in offsets, it may pass NULL and 0 for the length.
177 * @param offsetArrayLength the size of offsetArray. If less than
178 * placeholderValueCount only the first offsets get recorded. If
179 * greater than placeholderValueCount, then extra values in offset
180 * array are set to -1.
181 * @param status any error stored here.
182 */
183 UnicodeString &formatAndReplace(
184 const UnicodeString * const *placeholderValues,
185 int32_t placeholderValueCount,
186 UnicodeString &result,
187 int32_t *offsetArray,
188 int32_t offsetArrayLength,
189 UErrorCode &status) const;
164 private: 190 private:
165 UnicodeString noPlaceholders; 191 UnicodeString noPlaceholders;
166 MaybeStackArray<PlaceholderInfo, 3> placeholders; 192 MaybeStackArray<PlaceholderInfo, 3> placeholders;
167 int32_t placeholderSize; 193 int32_t placeholderSize;
168 int32_t placeholderCount; 194 int32_t placeholderCount;
195 UBool firstPlaceholderReused;
196
197 // A Placeholder value that is the same as appendTo is treated as the
198 // empty string.
199 UnicodeString &formatAndAppend(
200 const SimplePatternFormatterPlaceholderValues &placeholderValues,
201 UnicodeString &appendTo,
202 int32_t *offsetArray,
203 int32_t offsetArrayLength) const;
204
205 // Returns the placeholder at the beginning of this pattern
206 // (e.g 3 for placeholder {3}). Returns -1 if the beginning of pattern
207 // is text or if the placeholder at the beginning of this pattern
208 // is used again in the middle of the pattern.
209 int32_t getUniquePlaceholderAtStart() const;
169 210
170 // ensureCapacity ensures that the capacity of the placeholders array 211 // ensureCapacity ensures that the capacity of the placeholders array
171 // is desiredCapacity. If ensureCapacity must resize the placeholders 212 // is desiredCapacity. If ensureCapacity must resize the placeholders
172 // array, the first placeholderSize elements stay in the array. Note 213 // array, the first placeholderSize elements stay in the array. Note
173 // that ensureCapcity NEVER changes the value of placeholderSize only 214 // that ensureCapcity NEVER changes the value of placeholderSize only
174 // the capacity of the placeholders array. 215 // the capacity of the placeholders array.
175 // If there is no memory allocation error when resizing, this 216 // If there is no memory allocation error when resizing, this
176 // function returns desiredCapacity. If there is a memory allocation 217 // function returns desiredCapacity. If there is a memory allocation
177 // error, this function leaves the placeholders array unchanged and 218 // error, this function leaves the placeholders array unchanged and
178 // returns the smaller, old capacity. ensureCapacity resizes only if 219 // returns the smaller, old capacity. ensureCapacity resizes only if
179 // the current capacity of placeholders array is less than desiredCapacity. 220 // the current capacity of placeholders array is less than desiredCapacity.
180 // Otherwise, it leaves the placeholders array unchanged. If caller 221 // Otherwise, it leaves the placeholders array unchanged. If caller
181 // specifies an allocation size, then it must be at least as large as 222 // specifies an allocation size, then it must be at least as large as
182 // desiredCapacity. In that case, if ensureCapacity resizes, it will 223 // desiredCapacity. In that case, if ensureCapacity resizes, it will
183 // allocate allocationSize spots instead of desiredCapacity spots in 224 // allocate allocationSize spots instead of desiredCapacity spots in
184 // the array. If caller is calling ensureCapacity in a loop while adding 225 // the array. If caller is calling ensureCapacity in a loop while adding
185 // elements, it is recommended that it use an allocationSize of 226 // elements, it is recommended that it use an allocationSize of
186 // approximately twice desiredCapacity to avoid memory allocation with 227 // approximately twice desiredCapacity to avoid memory allocation with
187 // every call to ensureCapacity. 228 // every call to ensureCapacity.
188 int32_t ensureCapacity(int32_t desiredCapacity, int32_t allocationSize=0); 229 int32_t ensureCapacity(int32_t desiredCapacity, int32_t allocationSize=0);
189 230
190 // Records the offset of an individual placeholder in the noPlaceholders 231 // Records the offset of an individual placeholder in the noPlaceholders
191 // string. 232 // string.
192 UBool addPlaceholder(int32_t id, int32_t offset); 233 UBool addPlaceholder(int32_t id, int32_t offset);
193 }; 234 };
194 235
195 U_NAMESPACE_END 236 U_NAMESPACE_END
196 237
197 #endif 238 #endif
OLDNEW
« no previous file with comments | « source/common/sharedobject.cpp ('k') | source/common/simplepatternformatter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698