| 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 | { |
| 157 | SKR_ASSERT(!type.is_chunk()); |
| 158 | char* dst = dstV.chunk->data() + (size_t)dstOffset + (size_t)size * dstV.start; |
| 159 | char* src = srcC->data() + (size_t)srcOffset + (size_t)size * srcStart; |
| 160 | auto storage = dstV.chunk->type->storage; |
| 161 | auto patchResources = [&](char* data) |
| 162 | { |
| 163 | forloop(k, 0, resourceFields.count) |
| 164 | { |
| 165 | auto field = ((intptr_t*)resourceFields.offsets)[k]; |
| 166 | auto* resource = (skr_resource_handle_t*)(data + field); |
| 167 | if(resource->is_resolved()) |
| 168 | { |
| 169 | new (resource) skr_resource_handle_t(*resource, (uint64_t)storage, SKR_REQUESTER_ENTITY); |
| 170 | } |
| 171 | } |
| 172 | }; |
| 173 | if (copy) |
| 174 | { |
| 175 | if (type.is_buffer()) |
| 176 | { |
| 177 | forloop (j, 0, dstV.count) |
| 178 | { |
| 179 | auto arrayDst = (sugoi_array_comp_t*)((size_t)j * size + dst); |
| 180 | auto arraySrc = (sugoi_array_comp_t*)((size_t)j * size + src); |
| 181 | if (!is_array_small(arraySrc)) // memory is on heap |
| 182 | { |
| 183 | size_t cap = (char*)arraySrc->EndX - (char*)arraySrc->BeginX; |
| 184 | arrayDst->BeginX = sugoi_array_comp_t::allocate(cap); |
| 185 | arrayDst->EndX = arrayDst->CapacityX = (char*)arrayDst->BeginX + cap; |
| 186 | } |
| 187 | else // memory is in chunk |
| 188 | { |
| 189 | new_array(arrayDst, size, elemSize, align); |
| 190 | arrayDst->EndX = (char*)arrayDst->BeginX + arraySrc->size_in_bytes(); |
| 191 | } |
| 192 | for (char *currDst = (char*)arrayDst->BeginX, *currSrc = (char*)arraySrc->BeginX; |
| 193 | currDst != arrayDst->EndX; currDst += elemSize, currSrc += elemSize) |
| 194 | copy(dstV.chunk, dstV.start + j, currDst, (sugoi_chunk_t*)srcC, srcStart + j, currSrc); |
| 195 | } |
| 196 | } |
| 197 | else |
| 198 | forloop (j, 0, dstV.count) |
| 199 | copy(dstV.chunk, dstV.start + j, (size_t)j * size + dst, (sugoi_chunk_t*)srcC, srcStart + j, (size_t)j * size + src); |
| 200 | } |
| 201 | else |
| 202 | { |
| 203 | if (type.is_buffer()) |
| 204 | { |
| 205 | forloop (j, 0, dstV.count) |
| 206 | { |
| 207 | auto arrayDst = (sugoi_array_comp_t*)((size_t)j * size + dst); |
| 208 | auto arraySrc = (sugoi_array_comp_t*)((size_t)j * size + src); |
| 209 | if (!is_array_small(arraySrc)) // memory is on heap |
| 210 | { |
| 211 | size_t cap = (char*)arraySrc->EndX - (char*)arraySrc->BeginX; |
| 212 | arrayDst->BeginX = sugoi_array_comp_t::allocate(cap); |
nothing calls this directly
no test coverage detected