io.v.todos.persistence.syncbase.DigitMappings.java Source code

Java tutorial

Introduction

Here is the source code for io.v.todos.persistence.syncbase.DigitMappings.java

Source

// Copyright 2016 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package io.v.todos.persistence.syncbase;

import android.support.annotation.NonNull;

import com.google.common.base.Function;
import com.google.common.collect.Collections2;
import com.google.common.collect.ContiguousSet;
import com.google.common.collect.DiscreteDomain;
import com.google.common.collect.ImmutableRangeSet;
import com.google.common.collect.Range;
import com.google.common.collect.RangeSet;

public final class DigitMappings {
    private DigitMappings() {
    }

    public static final DiscreteDomain<Character> DOMAIN = new DiscreteDomain<Character>() {
        @Override
        public Character next(@NonNull Character value) {
            return value == Character.MAX_VALUE ? null : (char) (value + 1);
        }

        @Override
        public Character previous(@NonNull Character value) {
            return value == Character.MIN_VALUE ? null : (char) (value - 1);
        }

        @Override
        public long distance(@NonNull Character start, @NonNull Character end) {
            return end - start;
        }

        @Override
        public Character maxValue() {
            return Character.MAX_VALUE;
        }

        @Override
        public Character minValue() {
            return Character.MIN_VALUE;
        }
    };

    public static final DigitMapping ALL = fromRangeSet(Range.<Character>all());

    /**
     * Constructs a {@link DigitMapping} from the given ranges, where the ranges are given in order
     * of increasing significance. Although the ranges may jump around in significance, within each
     * range, characters are still mapped to digits in ascending order. Out-of-order ranges may be
     * used as well but cannot be optimized in this way.
     *
     * @see DigitRangeMapping
     */
    public static DigitMapping fromRanges(Iterable<ContiguousSet<Character>> ranges) {
        return new DigitRangeMapping(ranges);
    }

    /**
     * @see #fromRangeSet(RangeSet)
     */
    @SafeVarargs
    public static DigitMapping fromRangeSet(Range<Character>... ranges) {
        ImmutableRangeSet.Builder<Character> builder = ImmutableRangeSet.builder();
        for (Range<Character> range : ranges) {
            builder.add(range);
        }
        return fromRangeSet(builder.build());
    }

    /**
     * Constructs a {@link DigitMapping} from a {@link RangeSet}, ordering the ranges in ascending
     * order (regardless of input order). If out-of-order ranges are desired, use the
     * {@link #fromRanges(Iterable)} factory method instead to provide explicit ordering.
     */
    public static DigitMapping fromRangeSet(RangeSet<Character> spec) {
        return fromRanges(
                Collections2.transform(spec.asRanges(), new Function<Range<Character>, ContiguousSet<Character>>() {
                    @Override
                    public ContiguousSet<Character> apply(Range<Character> input) {
                        return ContiguousSet.create(input, DOMAIN);
                    }
                }));
    }
}