Skip to content
VecAlignedOffsetAt

VecAlignedOffsetAt

VecAlignedOffsetAt

Description

Vector implementation already manages alignment for stored objects. It makes sure that objects of improper size are stored at alignment of 8 bytes each to avoid UB.

Parameters

Name Direction Description
v in Vector to get aligned offset for.
idx in Index of element to get offset of

Success

Alignment address.

Failure

Does not return on failure

Usage example (Cross-references)

Usage examples (Cross-references)
                    size_t index = extract_u32(data, offset, size) % VecLen(vec);
                    // Note: VecAlignedOffsetAt doesn't take alignment parameter
                    size_t offset = VecAlignedOffsetAt(vec, index);
                    (void)offset; // Use the result to avoid warnings
                }
                    size_t index = extract_u32(data, offset, size) % VecLen(vec);
                    // Note: VecAlignedOffsetAt doesn't take alignment parameter
                    size_t offset = VecAlignedOffsetAt(vec, index);
                    (void)offset; // Use the result to avoid warnings
                }
                uint16_t idx = extract_u16(data, offset, size);
                if (idx <= VecLen(vec)) {
                    volatile uint64_t offset_val = VecAlignedOffsetAt(vec, idx);
                    (void)offset_val;
                }
        vec_size            = VecSize(&vec);
        vec_len             = VecLen(&vec);
        size aligned_offset = VecAlignedOffsetAt(&vec, vec.length);
        result              = result && (vec_size == aligned_offset);
        result              = result && (vec_len == vec.length);
        size aligned_vec_size  = VecSize(&aligned_vec);
        size aligned_vec_len   = VecLen(&aligned_vec);
        size aligned_offset_at = VecAlignedOffsetAt(&aligned_vec, aligned_vec.length);
        result                 = result && (aligned_vec_size == aligned_offset_at);
        result                 = result && (aligned_vec_len == aligned_vec.length);
    // Test VecAlignedOffsetAt function
    bool test_vec_aligned_offset_at(void) {
        WriteFmt("Testing VecAlignedOffsetAt\n");
    
        // Create a vector of integers with default alignment (1)
    
        // Check offsets
        bool result = (VecAlignedOffsetAt(&vec, 0) == 0);
        result      = result && (VecAlignedOffsetAt(&vec, 1) == sizeof(int));
        result      = result && (VecAlignedOffsetAt(&vec, 2) == 2 * sizeof(int));
        // Check offsets
        bool result = (VecAlignedOffsetAt(&vec, 0) == 0);
        result      = result && (VecAlignedOffsetAt(&vec, 1) == sizeof(int));
        result      = result && (VecAlignedOffsetAt(&vec, 2) == 2 * sizeof(int));
        bool result = (VecAlignedOffsetAt(&vec, 0) == 0);
        result      = result && (VecAlignedOffsetAt(&vec, 1) == sizeof(int));
        result      = result && (VecAlignedOffsetAt(&vec, 2) == 2 * sizeof(int));
    
        // Clean up
    
        // Check offsets with alignment
        result = result && (VecAlignedOffsetAt(&aligned_vec, 0) == 0);
        result = result && (VecAlignedOffsetAt(&aligned_vec, 1) == aligned_size);
        result = result && (VecAlignedOffsetAt(&aligned_vec, 2) == 2 * aligned_size);
        // Check offsets with alignment
        result = result && (VecAlignedOffsetAt(&aligned_vec, 0) == 0);
        result = result && (VecAlignedOffsetAt(&aligned_vec, 1) == aligned_size);
        result = result && (VecAlignedOffsetAt(&aligned_vec, 2) == 2 * aligned_size);
        result = result && (VecAlignedOffsetAt(&aligned_vec, 0) == 0);
        result = result && (VecAlignedOffsetAt(&aligned_vec, 1) == aligned_size);
        result = result && (VecAlignedOffsetAt(&aligned_vec, 2) == 2 * aligned_size);
    
        // Clean up
    /// idx[in] : Index to get data at
    ///
    #define VecAt(v, idx) ((VEC_DATATYPE(v) *)(VecAlignedOffsetAt((v), (idx)) + (char *)(v)->data))[0]
    
    ///
    /// idx[in] : Index to get data at
    ///
    #define VecPtrAt(v, idx) ((VEC_DATATYPE(v) *)(VecAlignedOffsetAt((v), (idx)) + (char *)(v)->data))
    
    ///
    /// v[in] : Vector to get end of.
    ///
    #define VecEnd(v) ((char *)(v)->data + VecAlignedOffsetAt((v), (v)->length))
    
    ///
    /// v[in] : Vector to get length of
    ///
    #define VecSize(v) VecAlignedOffsetAt(v, (v)->length)
    
    ///
Last updated on