798f5ac616dfb780ead8c17dfb34825ef06365fc
[yangtools.git] / model / yang-model-ri / src / main / java / org / opendaylight / yangtools / yang / model / ri / type / BaseDecimalType.java
1 /*
2  * Copyright (c) 2015 Pantheon Technologies s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.model.ri.type;
9
10 import static com.google.common.base.Verify.verifyNotNull;
11
12 import com.google.common.collect.ImmutableList;
13 import com.google.common.collect.ImmutableRangeSet;
14 import com.google.common.collect.Range;
15 import java.util.Collection;
16 import java.util.Optional;
17 import org.opendaylight.yangtools.yang.common.Decimal64;
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;
23
24 final class BaseDecimalType extends AbstractRangeRestrictedBaseType<DecimalTypeDefinition, Decimal64>
25         implements DecimalTypeDefinition {
26     private static final ConstraintMetaDefinition BUILTIN_CONSTRAINT = new ConstraintMetaDefinition() {
27
28         @Override
29         public Optional<String> getReference() {
30             return Optional.of("https://tools.ietf.org/html/rfc6020#section-9.3.4");
31         }
32
33         @Override
34         public Optional<String> getDescription() {
35             return Optional.empty();
36         }
37
38         @Override
39         public Optional<String> getErrorMessage() {
40             return Optional.empty();
41         }
42
43         @Override
44         public Optional<String> getErrorAppTag() {
45             return Optional.empty();
46         }
47     };
48
49     private static final ImmutableList<RangeConstraint<Decimal64>> 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"));
68
69     private static RangeConstraint<Decimal64> createRangeConstraint(final String min, final String max) {
70         return new ResolvedRangeConstraint<>(BUILTIN_CONSTRAINT, ImmutableRangeSet.of(
71             Range.closed(Decimal64.valueOf(min), Decimal64.valueOf(max))));
72     }
73
74     static RangeConstraint<Decimal64> constraintsForDigits(final int fractionDigits) {
75         return verifyNotNull(IMPLICIT_RANGE_STATEMENTS.get(fractionDigits - 1));
76     }
77
78     private final int fractionDigits;
79
80     BaseDecimalType(final QName qname, final Collection<? extends UnknownSchemaNode> unknownSchemaNodes,
81             final int fractionDigits, final RangeConstraint<Decimal64> rangeConstraint) {
82         super(qname, unknownSchemaNodes, rangeConstraint);
83         this.fractionDigits = fractionDigits;
84     }
85
86     @Override
87     public int getFractionDigits() {
88         return fractionDigits;
89     }
90
91     @Override
92     public int hashCode() {
93         return DecimalTypeDefinition.hashCode(this);
94     }
95
96     @Override
97     public boolean equals(final Object obj) {
98         return DecimalTypeDefinition.equals(this, obj);
99     }
100
101     @Override
102     public String toString() {
103         return DecimalTypeDefinition.toString(this);
104     }
105 }