| 268 | } |
| 269 | |
| 270 | af_err af_diag_create(af_array *out, const af_array in, const int num) { |
| 271 | try { |
| 272 | const ArrayInfo &in_info = getInfo(in); |
| 273 | DIM_ASSERT(1, in_info.ndims() <= 2); |
| 274 | af_dtype type = in_info.getType(); |
| 275 | |
| 276 | af_array result; |
| 277 | |
| 278 | if (in_info.dims()[0] == 0) { |
| 279 | return af_create_handle(out, 0, nullptr, type); |
| 280 | } |
| 281 | |
| 282 | switch (type) { |
| 283 | case f32: result = diagCreate<float>(in, num); break; |
| 284 | case c32: result = diagCreate<cfloat>(in, num); break; |
| 285 | case f64: result = diagCreate<double>(in, num); break; |
| 286 | case c64: result = diagCreate<cdouble>(in, num); break; |
| 287 | case s32: result = diagCreate<int>(in, num); break; |
| 288 | case u32: result = diagCreate<uint>(in, num); break; |
| 289 | case s64: result = diagCreate<intl>(in, num); break; |
| 290 | case u64: result = diagCreate<uintl>(in, num); break; |
| 291 | case s16: result = diagCreate<short>(in, num); break; |
| 292 | case u16: result = diagCreate<ushort>(in, num); break; |
| 293 | case s8: result = diagCreate<schar>(in, num); break; |
| 294 | case u8: |
| 295 | result = diagCreate<uchar>(in, num); |
| 296 | break; |
| 297 | // Removed because of bool type. Functions implementations |
| 298 | // exist. |
| 299 | case b8: result = diagCreate<char>(in, num); break; |
| 300 | case f16: result = diagCreate<half>(in, num); break; |
| 301 | default: TYPE_ERROR(1, type); |
| 302 | } |
| 303 | |
| 304 | std::swap(*out, result); |
| 305 | } |
| 306 | CATCHALL; |
| 307 | return AF_SUCCESS; |
| 308 | } |
| 309 | |
| 310 | af_err af_diag_extract(af_array *out, const af_array in, const int num) { |
| 311 | try { |