| 308 | } |
| 309 | |
| 310 | af_err af_diag_extract(af_array *out, const af_array in, const int num) { |
| 311 | try { |
| 312 | const ArrayInfo &in_info = getInfo(in); |
| 313 | af_dtype type = in_info.getType(); |
| 314 | |
| 315 | if (in_info.ndims() == 0) { |
| 316 | return af_create_handle(out, 0, nullptr, type); |
| 317 | } |
| 318 | |
| 319 | DIM_ASSERT(1, in_info.ndims() >= 2); |
| 320 | |
| 321 | af_array result = nullptr; |
| 322 | switch (type) { |
| 323 | case f32: result = diagExtract<float>(in, num); break; |
| 324 | case c32: result = diagExtract<cfloat>(in, num); break; |
| 325 | case f64: result = diagExtract<double>(in, num); break; |
| 326 | case c64: result = diagExtract<cdouble>(in, num); break; |
| 327 | case s32: result = diagExtract<int>(in, num); break; |
| 328 | case u32: result = diagExtract<uint>(in, num); break; |
| 329 | case s64: result = diagExtract<intl>(in, num); break; |
| 330 | case u64: result = diagExtract<uintl>(in, num); break; |
| 331 | case s16: result = diagExtract<short>(in, num); break; |
| 332 | case u16: result = diagExtract<ushort>(in, num); break; |
| 333 | case s8: result = diagExtract<schar>(in, num); break; |
| 334 | case u8: |
| 335 | result = diagExtract<uchar>(in, num); |
| 336 | break; |
| 337 | // Removed because of bool type. Functions implementations |
| 338 | // exist. |
| 339 | case b8: result = diagExtract<char>(in, num); break; |
| 340 | case f16: result = diagExtract<half>(in, num); break; |
| 341 | default: TYPE_ERROR(1, type); |
| 342 | } |
| 343 | |
| 344 | std::swap(*out, result); |
| 345 | } |
| 346 | CATCHALL; |
| 347 | |
| 348 | return AF_SUCCESS; |
| 349 | } |
| 350 | |
| 351 | template<typename T> |
| 352 | inline af_array triangle(const af_array in, const bool is_upper, |
no test coverage detected