2 * Copyright (c) 2015 Pantheon Technologies s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.model.ri.type;
10 import static com.google.common.base.Verify.verifyNotNull;
12 import com.google.common.collect.ImmutableList;
13 import com.google.common.collect.ImmutableRangeSet;
14 import com.google.common.collect.Range;
15 import java.math.BigDecimal;
16 import java.util.Collection;
17 import java.util.Optional;
18 import org.opendaylight.yangtools.yang.common.QName;
19 import org.opendaylight.yangtools.yang.model.api.ConstraintMetaDefinition;
20 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
21 import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
22 import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint;
24 final class BaseDecimalType extends AbstractRangeRestrictedBaseType<DecimalTypeDefinition, BigDecimal>
25 implements DecimalTypeDefinition {
26 private static final ConstraintMetaDefinition BUILTIN_CONSTRAINT = new ConstraintMetaDefinition() {
29 public Optional<String> getReference() {
30 return Optional.of("https://tools.ietf.org/html/rfc6020#section-9.3.4");
34 public Optional<String> getDescription() {
35 return Optional.empty();
39 public Optional<String> getErrorMessage() {
40 return Optional.empty();
44 public Optional<String> getErrorAppTag() {
45 return Optional.empty();
49 private static final ImmutableList<RangeConstraint<BigDecimal>> IMPLICIT_RANGE_STATEMENTS = ImmutableList.of(
50 createRangeConstraint("-922337203685477580.8", "922337203685477580.7"),
51 createRangeConstraint("-92233720368547758.08", "92233720368547758.07"),
52 createRangeConstraint("-9223372036854775.808", "9223372036854775.807"),
53 createRangeConstraint("-922337203685477.5808", "922337203685477.5807"),
54 createRangeConstraint("-92233720368547.75808", "92233720368547.75807"),
55 createRangeConstraint("-9223372036854.775808", "9223372036854.775807"),
56 createRangeConstraint("-922337203685.4775808", "922337203685.4775807"),
57 createRangeConstraint("-92233720368.54775808", "92233720368.54775807"),
58 createRangeConstraint("-9223372036.854775808", "9223372036.854775807"),
59 createRangeConstraint("-922337203.6854775808", "922337203.6854775807"),
60 createRangeConstraint("-92233720.36854775808", "92233720.36854775807"),
61 createRangeConstraint("-9223372.036854775808", "9223372.036854775807"),
62 createRangeConstraint("-922337.2036854775808", "922337.2036854775807"),
63 createRangeConstraint("-92233.72036854775808", "92233.72036854775807"),
64 createRangeConstraint("-9223.372036854775808", "9223.372036854775807"),
65 createRangeConstraint("-922.3372036854775808", "922.3372036854775807"),
66 createRangeConstraint("-92.23372036854775808", "92.23372036854775807"),
67 createRangeConstraint("-9.223372036854775808", "9.223372036854775807"));
69 private static RangeConstraint<BigDecimal> createRangeConstraint(final String min, final String max) {
70 return new ResolvedRangeConstraint<>(BUILTIN_CONSTRAINT, ImmutableRangeSet.of(
71 Range.closed(new BigDecimal(min), new BigDecimal(max))));
74 static RangeConstraint<BigDecimal> constraintsForDigits(final int fractionDigits) {
75 return verifyNotNull(IMPLICIT_RANGE_STATEMENTS.get(fractionDigits - 1));
78 private final int fractionDigits;
80 BaseDecimalType(final QName qname, final Collection<? extends UnknownSchemaNode> unknownSchemaNodes,
81 final int fractionDigits, final RangeConstraint<BigDecimal> rangeConstraint) {
82 super(qname, unknownSchemaNodes, rangeConstraint);
83 this.fractionDigits = fractionDigits;
87 public int getFractionDigits() {
88 return fractionDigits;
92 public int hashCode() {
93 return DecimalTypeDefinition.hashCode(this);
97 public boolean equals(final Object obj) {
98 return DecimalTypeDefinition.equals(this, obj);
102 public String toString() {
103 return DecimalTypeDefinition.toString(this);