//
//  Copyright 2026 Shuntaro Kasatani
//
//  Licensed under the Apache License, Version 2.0 (the "License");
//  you may not use this file except in compliance with the License.
//  You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
//

use crate::runner::compiler::ptr_utils::alloc_buf_for_type;

pub fn alloc_and_write_each<T: Sized, F>(count: usize, mut get_value: F) -> *mut ()
where
    F: FnMut(usize) -> T,
{
    let ptr = alloc_buf_for_type::<T>(count);
    for i in 0..count {
        let value = get_value(i);
        unsafe {
            ptr.add(i).write(value);
        }
    }
    ptr as *mut ()
}

pub fn alloc_and_spread<T: Sized + Copy>(count: usize, value: T) -> *mut () {
    let ptr = alloc_buf_for_type::<T>(count);
    for i in 0..count {
        unsafe {
            ptr.add(i).write(value);
        }
    }
    ptr as *mut ()
}
