Tensorlistsetitem
=================

将输入的张量（item）替换到张量列表（TensorList）中指定索引位置。该算子创建一个新的张量列表，其中在指定索引位置的张量被替换为输入的新张量，而其他位置的张量保持不变。

该算子不区分具体的数据类型，通过copy_size参数指定每个张量的数据量大小。

输入：
    - **in_data** - 输入张量列表指针（void**类型），指向原始张量列表中的各个张量数据。
    - **in_item** - 输入张量指针（void*类型），表示要替换到张量列表中的新张量数据。
    - **index** - 要替换的张量在列表中的索引位置（int类型）。
    - **tensorlist_size** - 张量列表中包含的张量个数（int类型）。
    - **copy_size** - 每个张量的数据量大小数组（int*类型），以字节为单位，表示每个张量需要复制的字节数。
    - **core_mask** - 核掩码（int类型），仅共享存储版本需要。

输出：
    - **out_data** - 输出张量列表指针（void**类型），存储替换操作后的张量列表，其中index位置的张量被替换为in_item。

支持平台：
    ``FT78NE``
    ``MT7004``

.. note::
    - 该算子不区分具体的数据类型，通过copy_size参数控制复制的字节数
    - 调用前需要确保out_data指向的内存空间足够大，能够存储所有张量数据
    - 索引index必须在有效范围内（0 <= index < tensorlist_size）
    - 算子会复制所有张量数据，输出张量列表与输入张量列表数据独立

**共享存储版本：**

.. c:function:: void tensorlistsetitem_s(void** in_data, void* in_item, void** out_data, int index, int tensorlist_size, int* copy_size, int core_mask)
   
**C调用示例（共享存储版本）：**

.. code-block:: c
    :linenos:
    :emphasize-lines: 31

    #include <stdio.h>
    #include <tensorlistsetitem.h>

    int main(int argc, char* argv[]) {
        // 假设在DDR空间
        int tensorlist_size = 3;  // 张量列表包含3个张量
        int index = 1;  // 替换索引为1的张量
        
        // 输入张量列表
        float *in_tensor0 = (float *)0xA0000000;
        float *in_tensor1 = (float *)0xA0010000;
        float *in_tensor2 = (float *)0xA0020000;
        void* in_data[3] = {in_tensor0, in_tensor1, in_tensor2};
        
        // 输入item
        float *in_item = (float *)0xA0030000;
        
        // 输出张量列表
        float *out_tensor0 = (float *)0xB0000000;
        float *out_tensor1 = (float *)0xB0010000;
        float *out_tensor2 = (float *)0xB0020000;
        void* out_data[3] = {out_tensor0, out_tensor1, out_tensor2};
        
        // 每个张量的数据量大小
        int copy_size[3] = {40, 40, 40};
        
        // 核掩码
        int core_mask = 0xff;
        
        // 调用共享存储版本的函数
        tensorlistsetitem_s(in_data, in_item, out_data, index, tensorlist_size, copy_size, core_mask);
        
        return 0;
    }

**私有存储版本：**

.. c:function:: void tensorlistsetitem_p(void** in_data, void* in_item, void** out_data, int index, int tensorlist_size, int* copy_size)
   
**C调用示例（私有存储版本）：**

.. code-block:: c
    :linenos:
    :emphasize-lines: 28

    #include <stdio.h>
    #include <tensorlistsetitem.h>

    int main(int argc, char* argv[]) {
        // 假设在L2空间
        int tensorlist_size = 3;  // 张量列表包含3个张量
        int index = 1;  // 替换索引为1的张量
        
        // 输入张量列表（假设已初始化）
        float *in_tensor0 = (float *)0x10000000;  // 第一个张量
        float *in_tensor1 = (float *)0x10001000;  // 第二个张量（将被替换）
        float *in_tensor2 = (float *)0x10002000;  // 第三个张量
        void* in_data[3] = {in_tensor0, in_tensor1, in_tensor2};
        
        // 输入item（新张量数据）
        float *in_item = (float *)0x10003000;
        
        // 输出张量列表（需要预先分配内存）
        float *out_tensor0 = (float *)0x10004000;
        float *out_tensor1 = (float *)0x10005000;
        float *out_tensor2 = (float *)0x10006000;
        void* out_data[3] = {out_tensor0, out_tensor1, out_tensor2};
        
        // 每个张量的数据量大小（假设每个张量有10个float元素，每个float 4字节）
        int copy_size[3] = {40, 40, 40};  // 40字节 = 10 * 4
        
        // 调用私有存储版本的函数
        tensorlistsetitem_p(in_data, in_item, out_data, index, tensorlist_size, copy_size);
        
        return 0;
    }