1 //------------------------------------------------------------------------------
2 // GB_mex_msort_3: sort using GB_msort_3b
3 //------------------------------------------------------------------------------
4 
5 // SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved.
6 // SPDX-License-Identifier: Apache-2.0
7 
8 //------------------------------------------------------------------------------
9 
10 #include "GB_mex.h"
11 
12 #define USAGE "[I,J,K] = GB_mex_msort_3 (I,J,K,nthreads)"
13 
mexFunction(int nargout,mxArray * pargout[],int nargin,const mxArray * pargin[])14 void mexFunction
15 (
16     int nargout,
17     mxArray *pargout [ ],
18     int nargin,
19     const mxArray *pargin [ ]
20 )
21 {
22     bool malloc_debug = GB_mx_get_global (true) ;
23 
24     // check inputs
25     if (nargin != 4 || nargout != 3)
26     {
27         mexErrMsgTxt ("Usage: " USAGE) ;
28     }
29     if (!mxIsClass (pargin [0], "int64"))
30     {
31         mexErrMsgTxt ("I must be a int64 array") ;
32     }
33     if (!mxIsClass (pargin [1], "int64"))
34     {
35         mexErrMsgTxt ("J must be a int64 array") ;
36     }
37     if (!mxIsClass (pargin [2], "int64"))
38     {
39         mexErrMsgTxt ("K must be a int64 array") ;
40     }
41 
42     int64_t *I = mxGetData (pargin [0]) ;
43     int64_t n = (uint64_t) mxGetNumberOfElements (pargin [0]) ;
44 
45     int64_t *J = mxGetData (pargin [1]) ;
46     if (n != (uint64_t) mxGetNumberOfElements (pargin [1]))
47     {
48         mexErrMsgTxt ("I and J must be the same length") ;
49     }
50 
51     int64_t *K = mxGetData (pargin [2]) ;
52     if (n != (uint64_t) mxGetNumberOfElements (pargin [2]))
53     {
54         mexErrMsgTxt ("I and K must be the same length") ;
55     }
56 
57     int GET_SCALAR (3, int, nthreads, 1) ;
58 
59     pargout [0] = GB_mx_create_full (n, 1, GrB_INT64) ;
60     int64_t *Iout = mxGetData (pargout [0]) ;
61     memcpy (Iout, I, n * sizeof (int64_t)) ;
62 
63     pargout [1] = GB_mx_create_full (n, 1, GrB_INT64) ;
64     int64_t *Jout = mxGetData (pargout [1]) ;
65     memcpy (Jout, J, n * sizeof (int64_t)) ;
66 
67     pargout [2] = GB_mx_create_full (n, 1, GrB_INT64) ;
68     int64_t *Kout = mxGetData (pargout [2]) ;
69     memcpy (Kout, K, n * sizeof (int64_t)) ;
70 
71     GB_MEX_TIC ;
72     GB_msort_3b (Iout, Jout, Kout, n, nthreads) ;
73     GB_MEX_TOC ;
74 
75     GB_mx_put_global (true) ;
76 }
77 
78