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