11623659165bb24d733a40124e929cfd42aa917e3David Gross// -Wall
265f23ed862e1a1e16477ba740f295ff4a83ac822David Gross#pragma version(1)
365f23ed862e1a1e16477ba740f295ff4a83ac822David Gross#pragma rs java_package_name(accum)
465f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
565f23ed862e1a1e16477ba740f295ff4a83ac822David Gross// Several checks for bad accumulator DATA TYPE (not bad accumulator FUNCTION)
665f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
765f23ed862e1a1e16477ba740f295ff4a83ac822David Gross/////////////////////////////////////////////////////////////////////////////
865f23ed862e1a1e16477ba740f295ff4a83ac822David Gross// accumulator cannot be incomplete array
965f23ed862e1a1e16477ba740f295ff4a83ac822David Gross/////////////////////////////////////////////////////////////////////////////
1065f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
1165f23ed862e1a1e16477ba740f295ff4a83ac822David Grosstypedef int IntA[]; // incomplete (unknown element count)
1265f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
1365f23ed862e1a1e16477ba740f295ff4a83ac822David Gross#pragma rs reduce(redIntA) accumulator(AccumIntA) combiner(CombIntA)
1465f23ed862e1a1e16477ba740f295ff4a83ac822David Grossstatic void AccumIntA(IntA *accum, int val) { }
1565f23ed862e1a1e16477ba740f295ff4a83ac822David Grossstatic void CombIntA(IntA *accum, const IntA *val) { }
1665f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
1765f23ed862e1a1e16477ba740f295ff4a83ac822David Gross// outconverter does not help
1865f23ed862e1a1e16477ba740f295ff4a83ac822David Gross#pragma rs reduce(redIntAOut) accumulator(AccumIntA) combiner(CombIntA) outconverter(OutIntA)
1965f23ed862e1a1e16477ba740f295ff4a83ac822David Grossstatic void OutIntA(int *out, const IntA *val) { }
2065f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
2165f23ed862e1a1e16477ba740f295ff4a83ac822David Gross/////////////////////////////////////////////////////////////////////////////
2265f23ed862e1a1e16477ba740f295ff4a83ac822David Gross// accumulator cannot be incomplete struct
2365f23ed862e1a1e16477ba740f295ff4a83ac822David Gross/////////////////////////////////////////////////////////////////////////////
2465f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
2565f23ed862e1a1e16477ba740f295ff4a83ac822David Grossstruct Incomplete;
2665f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
2765f23ed862e1a1e16477ba740f295ff4a83ac822David Gross#pragma rs reduce(redStructIncomplete) accumulator(AccumStructIncomplete) combiner(CombStructIncomplete)
2865f23ed862e1a1e16477ba740f295ff4a83ac822David Grossstatic void AccumStructIncomplete(struct Incomplete *accum, int val) { }
2965f23ed862e1a1e16477ba740f295ff4a83ac822David Grossstatic void CombStructIncomplete(struct Incomplete *accum, const struct Incomplete *other) { }
3065f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
3165f23ed862e1a1e16477ba740f295ff4a83ac822David Gross// outconverter does not help
3265f23ed862e1a1e16477ba740f295ff4a83ac822David Gross#pragma rs reduce(redStructIncompleteOut) accumulator(AccumStructIncomplete) combiner(CombStructIncomplete) \
3365f23ed862e1a1e16477ba740f295ff4a83ac822David Gross  outconverter(OutStructIncomplete)
3465f23ed862e1a1e16477ba740f295ff4a83ac822David Grossstatic void OutStructIncomplete(int *out, const struct Incomplete *val) { }
3565f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
3665f23ed862e1a1e16477ba740f295ff4a83ac822David Gross/////////////////////////////////////////////////////////////////////////////
3765f23ed862e1a1e16477ba740f295ff4a83ac822David Gross// accumulator cannot be function
3865f23ed862e1a1e16477ba740f295ff4a83ac822David Gross/////////////////////////////////////////////////////////////////////////////
3965f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
4065f23ed862e1a1e16477ba740f295ff4a83ac822David Grosstypedef void Fn(void);
4165f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
4265f23ed862e1a1e16477ba740f295ff4a83ac822David Gross#pragma rs reduce(redFn) accumulator(AccumFn) combiner(CombineFn)
4365f23ed862e1a1e16477ba740f295ff4a83ac822David Grossstatic void AccumFn(Fn *accum, int val) { }
4465f23ed862e1a1e16477ba740f295ff4a83ac822David Grossstatic void CombineFn(Fn *accum, const Fn *other) { }
4565f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
4665f23ed862e1a1e16477ba740f295ff4a83ac822David Gross// outconverter does not help
4765f23ed862e1a1e16477ba740f295ff4a83ac822David Gross#pragma rs reduce(redFnOut) accumulator(AccumFn) combiner(CombineFn) outconverter(OutFn)
4865f23ed862e1a1e16477ba740f295ff4a83ac822David Grossstatic void OutFn(int *out, const Fn *val) { }
4965f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
5065f23ed862e1a1e16477ba740f295ff4a83ac822David Gross/////////////////////////////////////////////////////////////////////////////
5165f23ed862e1a1e16477ba740f295ff4a83ac822David Gross// accumulator cannot be object
5265f23ed862e1a1e16477ba740f295ff4a83ac822David Gross/////////////////////////////////////////////////////////////////////////////
5365f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
5465f23ed862e1a1e16477ba740f295ff4a83ac822David Gross#pragma rs reduce(redObj) accumulator(AccumObj) combiner(CombineObj)
5565f23ed862e1a1e16477ba740f295ff4a83ac822David Grossstatic void AccumObj(rs_element *accum, int val) { }
5665f23ed862e1a1e16477ba740f295ff4a83ac822David Grossstatic void CombineObj(rs_element *accum, const rs_element *other) { }
5765f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
5865f23ed862e1a1e16477ba740f295ff4a83ac822David Gross// outconverter does not help
5965f23ed862e1a1e16477ba740f295ff4a83ac822David Gross#pragma rs reduce(redObjOut) accumulator(AccumObj) combiner(CombineObj) outconverter(OutObj)
6065f23ed862e1a1e16477ba740f295ff4a83ac822David Grossstatic void OutObj(int *out, const rs_element *val) { }
6165f23ed862e1a1e16477ba740f295ff4a83ac822David Gross
62