@Override
public boolean add(final int[] ngram, final int startPos, final int endPos, final int ngramOrder, final long offset, final long contextOffset,
final int word, final PhraseTableValues val, final long suffixOffset, final boolean ngramIsNew) {
assert !map.isReversed();
final boolean isSourceSidePhrase = !containsSeparator(ngram, startPos, endPos);
if (isSourceSidePhrase) {
addNewSrcPhrase(ngramOrder, offset);
} else if (val instanceof FeaturePhraseTableValues && ((FeaturePhraseTableValues) val).features != null) {
addFeaturesForWholePhrase(ngramOrder, offset, val);
addPointerToTargetSidePhrase(ngramOrder, offset, contextOffset, word);
} else if (ngramIsNew) {
assert val instanceof TargetTranslationsValues || ((FeaturePhraseTableValues) val).features == null;
growValueIndexArrayIfNecessary(ngramOrder);
valueIndexes[ngramOrder].setAndGrowIfNeeded((int) (offset), EMPTY_VALUE_INDEX);
}
return true;
}