ICU-12446 UResource sink size: move into new enter(size) method

X-SVN-Rev: 38604
This commit is contained in:
Markus Scherer 2016-04-06 23:40:59 +00:00
parent 62c1d90b17
commit f4376e1e6f
8 changed files with 54 additions and 75 deletions

View file

@ -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;

View file

@ -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++

View file

@ -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) {

View file

@ -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;
}

View file

@ -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;

View file

@ -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();

View file

@ -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;
}

View file

@ -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")) {