@@ -43,48 +43,51 @@ static inline af_array approx2(const af_array zi, const af_array xo,
4343 yi_beg, yi_step, method, offGrid));
4444}
4545
46- af_err af_approx1_uniform (af_array *yo, const af_array yi, const af_array xo,
47- const int xdim, const double xi_beg,
48- const double xi_step, const af_interp_type method,
49- const float offGrid) {
46+ af_err af_approx1_common (af_array *yo, const af_array yi, const af_array xo,
47+ const int xdim, const double xi_beg,
48+ const double xi_step, const af_interp_type method,
49+ const float offGrid, const bool allocate_yo ) {
5050 try {
51+ ARG_ASSERT (0 , yo != 0 );
52+ ARG_ASSERT (1 , yi != 0 );
53+ ARG_ASSERT (2 , xo != 0 );
54+
5155 const ArrayInfo &yi_info = getInfo (yi);
5256 const ArrayInfo &xo_info = getInfo (xo);
5357
5458 const dim4 yi_dims = yi_info.dims ();
5559 const dim4 xo_dims = xo_info.dims ();
60+ dim4 yo_dims = yi_dims;
61+ yo_dims[xdim] = xo_dims[xdim];
5662
57- ARG_ASSERT (1 , yi_info.isFloating ()); // Only floating and complex types
58- ARG_ASSERT (2 , xo_info.isRealFloating ()); // Only floating types
59- ARG_ASSERT (1 , yi_info.isSingle () ==
60- xo_info.isSingle ()); // Must have same precision
61- ARG_ASSERT (1 , yi_info.isDouble () ==
62- xo_info.isDouble ()); // Must have same precision
63+ ARG_ASSERT (1 , yi_info.isFloating ()); // Only floating and complex types
64+ ARG_ASSERT (2 , xo_info.isRealFloating ()) ; // Only floating types
65+ ARG_ASSERT (1 , yi_info.isSingle () == xo_info.isSingle ()); // Must have same precision
66+ ARG_ASSERT (1 , yi_info.isDouble () == xo_info.isDouble ()); // Must have same precision
6367 ARG_ASSERT (3 , xdim >= 0 && xdim < 4 );
6468
65- // POS should either be (x, 1, 1, 1) or (1, yi_dims[1], yi_dims[2],
66- // yi_dims[3])
69+ // POS should either be (x, 1, 1, 1) or (1, yi_dims[1], yi_dims[2], yi_dims[3])
6770 if (xo_dims[xdim] != xo_dims.elements ()) {
6871 for (int i = 0 ; i < 4 ; i++) {
6972 if (xdim != i) DIM_ASSERT (2 , xo_dims[i] == yi_dims[i]);
7073 }
7174 }
7275
7376 ARG_ASSERT (5 , xi_step != 0 );
74- ARG_ASSERT (
75- 6 ,
76- (method == AF_INTERP_CUBIC || method == AF_INTERP_CUBIC_SPLINE ||
77- method == AF_INTERP_LINEAR || method == AF_INTERP_LINEAR_COSINE ||
78- method == AF_INTERP_LOWER || method == AF_INTERP_NEAREST));
77+ ARG_ASSERT (6 , (method == AF_INTERP_CUBIC ||
78+ method == AF_INTERP_CUBIC_SPLINE ||
79+ method == AF_INTERP_LINEAR ||
80+ method == AF_INTERP_LINEAR_COSINE ||
81+ method == AF_INTERP_LOWER ||
82+ method == AF_INTERP_NEAREST));
7983
8084 if (yi_dims.ndims () == 0 || xo_dims.ndims () == 0 ) {
81- *yo = createHandle (dim4 (0 , 0 , 0 , 0 ), yi_info.getType ());
82- return AF_SUCCESS;
85+ return af_create_handle (yo, 0 , nullptr , yi_info.getType ());
8386 }
8487
85- dim4 yo_dims = yi_dims;
86- yo_dims[xdim] = xo_dims[xdim] ;
87- if (*yo == 0 ) { *yo = createHandle (yo_dims, yi_info. getType ()); }
88+ if (allocate_yo) {
89+ *yo = createHandle (yo_dims, yi_info. getType ()) ;
90+ }
8891
8992 DIM_ASSERT (1 , getInfo (*yo).dims () == yo_dims);
9093
@@ -113,9 +116,37 @@ af_err af_approx1_uniform(af_array *yo, const af_array yi, const af_array xo,
113116 return AF_SUCCESS;
114117}
115118
119+ af_err af_approx1_uniform (af_array *yo, const af_array yi, const af_array xo,
120+ const int xdim, const double xi_beg,
121+ const double xi_step, const af_interp_type method,
122+ const float offGrid) {
123+ return af_approx1_common (yo, yi, xo, xdim, xi_beg, xi_step, method, offGrid,
124+ true );
125+ }
126+
127+ af_err af_approx1_uniform_v2 (af_array *yo, const af_array yi, const af_array xo,
128+ const int xdim, const double xi_beg,
129+ const double xi_step, const af_interp_type method,
130+ const float offGrid) {
131+ if (yo == 0 ) return AF_ERR_ARG;
132+ // Since this v2, assume that the output has already been initialized
133+ // either to null or an existing af_array
134+ return af_approx1_common (yo, yi, xo, xdim, xi_beg, xi_step, method, offGrid,
135+ *yo == 0 );
136+ }
137+
116138af_err af_approx1 (af_array *yo, const af_array yi, const af_array xo,
117139 const af_interp_type method, const float offGrid) {
118- return af_approx1_uniform (yo, yi, xo, 0 , 0.0 , 1.0 , method, offGrid);
140+ return af_approx1_common (yo, yi, xo, 0 , 0.0 , 1.0 , method, offGrid, true );
141+ }
142+
143+ af_err af_approx1_v2 (af_array *yo, const af_array yi, const af_array xo,
144+ const af_interp_type method, const float offGrid) {
145+ if (yo == 0 ) return AF_ERR_ARG;
146+ // Since this is v2, assume that the output has already been initialized
147+ // either to null or an existing af_array
148+ return af_approx1_common (yo, yi, xo, 0 , 0.0 , 1.0 , method, offGrid,
149+ *yo == 0 );
119150}
120151
121152af_err af_approx2_uniform (af_array *zo, const af_array zi, const af_array xo,
0 commit comments