VecAlignedOffsetAt

Table of Contents

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

NameDirectionDescription
vinVector to get aligned offset for.
idxinIndex of element to get offset of

Success

Alignment address.

Failure

Does not return on failure

Usage example (Cross-references)

    /// 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)
    
    ///
    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) {
    printf("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

Share :