mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-08 06:53:45 +00:00
ICU-12446 UResource sink size: move into new enter(size) method
X-SVN-Rev: 38604
This commit is contained in:
parent
62c1d90b17
commit
f4376e1e6f
8 changed files with 54 additions and 75 deletions
|
@ -76,7 +76,7 @@ public final class DayPeriodRules {
|
|||
|
||||
// Entry point.
|
||||
@Override
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key, int initialSize) {
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key) {
|
||||
if (key.contentEquals("locales")) {
|
||||
return localesSink;
|
||||
} else if (key.contentEquals("rules")) {
|
||||
|
@ -99,7 +99,7 @@ public final class DayPeriodRules {
|
|||
// Rules.
|
||||
private class RulesSink extends UResource.TableSink {
|
||||
@Override
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key, int initialSize) {
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key) {
|
||||
ruleSetNum = parseSetNum(key.toString());
|
||||
data.rules[ruleSetNum] = new DayPeriodRules();
|
||||
return ruleSetSink;
|
||||
|
@ -110,7 +110,7 @@ public final class DayPeriodRules {
|
|||
// Rules -> "set10", e.g.
|
||||
private class RuleSetSink extends UResource.TableSink {
|
||||
@Override
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key, int initialSize) {
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key) {
|
||||
period = DayPeriod.fromStringOrNull(key);
|
||||
if (period == null) { throw new ICUException("Unknown day period in data."); }
|
||||
return periodSink;
|
||||
|
@ -138,7 +138,7 @@ public final class DayPeriodRules {
|
|||
}
|
||||
|
||||
@Override
|
||||
public UResource.ArraySink getOrCreateArraySink(UResource.Key key, int initialSize) {
|
||||
public UResource.ArraySink getOrCreateArraySink(UResource.Key key) {
|
||||
cutoffType = CutoffType.fromStringOrNull(key);
|
||||
return cutoffSink;
|
||||
}
|
||||
|
@ -241,7 +241,7 @@ public final class DayPeriodRules {
|
|||
}
|
||||
|
||||
@Override
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key, int initialSize) {
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key) {
|
||||
int setNum = parseSetNum(key.toString());
|
||||
if (setNum > data.maxRuleSetNum) {
|
||||
data.maxRuleSetNum = setNum;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
*******************************************************************************
|
||||
* Copyright (C) 2004-2015, International Business Machines Corporation and
|
||||
* Copyright (C) 2004-2016, International Business Machines Corporation and
|
||||
* others. All Rights Reserved.
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
@ -723,22 +723,6 @@ public final class ICUResourceBundleReader {
|
|||
}
|
||||
}
|
||||
|
||||
private int getArrayLength(int res) {
|
||||
int offset = RES_GET_OFFSET(res);
|
||||
if(offset == 0) {
|
||||
return 0;
|
||||
}
|
||||
int type = RES_GET_TYPE(res);
|
||||
if(type == UResourceBundle.ARRAY) {
|
||||
offset = getResourceByteOffset(offset);
|
||||
return getInt(offset);
|
||||
} else if(type == ICUResourceBundle.ARRAY16) {
|
||||
return b16BitUnits.charAt(offset);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
Array getArray(int res) {
|
||||
int type=RES_GET_TYPE(res);
|
||||
if(!URES_IS_ARRAY(type)) {
|
||||
|
@ -757,25 +741,6 @@ public final class ICUResourceBundleReader {
|
|||
return (Array)resourceCache.putIfAbsent(res, array, 0);
|
||||
}
|
||||
|
||||
private int getTableLength(int res) {
|
||||
int offset = RES_GET_OFFSET(res);
|
||||
if(offset == 0) {
|
||||
return 0;
|
||||
}
|
||||
int type = RES_GET_TYPE(res);
|
||||
if(type == UResourceBundle.TABLE) {
|
||||
offset = getResourceByteOffset(offset);
|
||||
return bytes.getChar(offset);
|
||||
} else if(type == ICUResourceBundle.TABLE16) {
|
||||
return b16BitUnits.charAt(offset);
|
||||
} else if(type == ICUResourceBundle.TABLE32) {
|
||||
offset = getResourceByteOffset(offset);
|
||||
return getInt(offset);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
Table getTable(int res) {
|
||||
int type = RES_GET_TYPE(res);
|
||||
if(!URES_IS_TABLE(type)) {
|
||||
|
@ -935,23 +900,20 @@ public final class ICUResourceBundleReader {
|
|||
Array() {}
|
||||
void getAllItems(ICUResourceBundleReader reader,
|
||||
UResource.Key key, ReaderValue value, ArraySink sink) {
|
||||
sink.enter(size);
|
||||
for (int i = 0; i < size; ++i) {
|
||||
int res = getContainerResource(reader, i);
|
||||
int type = RES_GET_TYPE(res);
|
||||
if (URES_IS_ARRAY(type)) {
|
||||
int numItems = reader.getArrayLength(res);
|
||||
ArraySink subSink = sink.getOrCreateArraySink(i, numItems);
|
||||
ArraySink subSink = sink.getOrCreateArraySink(i);
|
||||
if (subSink != null) {
|
||||
Array array = reader.getArray(res);
|
||||
assert(array.size == numItems);
|
||||
array.getAllItems(reader, key, value, subSink);
|
||||
}
|
||||
} else if (URES_IS_TABLE(type)) {
|
||||
int numItems = reader.getTableLength(res);
|
||||
TableSink subSink = sink.getOrCreateTableSink(i, numItems);
|
||||
TableSink subSink = sink.getOrCreateTableSink(i);
|
||||
if (subSink != null) {
|
||||
Table table = reader.getTable(res);
|
||||
assert(table.size == numItems);
|
||||
table.getAllItems(reader, key, value, subSink);
|
||||
}
|
||||
/* TODO: settle on how to deal with aliases, port to C++
|
||||
|
@ -1031,6 +993,7 @@ public final class ICUResourceBundleReader {
|
|||
}
|
||||
void getAllItems(ICUResourceBundleReader reader,
|
||||
UResource.Key key, ReaderValue value, TableSink sink) {
|
||||
sink.enter(size);
|
||||
for (int i = 0; i < size; ++i) {
|
||||
if (keyOffsets != null) {
|
||||
reader.setKeyFromKey16(keyOffsets[i], key);
|
||||
|
@ -1040,19 +1003,15 @@ public final class ICUResourceBundleReader {
|
|||
int res = getContainerResource(reader, i);
|
||||
int type = RES_GET_TYPE(res);
|
||||
if (URES_IS_ARRAY(type)) {
|
||||
int numItems = reader.getArrayLength(res);
|
||||
ArraySink subSink = sink.getOrCreateArraySink(key, numItems);
|
||||
ArraySink subSink = sink.getOrCreateArraySink(key);
|
||||
if (subSink != null) {
|
||||
Array array = reader.getArray(res);
|
||||
assert(array.size == numItems);
|
||||
array.getAllItems(reader, key, value, subSink);
|
||||
}
|
||||
} else if (URES_IS_TABLE(type)) {
|
||||
int numItems = reader.getTableLength(res);
|
||||
TableSink subSink = sink.getOrCreateTableSink(key, numItems);
|
||||
TableSink subSink = sink.getOrCreateTableSink(key);
|
||||
if (subSink != null) {
|
||||
Table table = reader.getTable(res);
|
||||
assert(table.size == numItems);
|
||||
table.getAllItems(reader, key, value, subSink);
|
||||
}
|
||||
/* TODO: settle on how to deal with aliases, port to C++
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
*******************************************************************************
|
||||
* Copyright (C) 2011-2015, International Business Machines Corporation and
|
||||
* Copyright (C) 2011-2016, International Business Machines Corporation and
|
||||
* others. All Rights Reserved.
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
@ -325,7 +325,7 @@ public class TimeZoneNamesImpl extends TimeZoneNames {
|
|||
}
|
||||
|
||||
@Override
|
||||
public TableSink getOrCreateTableSink(UResource.Key key, int initialSize) {
|
||||
public TableSink getOrCreateTableSink(UResource.Key key) {
|
||||
ZNamesLoader loader = keyToLoader.get(key);
|
||||
if (loader != null) {
|
||||
if (loader == ZNamesLoader.DUMMY_LOADER) {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
*******************************************************************************
|
||||
* Copyright (C) 2015, International Business Machines Corporation and
|
||||
* Copyright (C) 2015-2016, International Business Machines Corporation and
|
||||
* others. All Rights Reserved.
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
@ -320,6 +320,16 @@ public final class UResource {
|
|||
* never put() as {@link Value} items.
|
||||
*/
|
||||
public static class ArraySink {
|
||||
/**
|
||||
* "Enters" the array.
|
||||
* Called just before enumerating the array's resource items.
|
||||
* The size can be used to allocate storage for the items.
|
||||
* It may differ between child and parent bundles.
|
||||
*
|
||||
* @param size number of table items
|
||||
*/
|
||||
public void enter(int size) {}
|
||||
|
||||
/**
|
||||
* Adds a value from a resource array.
|
||||
*
|
||||
|
@ -335,10 +345,9 @@ public final class UResource {
|
|||
* The default implementation always returns null.
|
||||
*
|
||||
* @param index of the resource array item
|
||||
* @param size number of array items
|
||||
* @return nested-array sink, or null
|
||||
*/
|
||||
public ArraySink getOrCreateArraySink(int index, int size) {
|
||||
public ArraySink getOrCreateArraySink(int index) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -349,10 +358,9 @@ public final class UResource {
|
|||
* The default implementation always returns null.
|
||||
*
|
||||
* @param index of the resource array item
|
||||
* @param initialSize size hint for creating the sink if necessary
|
||||
* @return nested-table sink, or null
|
||||
*/
|
||||
public TableSink getOrCreateTableSink(int index, int initialSize) {
|
||||
public TableSink getOrCreateTableSink(int index) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -372,6 +380,16 @@ public final class UResource {
|
|||
* never put() as {@link Value} items.
|
||||
*/
|
||||
public static class TableSink {
|
||||
/**
|
||||
* "Enters" the table.
|
||||
* Called just before enumerating the table's resource items.
|
||||
* The size can be used to allocate storage for the items.
|
||||
* It usually differs between child and parent bundles.
|
||||
*
|
||||
* @param size number of table items
|
||||
*/
|
||||
public void enter(int size) {}
|
||||
|
||||
/**
|
||||
* Adds a key-value pair from a resource table.
|
||||
*
|
||||
|
@ -398,10 +416,9 @@ public final class UResource {
|
|||
* The default implementation always returns null.
|
||||
*
|
||||
* @param key resource key string
|
||||
* @param size number of array items
|
||||
* @return nested-array sink, or null
|
||||
*/
|
||||
public ArraySink getOrCreateArraySink(Key key, int size) {
|
||||
public ArraySink getOrCreateArraySink(Key key) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -412,10 +429,9 @@ public final class UResource {
|
|||
* The default implementation always returns null.
|
||||
*
|
||||
* @param key resource key string
|
||||
* @param initialSize size hint for creating the sink if necessary
|
||||
* @return nested-table sink, or null
|
||||
*/
|
||||
public TableSink getOrCreateTableSink(Key key, int initialSize) {
|
||||
public TableSink getOrCreateTableSink(Key key) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
@ -435,7 +435,7 @@ public class DateIntervalInfo implements Cloneable, Freezable<DateIntervalInfo>,
|
|||
*/
|
||||
class SkeletonSink extends UResource.TableSink {
|
||||
@Override
|
||||
public TableSink getOrCreateTableSink(Key key, int initialSize) {
|
||||
public TableSink getOrCreateTableSink(Key key) {
|
||||
currentSkeleton = key.toString();
|
||||
return patternSink;
|
||||
}
|
||||
|
@ -534,7 +534,7 @@ public class DateIntervalInfo implements Cloneable, Freezable<DateIntervalInfo>,
|
|||
}
|
||||
|
||||
@Override
|
||||
public TableSink getOrCreateTableSink(Key key, int initialSize) {
|
||||
public TableSink getOrCreateTableSink(Key key) {
|
||||
// Check if it's the intervalFormats table
|
||||
if (key.contentEquals(INTERVAL_FORMATS_KEY)) {
|
||||
return skeletonSink;
|
||||
|
|
|
@ -447,7 +447,7 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
|
|||
}
|
||||
|
||||
@Override
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key, int initialSize) {
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key) {
|
||||
regionOrLocale = key.toString();
|
||||
|
||||
return formatListSink;
|
||||
|
@ -455,9 +455,8 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
|
|||
|
||||
private class FormatListSink extends UResource.TableSink {
|
||||
@Override
|
||||
public UResource.ArraySink getOrCreateArraySink(UResource.Key key, int initialSize) {
|
||||
public UResource.ArraySink getOrCreateArraySink(UResource.Key key) {
|
||||
if (key.contentEquals("allowed")) { // Ignore "preferred" list.
|
||||
formatList = new String[initialSize];
|
||||
return allowedFormatListSink;
|
||||
}
|
||||
|
||||
|
@ -467,6 +466,11 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
|
|||
private FormatListSink formatListSink = new FormatListSink();
|
||||
|
||||
private class AllowedFormatListSink extends UResource.ArraySink {
|
||||
@Override
|
||||
public void enter(int size) {
|
||||
formatList = new String[size];
|
||||
}
|
||||
|
||||
@Override
|
||||
public void put(int index, UResource.Value value) {
|
||||
formatList[index] = value.getString();
|
||||
|
|
|
@ -794,7 +794,7 @@ public class MeasureFormat extends UFormat {
|
|||
*/
|
||||
class UnitSubtypeSink extends UResource.TableSink {
|
||||
@Override
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key, int initialSize) {
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key) {
|
||||
// Should we ignore or reject unknown units?
|
||||
unit = MeasureUnit.internalGetInstance(type, key.toString()); // never null
|
||||
// Trigger a fresh lookup of the patterns for this unit+width.
|
||||
|
@ -827,7 +827,7 @@ public class MeasureFormat extends UFormat {
|
|||
*/
|
||||
class UnitTypeSink extends UResource.TableSink {
|
||||
@Override
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key, int initialSize) {
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key) {
|
||||
if (key.contentEquals("currency")) {
|
||||
// Skip.
|
||||
} else if (key.contentEquals("compound")) {
|
||||
|
@ -871,7 +871,7 @@ public class MeasureFormat extends UFormat {
|
|||
cacheData.widthFallback[sourceWidth.ordinal()] = targetWidth;
|
||||
}
|
||||
@Override
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key, int initialSize) {
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key) {
|
||||
if ((width = widthFromKey(key)) != null) {
|
||||
return typeSink;
|
||||
}
|
||||
|
|
|
@ -1063,7 +1063,7 @@ public final class RelativeDateTimeFormatter {
|
|||
}
|
||||
|
||||
@Override
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key, int initialSize) {
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key) {
|
||||
// Get base unit and style from the key value.
|
||||
style = styleFromKey(key);
|
||||
int limit = key.length() - styleSuffixLength(style);
|
||||
|
@ -1112,7 +1112,7 @@ public final class RelativeDateTimeFormatter {
|
|||
// Handles "relativeTime" entries, e.g., under "day", "hour", "minute", "minute-short", etc.
|
||||
class RelativeTimeSink extends UResource.TableSink {
|
||||
@Override
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key, int initialSize) {
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key) {
|
||||
if (key.contentEquals("past")) {
|
||||
pastFutureIndex = 0;
|
||||
} else if (key.contentEquals("future")) {
|
||||
|
@ -1208,7 +1208,7 @@ public final class RelativeDateTimeFormatter {
|
|||
}
|
||||
|
||||
@Override
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key, int initialSize) {
|
||||
public UResource.TableSink getOrCreateTableSink(UResource.Key key) {
|
||||
if (key.contentEquals("relative")) {
|
||||
return relativeSink;
|
||||
} else if (key.contentEquals("relativeTime")) {
|
||||
|
|
Loading…
Add table
Reference in a new issue