doc: Add serial to list of ci file reserved words
[charm.git] / src / conv-core / debug-conv++.h
1 //#include "debug-conv.h"
2 #include "pup.h"
3
4 #ifndef DEBUG_CONV_PLUSPLUS_H
5 #define DEBUG_CONV_PLUSPLUS_H
6
7 /**
8   A CpdListAccessor responds to CCS requests for a single CpdList.
9   To make some data available via the CpdList interface, you 
10   make a subclass of this class (possibly CpdSimpleListAccessor),
11   and pass it to CpdListRegister, below.
12 */
13 class CpdListAccessor {
14 protected:
15   /**
16     Subclasses must call this before pupping each requested item.
17     This inserts a marker to allow the client to distinguish between
18     different CpdList items. 
19   */
20   void beginItem(PUP::er &p,int itemNo);
21   /// Decides if this CpdList requires boundary checking
22   bool checkBound;
23 public:
24   CpdListAccessor() : checkBound(true) {}
25   virtual ~CpdListAccessor(); 
26   /// Return the CpdList path CCS clients should use to access this data.
27   virtual const char *getPath(void) const =0;
28   /// Return the length of this CpdList.
29   virtual size_t getLength(void) const =0;
30   /// Does this CpdList requires boundary checking?
31   virtual bool checkBoundary(void) const { return checkBound; }
32   /// Pup the items listed in this request.  Be sure to call beginItem between items!
33   virtual void pup(PUP::er &p,CpdListItemsRequest &req) =0;
34 };
35
36 /**
37   Register this CpdListAccessor with Cpd.  The accessor
38   will then be called to respond to CCS requests for its path.
39   CpdList will eventually delete this object.
40 */
41 void CpdListRegister(CpdListAccessor *acc);
42
43 class CpdListAccessor_c : public CpdListAccessor {
44   const char *path; //Path to this item
45   CpdListLengthFn_c lenFn;
46   void *lenParam;
47   CpdListItemsFn_c itemsFn;
48   void *itemsParam;
49 public:
50   CpdListAccessor_c(const char *path_,
51             CpdListLengthFn_c lenFn_,void *lenParam_,
52             CpdListItemsFn_c itemsFn_,void *itemsParam_,bool checkBoundary_=true):
53         path(path_), lenFn(lenFn_), lenParam(lenParam_), 
54         itemsFn(itemsFn_), itemsParam(itemsParam_) {checkBound = checkBoundary_;}
55   CpdListAccessor_c(const CpdListAccessor_c &p);//You don't want to copy
56   void operator=(const CpdListAccessor_c &p);   // You don't want to copy
57   
58   virtual const char *getPath(void) const {return path;}
59   virtual size_t getLength(void) const {return (*lenFn)(lenParam);}
60   virtual void pup(PUP::er &p,CpdListItemsRequest &req) {
61     (itemsFn)(itemsParam,(pup_er *)&p,&req);
62   }
63 };
64
65 /**
66   A typical CpdList accessor: length is stored at some fixed 
67    location in memory, path is a constant string, and the 
68    pup routine is completely random-access.
69 */
70 class CpdSimpleListAccessor : public CpdListAccessor {
71 public:
72         /// This routine is called to pup each item of the list.
73         ///  beginItem has already been called before this function.
74         typedef void (*pupFn)(PUP::er &p,int itemNo);
75 private:
76         const char *path;
77         size_t &length;
78         pupFn pfn;
79 public:
80         /**
81           Create a new CpdSimpleListAccessor.
82              \param path_ CpdList path CCS clients should use.
83              \param length_ Reference to number of elements in the list.
84                             This class keeps the reference, so as the list length
85                             changes, Cpd always has the latest value.
86                             In particular, this means length must not be moved!
87              \param pfn_ Function to pup the items in the list.
88         */
89         CpdSimpleListAccessor(const char *path_,size_t &length_,pupFn pfn_)
90                 :path(path_),length(length_),pfn(pfn_) { }
91         virtual ~CpdSimpleListAccessor();
92         virtual const char *getPath(void) const;
93         virtual size_t getLength(void) const;
94         virtual void pup(PUP::er &p,CpdListItemsRequest &req);
95 };
96
97 #endif