| 101 | } |
| 102 | |
| 103 | static void move_impl(sugoi_chunk_view_t dstV, const sugoi_chunk_t* srcC, uint32_t srcStart, type_index_t type, EIndex srcOffset, EIndex dstOffset, uint32_t size, uint32_t align, uint32_t elemSize, void (*move)(sugoi_chunk_t* chunk, EIndex index, char* dst, sugoi_chunk_t* schunk, EIndex sindex, char* src)) |
| 104 | { |
| 105 | SKR_ASSERT(!type.is_chunk()); |
| 106 | char* dst = dstV.chunk->data() + (size_t)dstOffset + (size_t)size * dstV.start; |
| 107 | char* src = srcC->data() + (size_t)srcOffset + (size_t)size * srcStart; |
| 108 | if (move) |
| 109 | { |
| 110 | if (type.is_buffer()) |
| 111 | { |
| 112 | forloop (j, 0, dstV.count) |
| 113 | { |
| 114 | auto arrayDst = (sugoi_array_comp_t*)((size_t)j * size + dst); |
| 115 | auto arraySrc = (sugoi_array_comp_t*)((size_t)j * size + src); |
| 116 | if (!is_array_small(arraySrc)) // memory is on heap |
| 117 | *arrayDst = *arraySrc; // just steal it |
| 118 | else // memory is in chunk |
| 119 | { |
| 120 | new_array(arrayDst, size, elemSize, align); |
| 121 | arrayDst->EndX = (char*)arrayDst->BeginX + arraySrc->size_in_bytes(); |
| 122 | for (char *currDst = (char*)arrayDst->BeginX, *currSrc = (char*)arraySrc->BeginX; |
| 123 | currDst != arrayDst->EndX; currDst += elemSize, currSrc += elemSize) |
| 124 | move(dstV.chunk, dstV.start + j, currDst, (sugoi_chunk_t*)srcC, srcStart + j, currSrc); |
| 125 | } |
| 126 | } |
| 127 | } |
| 128 | else |
| 129 | forloop (j, 0, dstV.count) |
| 130 | move(dstV.chunk, dstV.start + j, (size_t)j * size + dst, (sugoi_chunk_t*)srcC, srcStart + j, (size_t)j * size + src); |
| 131 | } |
| 132 | else |
| 133 | { |
| 134 | if (type.is_buffer()) |
| 135 | { |
| 136 | forloop (j, 0, dstV.count) |
| 137 | { |
| 138 | auto arrayDst = (sugoi_array_comp_t*)((size_t)j * size + dst); |
| 139 | auto arraySrc = (sugoi_array_comp_t*)((size_t)j * size + src); |
| 140 | if (!is_array_small(arraySrc)) // memory is on heap |
| 141 | *arrayDst = *arraySrc; // just steal it |
| 142 | else // memory is in chunk |
| 143 | { |
| 144 | new_array(arrayDst, size, elemSize, align); |
| 145 | arrayDst->EndX = (char*)arrayDst->BeginX + arraySrc->size_in_bytes(); |
| 146 | memcpy(arrayDst->BeginX, arraySrc->BeginX, arraySrc->size_in_bytes()); |
| 147 | } |
| 148 | } |
| 149 | } |
| 150 | else |
| 151 | memcpy(dst, src, dstV.count * (size_t)size); |
| 152 | } |
| 153 | } |
| 154 | |
| 155 | static void clone_impl(sugoi_chunk_view_t dstV, const sugoi_chunk_t* srcC, uint32_t srcStart, type_index_t type, EIndex srcOffset, EIndex dstOffset, uint32_t size, uint32_t align, uint32_t elemSize, resource_fields_t resourceFields, void (*copy)(sugoi_chunk_t* chunk, EIndex index, char* dst, sugoi_chunk_t* schunk, EIndex sindex, const char* src)) |
| 156 | { |
no test coverage detected