// ------------
// Reverse.java
// ------------

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;

final class Reverse {
    /**
     * O(1) in space
     * O(n) in time
     */
    public static void eval (long[] a, int b, int e) {
        assert b <= e;
        while (b < e) {
            --e;
            Swap.eval(a, b, e);
            ++b;}}

    /**
     * O(1) in space
     * O(n) in time
     */
    public static void eval (Object[] a, int b, int e) {
        assert b <= e;
        while (b < e) {
            --e;
            Swap.eval(a, b, e);
            ++b;}}

    /**
     * O(1) in space
     * O(n) in time
     */
    public static <T> void eval (List<T> x) {
        final ListIterator<T> b = x.listIterator();
        final ListIterator<T> e = x.listIterator(x.size());
        while (b.nextIndex() < e.nextIndex()) {
            final T v = b.next();
            b.set(e.previous());
            e.set(v);}}}

final class ReverseTest {
    public static void main (String[] args) {
        System.out.println("Reverse.java");

        {
        final long[] a = {2, 3, 4};
        Reverse.eval(a, 0, a.length);
        assert Arrays.equals(a, new long[]{4, 3, 2});
        }

        {
        final Object[] a = {"abc", "def", "ghi"};
        Reverse.eval(a, 0, a.length);
        assert Arrays.equals(a, new String[]{"ghi", "def", "abc"});
        }

        {
        final List<Object> x = Arrays.asList(new Object[]{"abc", "def", "ghi"});
        Collections.reverse(x);
        assert x.toString().equals("[ghi, def, abc]");
        }

        {
        final List<Object> x = Arrays.asList(new Object[]{"abc", "def", "ghi"});
        Reverse.eval(x);
        assert x.toString().equals("[ghi, def, abc]");
        }

        System.out.println("Done.");}}


syntax highlighted by Code2HTML, v. 0.9.1