ctf.core: add size() to the types.

This will allow trace writing

Change-Id: Ie179ef94bc4ef39395e5422c9df166c8df31fe1c
Signed-off-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/119837
Tested-by: CI Bot
Reviewed-by: Simon Delisle <simon.delisle@ericsson.com>
diff --git a/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/types/VariantDeclarationTest.java b/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/types/VariantDeclarationTest.java
index 5de6e62..732c7d5 100644
--- a/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/types/VariantDeclarationTest.java
+++ b/ctf/org.eclipse.tracecompass.ctf.core.tests/src/org/eclipse/tracecompass/ctf/core/tests/types/VariantDeclarationTest.java
@@ -84,6 +84,7 @@
         VariantDefinition variantDefinition = new VariantDefinition(
                 variantDeclaration,
                 CtfTestTraceUtils.getTrace(testTrace),
+                tagDef,
                 "tag",
                 "tag",
                 new StringDefinition(
diff --git a/ctf/org.eclipse.tracecompass.ctf.core/META-INF/MANIFEST.MF b/ctf/org.eclipse.tracecompass.ctf.core/META-INF/MANIFEST.MF
index f3566fd..7aa5f0f 100644
--- a/ctf/org.eclipse.tracecompass.ctf.core/META-INF/MANIFEST.MF
+++ b/ctf/org.eclipse.tracecompass.ctf.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
 Bundle-Vendor: %Bundle-Vendor
-Bundle-Version: 2.3.0.qualifier
+Bundle-Version: 2.4.0.qualifier
 Bundle-Localization: plugin
 Bundle-SymbolicName: org.eclipse.tracecompass.ctf.core;singleton:=true
 Bundle-Activator: org.eclipse.tracecompass.internal.ctf.core.Activator
diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/AbstractArrayDefinition.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/AbstractArrayDefinition.java
index d445096..8b53d61 100644
--- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/AbstractArrayDefinition.java
+++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/AbstractArrayDefinition.java
@@ -15,6 +15,7 @@
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.tracecompass.common.core.math.SaturatedArithmetic;
 import org.eclipse.tracecompass.ctf.core.event.scope.IDefinitionScope;
 
 /**
@@ -34,8 +35,7 @@
      * @param definitionScope
      *            the definition is in a scope, (normally a struct) what is it?
      * @param fieldName
-     *            the name of the definition. (it is a field in the parent
-     *            scope)
+     *            the name of the definition. (it is a field in the parent scope)
      */
     public AbstractArrayDefinition(IDeclaration declaration, @Nullable IDefinitionScope definitionScope, String fieldName) {
         super(declaration, definitionScope, fieldName);
@@ -56,4 +56,17 @@
      */
     public abstract int getLength();
 
+    @Override
+    public long size() {
+        List<@Nullable Definition> definitions = getDefinitions();
+        if (definitions.isEmpty()) {
+            return 0;
+        }
+        Definition definition = definitions.get(0);
+        if (definition == null) {
+            return 0;
+        }
+        return SaturatedArithmetic.multiply(getLength(), definition.size());
+    }
+
 }
\ No newline at end of file
diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/Definition.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/Definition.java
index 425ca18..df0b113 100644
--- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/Definition.java
+++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/Definition.java
@@ -124,6 +124,11 @@
         return fDefinitionScope;
     }
 
+    @Override
+    public long size() {
+        return getDeclaration().getMaximumSize();
+    }
+
     // ------------------------------------------------------------------------
     // Operations
     // ------------------------------------------------------------------------
diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/EnumDefinition.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/EnumDefinition.java
index f6733e9..7bbcdbe 100644
--- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/EnumDefinition.java
+++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/EnumDefinition.java
@@ -31,7 +31,7 @@
     // Attributes
     // ------------------------------------------------------------------------
 
-    private final long fIntegerValue;
+    private final IntegerDefinition fInteger;
 
     private final String fValue;
 
@@ -55,8 +55,8 @@
             IDefinitionScope definitionScope, @NonNull String fieldName, IntegerDefinition intValue) {
         super(declaration, definitionScope, fieldName);
 
-        fIntegerValue = intValue.getValue();
-        fValue = declaration.query(fIntegerValue);
+        fInteger = intValue;
+        fValue = declaration.query(fInteger.getValue());
     }
 
     // ------------------------------------------------------------------------
@@ -86,7 +86,7 @@
      */
     @Override
     public Long getIntegerValue() {
-        return fIntegerValue;
+        return fInteger.getValue();
     }
 
     @Override
@@ -94,6 +94,11 @@
         return (EnumDeclaration) super.getDeclaration();
     }
 
+    @Override
+    public long size() {
+        return fInteger.size();
+    }
+
     // ------------------------------------------------------------------------
     // Operations
     // ------------------------------------------------------------------------
@@ -101,7 +106,7 @@
     @Override
     public String toString() {
         return "{ value = " + getValue() + //$NON-NLS-1$
-                ", container = " + fIntegerValue + //$NON-NLS-1$
+                ", container = " + fInteger.getValue()+ //$NON-NLS-1$
                 " }"; //$NON-NLS-1$
     }
 }
diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/FloatDefinition.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/FloatDefinition.java
index b8482f1..751a0f6 100644
--- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/FloatDefinition.java
+++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/FloatDefinition.java
@@ -72,6 +72,10 @@
         return (FloatDeclaration) super.getDeclaration();
     }
 
+    @Override
+    public long size() {
+        return getDeclaration().getMaximumSize();
+    }
     // ------------------------------------------------------------------------
     // Operations
     // ------------------------------------------------------------------------
diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/IDefinition.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/IDefinition.java
index 29b793c..7d47e43 100644
--- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/IDefinition.java
+++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/IDefinition.java
@@ -39,4 +39,14 @@
      */
     IDeclaration getDeclaration();
 
+    /**
+     * Get the size in bits
+     *
+     * @return the size in bits. Long#MAX_VALUE means unset.
+     * @since 2.4
+     */
+    default long size() {
+        return Long.MAX_VALUE;
+    }
+
 }
\ No newline at end of file
diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/IntegerDefinition.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/IntegerDefinition.java
index 72c2e3e..7e19f90 100644
--- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/IntegerDefinition.java
+++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/IntegerDefinition.java
@@ -89,6 +89,11 @@
     }
 
     @Override
+    public long size() {
+        return getDeclaration().getMaximumSize();
+    }
+
+    @Override
     public String getStringValue() {
         return this.toString();
     }
diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/StringDefinition.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/StringDefinition.java
index ef5d188..3377c65 100644
--- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/StringDefinition.java
+++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/StringDefinition.java
@@ -73,6 +73,11 @@
         return fString;
     }
 
+    @Override
+    public long size() {
+        return fString.length();
+    }
+
     // ------------------------------------------------------------------------
     // Operations
     // ------------------------------------------------------------------------
diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/StructDefinition.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/StructDefinition.java
index 48e85e6..eaada94 100644
--- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/StructDefinition.java
+++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/StructDefinition.java
@@ -18,6 +18,7 @@
 import java.util.Map;
 
 import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.tracecompass.common.core.math.SaturatedArithmetic;
 import org.eclipse.tracecompass.ctf.core.event.scope.IDefinitionScope;
 import org.eclipse.tracecompass.ctf.core.event.scope.ILexicalScope;
 import org.eclipse.tracecompass.ctf.core.event.types.StructDeclaration.InternalDef;
@@ -140,6 +141,15 @@
         return (StructDeclaration) super.getDeclaration();
     }
 
+    @Override
+    public long size() {
+        long size = 0;
+        for (IDefinition def : fDefinitions) {
+            size = SaturatedArithmetic.add(size, def.size());
+        }
+        return size;
+    }
+
     // ------------------------------------------------------------------------
     // Operations
     // ------------------------------------------------------------------------
diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/VariantDeclaration.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/VariantDeclaration.java
index 06f7544..a61e13e 100644
--- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/VariantDeclaration.java
+++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/VariantDeclaration.java
@@ -134,7 +134,7 @@
                     definitionScope.getScopePath().getPath());
         }
         Definition fieldValue = fDeclarationToPopulate.createDefinition(definitionScope, fieldName, input);
-        return new VariantDefinition(this, definitionScope, varFieldName, fieldName, fieldValue);
+        return new VariantDefinition(this, definitionScope, tagDef, varFieldName, fieldName, fieldValue);
     }
 
     /**
diff --git a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/VariantDefinition.java b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/VariantDefinition.java
index 22a1fd2..5af77ba 100644
--- a/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/VariantDefinition.java
+++ b/ctf/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/event/types/VariantDefinition.java
@@ -35,6 +35,7 @@
     private final Definition fDefinition;
     private final String fCurrentField;
     private final String fFieldName;
+    private final EnumDefinition fTagDef;
 
     // ------------------------------------------------------------------------
     // Constructors
@@ -47,21 +48,44 @@
      *            the parent declaration
      * @param definitionScope
      *            the parent scope
+     * @param tagDef
+     *            the tagging definition
+     * @param selectedField
+     *            the selected field
+     * @param fieldName
+     *            the field name
+     * @param fieldValue
+     *            the field value
+     * @since 2.4
+     */
+    public VariantDefinition(@NonNull VariantDeclaration declaration, IDefinitionScope definitionScope, EnumDefinition tagDef, String selectedField, @NonNull String fieldName, Definition fieldValue) {
+        super(declaration, definitionScope, fieldName);
+
+        fTagDef = tagDef;
+        fFieldName = fieldName;
+        fCurrentField = selectedField;
+        fDefinition = fieldValue;
+    }
+
+    /**
+     * Constructor
+     *
+     * @param declaration
+     *            the parent declaration
+     * @param definitionScope
+     *            the parent scope
      * @param selectedField
      *            the selected field
      * @param fieldName
      *            the field name
      * @param fieldValue
      *            the field value
+     *            @deprecated use {@link VariantDefinition#VariantDefinition(VariantDeclaration, IDefinitionScope, EnumDefinition, String, String, Definition)} instead or trace splitting will break
      */
+    @Deprecated
     public VariantDefinition(@NonNull VariantDeclaration declaration,
             IDefinitionScope definitionScope, String selectedField, @NonNull String fieldName, Definition fieldValue) {
-        super(declaration, definitionScope, fieldName);
-
-        fFieldName = fieldName;
-        fCurrentField = selectedField;
-        fDefinition = fieldValue;
-
+        this(declaration, definitionScope, new EnumDefinition(new EnumDeclaration(IntegerDeclaration.INT_8_DECL), null, fieldName, new IntegerDefinition(IntegerDeclaration.INT_8_DECL, null, fieldName, -1)), selectedField, fieldName, fieldValue);
     }
 
     // ------------------------------------------------------------------------
@@ -91,6 +115,11 @@
         return fDefinition;
     }
 
+    @Override
+    public long size() {
+        return fDefinition.size() + fTagDef.size();
+    }
+
     // ------------------------------------------------------------------------
     // Operations
     // ------------------------------------------------------------------------