diff graal/com.oracle.truffle.ruby.runtime/src/com/oracle/truffle/ruby/runtime/core/range/FixnumRange.java @ 13514:0fbee3eb71f0

Ruby: import project.
author Chris Seaton <chris.seaton@oracle.com>
date Mon, 06 Jan 2014 17:12:09 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.truffle.ruby.runtime/src/com/oracle/truffle/ruby/runtime/core/range/FixnumRange.java	Mon Jan 06 17:12:09 2014 +0000
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. This
+ * code is released under a tri EPL/GPL/LGPL license. You can use it,
+ * redistribute it and/or modify it under the terms of the:
+ *
+ * Eclipse Public License version 1.0
+ * GNU General Public License version 2
+ * GNU Lesser General Public License version 2.1
+ */
+package com.oracle.truffle.ruby.runtime.core.range;
+
+import com.oracle.truffle.ruby.runtime.core.*;
+import com.oracle.truffle.ruby.runtime.core.array.*;
+
+/**
+ * A range that has {@code Fixnum} begin and end.
+ */
+public class FixnumRange extends RubyRange {
+
+    private final int begin;
+    private final int end;
+    private final boolean excludeEnd;
+
+    public FixnumRange(RubyClass rangeClass, int begin, int end, boolean excludeEnd) {
+        super(rangeClass);
+        this.begin = begin;
+        this.end = end;
+        this.excludeEnd = excludeEnd;
+    }
+
+    @Override
+    public String toString() {
+        if (excludeEnd) {
+            return begin + "..." + end;
+        } else {
+            return begin + ".." + end;
+        }
+    }
+
+    @Override
+    public RubyArray toArray() {
+        final int length = getLength();
+
+        if (length < 0) {
+            return new RubyArray(getRubyClass().getContext().getCoreLibrary().getArrayClass());
+        } else {
+            final int[] values = new int[length];
+
+            for (int n = 0; n < length; n++) {
+                values[n] = begin + n;
+            }
+
+            return new RubyArray(getRubyClass().getContext().getCoreLibrary().getArrayClass(), new FixnumArrayStore(values));
+        }
+    }
+
+    private int getLength() {
+        if (excludeEnd) {
+            return end - begin;
+        } else {
+            return end - begin + 1;
+        }
+    }
+
+    public final int getBegin() {
+        return begin;
+    }
+
+    public final int getEnd() {
+        return end;
+    }
+
+    public final int getInclusiveEnd() {
+        if (excludeEnd) {
+            return end - 1;
+        } else {
+            return end;
+        }
+    }
+
+    public final int getExclusiveEnd() {
+        if (excludeEnd) {
+            return end;
+        } else {
+            return end + 1;
+        }
+    }
+
+    @Override
+    public boolean doesExcludeEnd() {
+        return excludeEnd;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + begin;
+        result = prime * result + end;
+        result = prime * result + (excludeEnd ? 1231 : 1237);
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (!(obj instanceof FixnumRange)) {
+            return false;
+        }
+        FixnumRange other = (FixnumRange) obj;
+        if (begin != other.begin) {
+            return false;
+        }
+        if (end != other.end) {
+            return false;
+        }
+        if (excludeEnd != other.excludeEnd) {
+            return false;
+        }
+        return true;
+    }
+
+}