1 /*******************************************************************************
2 * Copyright (c) 2011, 2013 Ericsson, Ecole Polytechnique de Montreal and others
4 * All rights reserved. This program and the accompanying materials are made
5 * available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Matthew Khouzam - Initial API and implementation
11 * Simon Marchi - Initial API and implementation
12 * Marc-Andre Laperle - Add min/maximum for validation
13 *******************************************************************************/
15 package org
.eclipse
.linuxtools
.ctf
.core
.event
.types
;
17 import java
.math
.BigInteger
;
18 import java
.nio
.ByteOrder
;
21 * A CTF integer declaration.
23 * The declaration of a integer basic data type.
26 * @author Matthew Khouzam
27 * @author Simon Marchi
29 public class IntegerDeclaration
implements IDeclaration
{
31 // ------------------------------------------------------------------------
33 // ------------------------------------------------------------------------
35 private final int length
;
36 private final boolean signed
;
37 private final int base
;
38 private final ByteOrder byteOrder
;
39 private final Encoding encoding
;
40 private final long alignment
;
41 private final String clock
;
43 // ------------------------------------------------------------------------
45 // ------------------------------------------------------------------------
53 * Is the integer signed? false == unsigned
55 * The base (10-16 are most common)
57 * Big-endian little-endian or other
59 * ascii, utf8 or none.
61 * The clock path, can be null
63 * The minimum alignment. Should be >= 1
65 public IntegerDeclaration(int len
, boolean signed
, int base
,
66 ByteOrder byteOrder
, Encoding encoding
, String clock
, long alignment
) {
67 if (len
<= 0 || len
== 1 && signed
) {
68 throw new IllegalArgumentException();
73 this.byteOrder
= byteOrder
;
74 this.encoding
= encoding
;
76 this.alignment
= Math
.max(alignment
, 1);
79 // ------------------------------------------------------------------------
80 // Getters/Setters/Predicates
81 // ------------------------------------------------------------------------
84 * Is the integer signed?
85 * @return the is the integer signed
87 public boolean isSigned() {
92 * Get the integer base commonly decimal or hex
93 * @return the integer base
95 public int getBase() {
100 * Gets the byte order
101 * @return the byte order
103 public ByteOrder
getByteOrder() {
108 * Get encoding, chars are 8 bit ints
109 * @return the encoding
111 public Encoding
getEncoding() {
116 * Is the integer a character (8 bits and encoded?)
117 * @return is the integer a char
119 public boolean isCharacter() {
120 return (length
== 8) && (encoding
!= Encoding
.NONE
);
124 * How many bits is this int
125 * @return the length of the int
127 public int getLength() {
132 public long getAlignment(){
137 * The integer's clock, since timestamps are stored in ints
138 * @return the integer's clock, can be null. (most often it is)
140 public String
getClock(){
143 // ------------------------------------------------------------------------
145 // ------------------------------------------------------------------------
148 public IntegerDefinition
createDefinition(IDefinitionScope definitionScope
,
150 return new IntegerDefinition(this, definitionScope
, fieldName
);
154 public String
toString() {
155 /* Only used for debugging */
156 return "[declaration] integer[" + Integer
.toHexString(hashCode()) + ']'; //$NON-NLS-1$
160 * Get the maximum value for this integer declaration
162 * @return The maximum value for this integer declaration
165 public BigInteger
getMaxValue() {
166 BigInteger capacity
= BigInteger
.ONE
.shiftLeft(length
);
167 BigInteger max
= signed ? capacity
.divide(BigInteger
.valueOf(2)) : capacity
;
168 return max
.subtract(BigInteger
.ONE
);
172 * Get the minimum value for this integer declaration
174 * @return The minimum value for this integer declaration
177 public BigInteger
getMinValue() {
179 return BigInteger
.ZERO
;
182 BigInteger capacity
= BigInteger
.ONE
.shiftLeft(length
);
183 return capacity
.divide(BigInteger
.valueOf(2)).negate();