#ifndef __GridFiller_h_ #define __GridFiller_h_ #include #include "GridReaderBase.h" #include "TclObjCache.h" class ErrorCollector { public: virtual void add(GridInstance *grid, Tcl_Interp *interp) =0; }; /* You should only use this in one thread. It is acceptable to create this * in a different thread, as long as all the other activity happens in just * one thread. (I'm not sure about destroying the object in a different * thread.) */ class GridFiller { private: Tcl_Interp *_interp; GridInstance *_grid; ErrorCollector *_errorCollector; void initInterp(); int commonArgs(int objc, Tcl_Obj *const objv[], int &firstRow, int &lastRow, int &column, bool &skipBadValues); static int sumCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); int sumCmd(int objc, Tcl_Obj *const objv[]); static int countCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); int countCmd(int objc, Tcl_Obj *const objv[]); static int averageCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); int averageCmd(int objc, Tcl_Obj *const objv[]); static int maxCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); int maxCmd(int objc, Tcl_Obj *const objv[]); static int minCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); int minCmd(int objc, Tcl_Obj *const objv[]); static int refCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); int refCmd(int objc, Tcl_Obj *const objv[]); static int currentCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); int currentCmd(int objc, Tcl_Obj *const objv[]); static int symbolCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); int symbolCmd(int objc, Tcl_Obj *const objv[]); static int ifEmptyCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); int ifEmptyCmd(int objc, Tcl_Obj *const objv[]); static int isEmptyCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); int isEmptyCmd(int objc, Tcl_Obj *const objv[]); static int getValuesAllCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); int getValuesAllCmd(int objc, Tcl_Obj *const objv[]); public: GridFiller(); ~GridFiller(); void fillCell(GridInstance *grid); void fillRow(GridInstance *grid); void setErrorCollector(ErrorCollector *ec) { _errorCollector = ec; } // This was originally only intended for test programs. Tcl_Interp *debugGetInterp() { initInterp(); return _interp; } }; #endif