Try using nested template args for EP templates. Just a sanity check
[charm.git] / tests / charm++ / method_templates / pgm.C
1 #include "client.decl.h"
2 #include "mylib.h"
3 #define CK_TEMPLATES_ONLY
4 #include "mylib.def.h"
5 #undef CK_TEMPLATES_ONLY
6 #include <iostream>
7 #include <functional>
8
9 // Utility functors
10 template <typename cmp>
11 class count {
12     private:
13         int threshold, num;
14         cmp c;
15     public:
16         count(const int _t=0): threshold(_t), num(0) {}
17         inline void operator() (int i) { if (c(i, threshold)) num++; }
18         void pup(PUP::er &p) { p | threshold; p | num; }
19         friend std::ostream& operator<< (std::ostream& out, const count& obj) {
20             out << "threshold = "<< obj.threshold << "; "
21                 << "num = " << obj.num;
22             return out;
23         }
24 };
25
26
27 class avg {
28     private:
29         int sum, num;
30     public:
31         avg(): sum(0), num(0) {}
32         inline void operator() (int i) { sum += i; num++; }
33         void pup(PUP::er &p) { p | sum; p | num; }
34         friend std::ostream& operator<< (std::ostream& out, const avg& obj) {
35             out << "num = " << obj.num << "; "
36                 << "sum = " << obj.sum << "; "
37                 << "avg = " << ( obj.num ? (double)obj.sum/obj.num : obj.sum );
38             return out;
39         }
40 };
41
42
43 // Temporary initproc to register the instantiated EPs
44 void register_instantiations()
45 {
46     count< std::less<int> >  comparator;
47     avg avger;
48     CkIndex_libArray::doSomething< count<std::less<int> > >(comparator);
49     CkIndex_libArray::doSomething<avg>(avger);
50 };
51
52
53 // Test driver
54 class pgm : public CBase_pgm
55 {
56     public:
57         pgm(CkArgMsg *m): nElements(CkNumPes()), nDone(0)
58         {
59             arrProxy = CProxy_libArray::ckNew(nElements);
60             arrProxy.ckSetReductionClient( new CkCallback(CkIndex_pgm::endTest(), thisProxy) );
61             thisProxy.startTest();
62             delete m;
63         }
64         
65         void startTest() {
66             //count< std::less<int> > cnt(5);
67             arrProxy.doSomething( count< std::less<int> >(5) );
68             arrProxy.doSomething(avg());
69         }
70
71         void endTest() {
72             if (++nDone == 2)
73                 CkExit();
74         }
75
76     private:
77         CProxy_libArray arrProxy;
78         int nElements, nDone;
79 };
80
81 #include "client.def.h"
82