Skip to content
VecAlignedOffsetAt

VecAlignedOffsetAt

Description

Compute the aligned byte offset of element idx from the start of the vector data buffer. The vector applies per-element alignment internally so that arbitrarily-typed payloads are correctly aligned.

Stride is taken from allocator->alignment when an allocator is present; for stack-init vecs (NULL allocator – see VecInitStack / StrInitStack) the stride collapses to sizeof(VEC_DATATYPE(v)) because the macro backs storage with an _Alignas(T) char[], giving every slot T’s natural alignment without padding.

Parameters

Name Direction Description
v in Vector to query.
idx in Element index.

Usage example (Cross-references)

Usage examples (Cross-references)
                if (VecLen(vec) > 0 && *offset + 8 <= data_size) {
                    size_t index   = extract_u32(data, offset, data_size) % VecLen(vec);
                    size_t aligned = VecAlignedOffsetAt(vec, index);
                    (void)aligned;
                }
                if (VecLen(vec) > 0 && *offset + 8 <= data_size) {
                    size_t index   = extract_u32(data, offset, data_size) % VecLen(vec);
                    size_t aligned = VecAlignedOffsetAt(vec, index);
                    (void)aligned;
                }
                uint16_t idx = extract_u16(data, offset, data_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, VecLen(&vec));
        result              = result && (vec_size == aligned_offset);
        result              = result && (vec_len == VecLen(&vec));
        size aligned_vec_size  = VecSize(&aligned_vec);
        size aligned_vec_len   = VecLen(&aligned_vec);
        size aligned_offset_at = VecAlignedOffsetAt(&aligned_vec, VecLen(&aligned_vec));
        result                 = result && (aligned_vec_size == aligned_offset_at);
        result                 = result && (aligned_vec_len == VecLen(&aligned_vec));
    // Test VecAlignedOffsetAt function
    bool test_vec_aligned_offset_at(void) {
        WriteFmt("Testing VecAlignedOffsetAt\n");
    
        DefaultAllocator alloc    = DefaultAllocatorInit();
    
        // 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
    /// TAGS: Vec, Access, Index
    ///
    #define VecAt(v, idx) ((VEC_DATATYPE(v) *)(VecAlignedOffsetAt((v), (idx)) + (char *)(v)->data))[0]
    
    ///
    /// TAGS: Vec, Access, Index, Pointer
    ///
    #define VecPtrAt(v, idx) ((VEC_DATATYPE(v) *)(VecAlignedOffsetAt((v), (idx)) + (char *)(v)->data))
    
    ///
    /// TAGS: Vec, Access, Iterator, End
    ///
    #define VecEnd(v) ((VEC_DATATYPE(v) *)((char *)(v)->data + VecAlignedOffsetAt((v), (v)->length)))
    
    ///
    /// TAGS: Vec, Access, Size, Bytes
    ///
    #define VecSize(v) VecAlignedOffsetAt(v, (v)->length)
    
    ///
    /// TAGS: Str, Access, Alignment
    ///
    #define StrAlignedOffsetAt(str, idx) VecAlignedOffsetAt(str, idx)
    
    ///
Last updated on