Annotation of parser3/src/include/pa_request.h, revision 1.5

1.1       paf         1: /*
1.5     ! paf         2:   $Id: pa_request.h,v 1.4 2001/01/30 13:07:31 paf Exp $
1.1       paf         3: */
                      4: 
                      5: #ifndef PA_REQUEST_H
                      6: #define PA_REQUEST_H
                      7: 
                      8: #include "pa_pool.h"
1.4       paf         9: #include "pa_exception.h"
1.5     ! paf        10: #include "pa_hash.h"
1.4       paf        11: 
                     12: class Local_request_exception;
1.1       paf        13: 
                     14: class Request {
1.4       paf        15:        friend Local_request_exception;
1.1       paf        16: public:
                     17:        
1.5     ! paf        18:        Request(Pool& apool) : 
        !            19:                fpool(apool), 
        !            20:                fclasses(new(apool) Hash(apool)) {
        !            21:        }
1.3       paf        22:        ~Request() {}
1.1       paf        23: 
1.5     ! paf        24:        // IMPORTANT: don't use pool without  Local_request_exception 
1.4       paf        25:        Pool& pool() { return fpool; }
                     26: 
                     27:        Exception& exception() { return *fexception; }
1.5     ! paf        28:        Hash& classes() { return *fclasses; }
1.4       paf        29: 
1.3       paf        30: protected:
1.1       paf        31: 
1.4       paf        32:        // all request' objects are allocated in this pool
1.3       paf        33:        Pool& fpool;
1.4       paf        34: 
                     35:        // exception replacement mechanism is protected from direct usage
                     36:        // Local_request_exception object enforces paired set/restore
                     37:        Exception *set_exception(Exception *e){
                     38:                Exception *r=fexception;
                     39:                fexception=e;
                     40:                return r;
                     41:        }
                     42:        void restore_exception(Exception *e) {
                     43:                fexception=e;
                     44:        }
                     45: 
                     46: private:
                     47: 
                     48:        // current request's exception object
                     49:        Exception *fexception;
1.5     ! paf        50: 
        !            51:        // defined classes
        !            52:        Hash *fclasses;
1.4       paf        53: 
1.1       paf        54: };
1.4       paf        55: 
                     56: class Local_request_exception {
                     57:        Request request;
                     58:        Exception *saved_exception;
                     59: public:
                     60:        Local_request_exception(Request& arequest, Exception& exception) : 
                     61:                request(arequest),
                     62:                saved_exception(arequest.set_exception(&exception)) {}
                     63:        ~Local_request_exception() { request.restore_exception(saved_exception); }
                     64: };
                     65: 
1.1       paf        66: 
                     67: #endif

E-mail: