Switchlayer
=================

根据索引从输入张量数组中选择一个张量，并将其数据复制到输出。该算子不区分数据类型，适用于所有数据类型。

.. math::

    \text{output} = \text{input\_tensors}[\text{index}]

该算子会将选中的输入张量的数据复制到输出张量中。复制的大小为 `size * type_size` 字节。

输入：
    - **input_tensors** - 输入张量数组（TensorC** 类型），包含多个待选择的张量。
    - **index** - 选择的索引（int 类型），指定从 `input_tensors` 数组中选择哪个张量。
    - **core_mask** - 核掩码（int），仅共享存储版本需要。

输出：
    - **output** - 输出张量（TensorC* 类型），包含复制后的数据。输出张量的 `size` 和 `type_size` 应与选中的输入张量相同。

TensorC 结构体定义：
    - **type_size** - 数据类型大小（long long），单位字节，例如 float32 为 4，float16 为 2。
    - **size** - 元素个数（long long）。
    - **data** - 数据指针（void*）。

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

.. note::
    - 该算子不区分数据类型，适用于所有数据类型
    - 算子会复制数据，输出张量与输入张量数据独立
    - 调用前需要确保 `output->data` 指向的内存空间足够大（至少 `size * type_size` 字节）
    - 选中的输入张量的 `size` 和 `type_size` 应与输出张量匹配

**共享存储版本:**

.. c:function:: void switchlayer_s(TensorC** input_tensors, TensorC* output, int index, int core_mask)

**C调用示例：**

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

    //FT78NE示例
    #include <stdio.h>
    #include <switchlayer.h>

    int main(int argc, char* argv[]) {
        // 假设在DDR空间
        TensorC input0, input1, input2;
        TensorC output;
        
        // 初始化 input0
        input0.type_size = 4;  // float32
        input0.size = 1000;
        input0.data = (void *)0xA0000000;
        
        // 初始化 input1
        input1.type_size = 4;  // float32
        input1.size = 1000;
        input1.data = (void *)0xA1000000;
        
        // 初始化 input2
        input2.type_size = 4;  // float32
        input2.size = 1000;
        input2.data = (void *)0xA2000000;
        
        // 初始化 output
        output.type_size = 4;  // float32
        output.size = 1000;
        output.data = (void *)0xB0000000;  // 需要预先分配足够的内存
        
        // 创建输入张量数组
        TensorC* input_tensors[3] = {&input0, &input1, &input2};
        
        int index = 1;  // 选择 input1
        int core_mask = 0xff;
        
        switchlayer_s(input_tensors, &output, index, core_mask);
        
        // 此时 output.data 包含 input1.data 的副本
        
        return 0;
    }

**私有存储版本:**

.. c:function:: void switchlayer_p(TensorC** input_tensors, TensorC* output, int index)

**C调用示例：**

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

    //FT78NE示例
    #include <stdio.h>
    #include <switchlayer.h>

    int main(int argc, char* argv[]) {
        // 假设在L2空间
        TensorC input0, input1, input2;
        TensorC output;
        
        input0.type_size = 4;  // float32
        input0.size = 1000;
        input0.data = (void *)0x10000000;
        
        input1.type_size = 4;
        input1.size = 1000;
        input1.data = (void *)0x10001000;
        
        input2.type_size = 4;
        input2.size = 1000;
        input2.data = (void *)0x10002000;
        
        output.type_size = 4;
        output.size = 1000;
        output.data = (void *)0x10003000;  // 需要预先分配足够的内存
        
        TensorC* input_tensors[3] = {&input0, &input1, &input2};
        
        int index = 0;  // 选择 input0
        
        switchlayer_p(input_tensors, &output, index);
        
        return 0;
    }
