@@ -5,34 +5,33 @@ use defines::AfError;
5
5
use error:: HANDLE_ERROR ;
6
6
use seq:: Seq ;
7
7
use self :: libc:: { c_double, c_int, c_uint} ;
8
- use util:: { AfArray , DimT , IndexT , MutAfArray , MutAfIndex } ;
8
+ use util:: { AfArray , AfIndex , DimT , MutAfArray , MutAfIndex } ;
9
9
10
10
#[ allow( dead_code) ]
11
11
extern {
12
12
fn af_create_indexers ( indexers : MutAfIndex ) -> c_int ;
13
- fn af_set_array_indexer ( indexer : MutAfIndex , idx : AfArray , dim : DimT ) -> c_int ;
14
- fn af_set_seq_indexer ( indexer : MutAfIndex , idx : * const SeqInternal , dim : DimT , is_batch : c_int ) -> c_int ;
15
- fn af_release_indexers ( indexers : MutAfIndex ) -> c_int ;
13
+ fn af_set_array_indexer ( indexer : AfIndex , idx : AfArray , dim : DimT ) -> c_int ;
14
+ fn af_set_seq_indexer ( indexer : AfIndex , idx : * const SeqInternal , dim : DimT , is_batch : c_int ) -> c_int ;
15
+ fn af_release_indexers ( indexers : AfIndex ) -> c_int ;
16
16
17
17
fn af_index ( out : MutAfArray , input : AfArray , ndims : c_uint , index : * const SeqInternal ) -> c_int ;
18
18
fn af_lookup ( out : MutAfArray , arr : AfArray , indices : AfArray , dim : c_uint ) -> c_int ;
19
19
fn af_assign_seq ( out : MutAfArray , lhs : AfArray , ndims : c_uint , indices : * const SeqInternal , rhs : AfArray ) -> c_int ;
20
- fn af_index_gen ( out : MutAfArray , input : AfArray , ndims : DimT , indices : * const IndexT ) -> c_int ;
21
- fn af_assign_gen ( out : MutAfArray , lhs : AfArray , ndims : DimT , indices : * const IndexT , rhs : AfArray ) -> c_int ;
20
+ fn af_index_gen ( out : MutAfArray , input : AfArray , ndims : DimT , indices : AfIndex ) -> c_int ;
21
+ fn af_assign_gen ( out : MutAfArray , lhs : AfArray , ndims : DimT , indices : AfIndex , rhs : AfArray ) -> c_int ;
22
22
}
23
23
24
24
/// Struct to manage an array of resources of type `af_indexer_t`(ArrayFire C struct)
25
25
pub struct Indexer {
26
26
handle : i64 ,
27
- count : u32 ,
28
27
}
29
28
30
29
// Trait that indicates that object can be used for indexing
31
30
//
32
31
// Any object to be able to be passed on to [./struct.Indexer.html#method.set_index] method
33
32
// should implement this trait with appropriate implementation
34
33
pub trait Indexable {
35
- fn set ( & self , idxr : & Indexer , dim : u32 , is_batch : Option < bool > ) ;
34
+ fn set ( & self , idxr : & mut Indexer , dim : u32 , is_batch : Option < bool > ) ;
36
35
}
37
36
38
37
/// Enables [Array](./struct.Array.html) to be used to index another Array
@@ -41,11 +40,10 @@ pub trait Indexable {
41
40
/// [assign_gen](./fn.assign_gen.html)
42
41
impl Indexable for Array {
43
42
#[ allow( unused_variables) ]
44
- fn set ( & self , idxr : & Indexer , dim : u32 , is_batch : Option < bool > ) {
43
+ fn set ( & self , idxr : & mut Indexer , dim : u32 , is_batch : Option < bool > ) {
45
44
unsafe {
46
- let err_val = af_set_array_indexer ( idxr. clone ( ) . get ( ) as MutAfIndex ,
47
- self . get ( ) as AfArray ,
48
- dim as DimT ) ;
45
+ let err_val = af_set_array_indexer ( idxr. get ( ) as AfIndex , self . clone ( ) . get ( ) as AfArray ,
46
+ dim as DimT ) ;
49
47
HANDLE_ERROR ( AfError :: from ( err_val) ) ;
50
48
}
51
49
}
@@ -56,9 +54,9 @@ impl Indexable for Array {
56
54
/// This is used in functions [index_gen](./fn.index_gen.html) and
57
55
/// [assign_gen](./fn.assign_gen.html)
58
56
impl < T : Copy > Indexable for Seq < T > where c_double : From < T > {
59
- fn set ( & self , idxr : & Indexer , dim : u32 , is_batch : Option < bool > ) {
57
+ fn set ( & self , idxr : & mut Indexer , dim : u32 , is_batch : Option < bool > ) {
60
58
unsafe {
61
- let err_val = af_set_seq_indexer ( idxr. clone ( ) . get ( ) as MutAfIndex ,
59
+ let err_val = af_set_seq_indexer ( idxr. get ( ) as AfIndex ,
62
60
& SeqInternal :: from_seq ( self ) as * const SeqInternal ,
63
61
dim as DimT , is_batch. unwrap ( ) as c_int ) ;
64
62
HANDLE_ERROR ( AfError :: from ( err_val) ) ;
@@ -74,33 +72,25 @@ impl Indexer {
74
72
let mut temp: i64 = 0 ;
75
73
let err_val = af_create_indexers ( & mut temp as MutAfIndex ) ;
76
74
HANDLE_ERROR ( AfError :: from ( err_val) ) ;
77
- Indexer { handle : temp, count : 0 }
75
+ Indexer { handle : temp}
78
76
}
79
77
}
80
78
81
79
/// Set either [Array](./struct.Array.html) or [Seq](./struct.Seq.html) to index an Array along `idx` dimension
82
80
pub fn set_index < T : Indexable > ( & mut self , idx : & T , dim : u32 , is_batch : Option < bool > ) {
83
- self . count = self . count + 1 ;
84
81
idx. set ( self , dim, is_batch)
85
82
}
86
83
87
84
/// Get native(ArrayFire) resource handle
88
85
pub fn get ( & self ) -> i64 {
89
86
self . handle
90
87
}
91
-
92
- /// Get number of indexers
93
- ///
94
- /// This can be a maximum of four since currently ArrayFire supports maximum of four dimensions
95
- pub fn len ( & self ) -> u32 {
96
- self . count
97
- }
98
88
}
99
89
100
90
impl Drop for Indexer {
101
91
fn drop ( & mut self ) {
102
92
unsafe {
103
- let ret_val = af_release_indexers ( self . handle as MutAfIndex ) ;
93
+ let ret_val = af_release_indexers ( self . handle as AfIndex ) ;
104
94
match ret_val {
105
95
0 => ( ) ,
106
96
_ => panic ! ( "Failed to release indexers resource: {}" , ret_val) ,
@@ -338,7 +328,7 @@ pub fn index_gen(input: &Array, indices: Indexer) -> Array {
338
328
unsafe {
339
329
let mut temp: i64 = 0 ;
340
330
let err_val = af_index_gen ( & mut temp as MutAfArray , input. get ( ) as AfArray ,
341
- indices . len ( ) as DimT , indices. get ( ) as * const IndexT ) ;
331
+ 4 , indices. get ( ) as AfIndex ) ;
342
332
HANDLE_ERROR ( AfError :: from ( err_val) ) ;
343
333
Array :: from ( temp)
344
334
}
@@ -380,7 +370,7 @@ pub fn assign_gen(lhs: &Array, indices: &Indexer, rhs: &Array) -> Array {
380
370
unsafe {
381
371
let mut temp: i64 = 0 ;
382
372
let err_val = af_assign_gen ( & mut temp as MutAfArray , lhs. get ( ) as AfArray ,
383
- indices . len ( ) as DimT , indices. get ( ) as * const IndexT ,
373
+ 4 , indices. get ( ) as AfIndex ,
384
374
rhs. get ( ) as AfArray ) ;
385
375
HANDLE_ERROR ( AfError :: from ( err_val) ) ;
386
376
Array :: from ( temp)
0 commit comments