swig_api.h 3.92 KB
Newer Older
1
2
3
#ifndef EXAMPLE_SWIG_ApI_H_ 
#define EXAMPLE_SWIG_ApI_H_

4
// This file is essentially a small unit test for the swig cmake scripts and the java array
5
6
7
8
9
10
// classes.  All it does it define a few simple functions for writing to and summing
// arrays.  The swig_test.java file then calls these C++ functions and checks if they work
// correctly.  



11
12
13
14
15
// Let's use java_array.h, a tool for efficiently binding java native arrays to C++
// function arguments.  You do this by putting this pair of include statements in your
// swig_api.h file.  Then after that you can use the java::array, java::array_view, and
// java::array_view_crit classes.  
#include "java_array.h"
16
#ifdef SWIG
17
%include "java_array.h"
18
19
20
#endif


21
22
using namespace java;

23
24
25
26
27
28

// SWIG can't expose templated functions to java.  We declare these here as helper
// functions to make the non-templated routines swig will expose easier to write.  You can
// see these java exposed methods below (i.e. sum(), sum_crit(), assign(), and
// assign_crit()).
template <typename T>
29
T tsum(const array_view_crit<T>& arr)
30
31
32
33
34
35
36
{
    T s = 0;
    for (auto& v : arr)
        s += v;
    return s;
}
template <typename T>
37
T tsum(const array_view<T>& arr)
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
{
    T s = 0;
    for (auto& v : arr)
        s += v;
    return s;
}
template <typename T>
void tassign(T& arr)
{
    for (size_t i = 0; i < arr.size(); ++i)
        arr[i] = i;
}

// ----------------------------------------------------------------------------------------

// Now write some functions SWIG will expose to java.  SWIG will automatically expose
// pretty much any non-template C++ code to java.  So just by defining these functions here
// we expose them to java.
// 
// All global C++ functions will appear in java as static member functions of class called
// "global", which is where these sum and assign routines will appear.  You can see
// examples of java code that calls them in swig_test.java.

61
62
63
64
65
66
67
68
69
70
71
inline int sum_crit(const array_view_crit<int16_t>& arr) { return tsum(arr); }
inline int sum(const array_view<int16_t>& arr) { return tsum(arr); }
inline void assign_crit(array_view_crit<int16_t>& arr) { tassign(arr); }
inline void assign(array_view<int16_t>& arr) { tassign(arr); }


inline int sum_crit(const array_view_crit<int32_t>& arr) { return tsum(arr); }
inline int sum(const array_view<int32_t>& arr) { return tsum(arr); }
inline void assign_crit(array_view_crit<int32_t>& arr) { tassign(arr); }
inline void assign(array_view<int32_t>& arr) { tassign(arr); }

72

73
74
75
76
inline int sum_crit(const array_view_crit<int64_t>& arr) { return tsum(arr); }
inline int sum(const array_view<int64_t>& arr) { return tsum(arr); }
inline void assign_crit(array_view_crit<int64_t>& arr) { tassign(arr); }
inline void assign(array_view<int64_t>& arr) { tassign(arr); }
77
78


79
80
81
82
inline int sum_crit(const array_view_crit<char>& arr) { return tsum(arr); }
inline int sum(const array_view<char>& arr) { return tsum(arr); }
inline void assign_crit(array_view_crit<char>& arr) { tassign(arr); }
inline void assign(array_view<char>& arr) { tassign(arr); }
83
84
85



86
87
88
89
inline double sum_crit(const array_view_crit<double>& arr) { return tsum(arr); }
inline double sum(const array_view<double>& arr) { return tsum(arr); }
inline void assign_crit(array_view_crit<double>& arr) { tassign(arr); }
inline void assign(array_view<double>& arr) { tassign(arr); }
90
91


92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
inline float sum_crit(array<float> arr) 
{ 
    array_view_crit<float> a(arr);
    return tsum(a); 
}
inline float sum(const array<float>& arr) 
{ 
    array_view<float> a(arr);
    return tsum(a); 
}
inline void assign_crit(array_view_crit<float>& arr) { tassign(arr); }
inline void assign(array<float>& arr) 
{ 
    array_view<float> a(arr);
    tassign(a); 
}
108

109
110
111
112
array<int32_t> make_an_array(size_t s)
{
    array<int32_t> arr(s);
    array_view_crit<int32_t> a(arr);
113

114
115
    for (size_t i = 0; i < a.size(); ++i)
        a[i] = i;
116

117
118
    return arr;
}
119
120
121
122
123
124
125
126


// ----------------------------------------------------------------------------------------


#endif // EXAMPLE_SWIG_ApI_H_