Skip to content

Commit

Permalink
Encoding tri-state into a byte
Browse files Browse the repository at this point in the history
  • Loading branch information
JaroslavTulach committed Feb 24, 2025
1 parent 91008a5 commit 4bf1ad7
Showing 1 changed file with 17 additions and 26 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
package org.enso.interpreter.runtime.data.text;

import java.util.ArrayDeque;

import org.enso.interpreter.dsl.Builtin;
import org.enso.interpreter.node.expression.builtin.text.util.ToJavaStringNode;
import org.enso.interpreter.runtime.builtin.BuiltinObject;
import org.enso.polyglot.common_utils.Core_Text_Utils;

import com.ibm.icu.text.Normalizer2;
import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.dsl.Cached;
Expand All @@ -8,26 +15,14 @@
import com.oracle.truffle.api.library.ExportMessage;
import com.oracle.truffle.api.strings.TruffleString;
import com.oracle.truffle.api.strings.TruffleString.Encoding;
import java.util.ArrayDeque;
import java.util.Deque;
import org.enso.interpreter.dsl.Builtin;
import org.enso.interpreter.node.expression.builtin.text.util.ToJavaStringNode;
import org.enso.interpreter.runtime.builtin.BuiltinObject;
import org.enso.polyglot.common_utils.Core_Text_Utils;

/** Runtime representation of Enso's Text. */
@ExportLibrary(InteropLibrary.class)
public final class Text extends BuiltinObject {
private static final Text EMPTY = new Text("");
private Object contents;
private int length = -1;
private FcdNormalized fcdNormalized = FcdNormalized.UNKNOWN;

private enum FcdNormalized {
YES,
NO,
UNKNOWN
}
private byte fcdNormalized;

private Text(String string) {
assert string != null;
Expand Down Expand Up @@ -78,23 +73,19 @@ public long length() {
"14.95€".is_normalized
""")
@CompilerDirectives.TruffleBoundary
public boolean is_normalized() {
switch (fcdNormalized) {
case YES -> {
return true;
}
case NO -> {
return false;
}
case UNKNOWN -> {
return switch (fcdNormalized) {
case 1 -> true;
case -1 -> false;
case 0 -> {
CompilerDirectives.transferToInterpreter();
Normalizer2 normalizer = Normalizer2.getNFDInstance();
boolean isNormalized = normalizer.isNormalized(toString());
fcdNormalized = isNormalized ? FcdNormalized.YES : FcdNormalized.NO;
return isNormalized;
fcdNormalized = (byte) (isNormalized ? 1 : -1);
yield isNormalized;
}
}
return false;
default -> false;
};
}

public static Text empty() {
Expand Down

0 comments on commit 4bf1ad7

Please sign in to comment.