rpuch commented on a change in pull request #559:
URL: https://github.com/apache/ignite-3/pull/559#discussion_r786627326



##########
File path: 
modules/network/src/main/java/org/apache/ignite/internal/network/serialization/ClassDescriptor.java
##########
@@ -305,4 +336,115 @@ public String toString() {
     public boolean describesSameClass(ClassDescriptor other) {
         return other.clazz() == clazz();
     }
+
+    /**
+     * Returns total number of bytes needed to store all primitive fields.
+     *
+     * @return total number of bytes needed to store all primitive fields
+     */
+    public int primitiveFieldsDataSize() {
+        return primitiveFieldsDataSize;
+    }
+
+    /**
+     * Returns total number of object (i.e. non-primitive) fields.
+     *
+     * @return total number of object (i.e. non-primitive) fields
+     */
+    public int objectFieldsCount() {
+        return objectFieldsCount;
+    }
+
+    /**
+     * Return offset into primitive fields data (which has size {@link 
#primitiveFieldsDataSize()}).
+     * These are different from the offsets used in the context of {@link 
sun.misc.Unsafe}.
+     *
+     * @param fieldName    primitive field name
+     * @param requiredType field type
+     * @return offset into primitive fields data
+     */
+    public int primitiveFieldDataOffset(String fieldName, Class<?> 
requiredType) {
+        assert requiredType.isPrimitive();
+
+        if (fieldsByName == null) {
+            fieldsByName = fieldsByNameMap(fields);
+        }
+
+        FieldDescriptor fieldDesc = fieldsByName.get(fieldName);
+        if (fieldDesc == null) {
+            throw new IllegalStateException("Did not find a field with name " 
+ fieldName);
+        }
+        if (fieldDesc.clazz() != requiredType) {
+            throw new IllegalStateException("Field " + fieldName + " has type 
" + fieldDesc.clazz()
+                    + ", but it was used as " + requiredType);
+        }
+
+        if (primitiveFieldDataOffsets == null) {
+            primitiveFieldDataOffsets = primitiveFieldDataOffsetsMap(fields);
+        }
+
+        assert primitiveFieldDataOffsets.containsKey(fieldName);
+
+        return primitiveFieldDataOffsets.getInt(fieldName);
+    }
+
+    private static Map<String, FieldDescriptor> 
fieldsByNameMap(List<FieldDescriptor> fields) {
+        return fields.stream()
+                .collect(toUnmodifiableMap(FieldDescriptor::name, 
Function.identity()));
+    }
+
+    private static Object2IntMap<String> 
primitiveFieldDataOffsetsMap(List<FieldDescriptor> fields) {
+        Object2IntMap<String> map = new Object2IntOpenHashMap<>();
+
+        int accumulatedOffset = 0;
+        for (FieldDescriptor fieldDesc : fields) {
+            if (fieldDesc.isPrimitive()) {
+                map.put(fieldDesc.name(), accumulatedOffset);
+                accumulatedOffset += 
Primitives.widthInBytes(fieldDesc.clazz());
+            }
+        }
+
+        return map;
+    }
+
+    /**
+     * Returns index of a non-primitive (i.e. object) field in the object 
fields array.
+     *
+     * @param fieldName object field name
+     * @return index of a non-primitive (i.e. object) field in the object 
fields array
+     */
+    public int objectFieldIndex(String fieldName) {
+        if (objectFieldIndices == null) {
+            objectFieldIndices = computeObjectFieldIndices(fields);

Review comment:
       Same considerations :)




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to