// // Copyright (C) 2011-15 DyND Developers // BSD 2-Clause License, see LICENSE.txt // #pragma once #include #include namespace dynd { namespace nd { template struct equal_kernel : base_strided_kernel, 2> { typedef typename type_of::type A0; typedef typename type_of::type A1; typedef typename std::common_type::type T; void single(char *dst, char *const *src) { *reinterpret_cast(dst) = static_cast(*reinterpret_cast(src[0])) == static_cast(*reinterpret_cast(src[1])); } }; template struct equal_kernel : base_strided_kernel, 2> { typedef typename type_of::type A0; void single(char *dst, char *const *src) { *reinterpret_cast(dst) = *reinterpret_cast(src[0]) == *reinterpret_cast(src[1]); } }; template <> struct equal_kernel : base_strided_kernel, 2> { size_t field_count; const size_t *src0_data_offsets, *src1_data_offsets; // After this are field_count sorting_less kernel offsets, for // src0.field_i src1.field_i // with each 0 <= i < field_count equal_kernel(size_t field_count, const size_t *src0_data_offsets, const size_t *src1_data_offsets) : field_count(field_count), src0_data_offsets(src0_data_offsets), src1_data_offsets(src1_data_offsets) { } ~equal_kernel() { size_t *kernel_offsets = get_offsets(); for (size_t i = 0; i != field_count; ++i) { get_child(kernel_offsets[i])->destroy(); } } size_t *get_offsets() { return reinterpret_cast(this + 1); } void single(char *dst, char *const *src) { const size_t *kernel_offsets = reinterpret_cast(this + 1); char *child_src[2]; for (size_t i = 0; i != field_count; ++i) { kernel_prefix *echild = reinterpret_cast(reinterpret_cast(this) + kernel_offsets[i]); kernel_single_t opchild = echild->get_function(); // if (src0.field_i < src1.field_i) return true child_src[0] = src[0] + src0_data_offsets[i]; child_src[1] = src[1] + src1_data_offsets[i]; bool1 child_dst; opchild(echild, reinterpret_cast(&child_dst), child_src); if (!child_dst) { *reinterpret_cast(dst) = false; return; } } *reinterpret_cast(dst) = true; } static void instantiate(char *DYND_UNUSED(static_data), char *DYND_UNUSED(data), kernel_builder *ckb, const ndt::type &DYND_UNUSED(dst_tp), const char *DYND_UNUSED(dst_arrmeta), intptr_t DYND_UNUSED(nsrc), const ndt::type *src_tp, const char *const *src_arrmeta, kernel_request_t DYND_UNUSED(kernreq), intptr_t DYND_UNUSED(nkwd), const nd::array *DYND_UNUSED(kwds), const std::map &DYND_UNUSED(tp_vars)); }; } // namespace dynd::nd namespace ndt { template struct traits> { static type equivalent() { return callable_type::make(make_type(), {type(Src0TypeID), type(Src1TypeID)}); } }; } // namespace dynd::ndt } // namespace dynd