Annotation of parser3/src/include/pa_pool.h, revision 1.23

1.1       paf         1: /*
1.23    ! paf         2:   $Id: pa_pool.h,v 1.22 2001/02/20 18:45:51 paf Exp $
1.1       paf         3: */
                      4: 
                      5: #ifndef PA_POOL_H
                      6: #define PA_POOL_H
                      7: 
                      8: #include <stddef.h>
                      9: 
1.23    ! paf        10: //class String;
1.21      paf        11: class Exception;
1.23    ! paf        12: class Local_exception;
1.1       paf        13: 
                     14: class Pool {
1.23    ! paf        15:        friend Local_exception;
1.1       paf        16: public:
1.18      paf        17: 
                     18:        // Exception to report pool errors 
1.23    ! paf        19:        Pool(Exception& aexception) : fexception(&aexception) {}
1.18      paf        20:        ~Pool() {}
                     21: 
1.23    ! paf        22:        Exception& exception() const { return *fexception; }
1.18      paf        23: 
                     24:        void *malloc(size_t size) {
                     25:                return check(real_malloc(size), size);
                     26:        }
                     27:        void *calloc(size_t size) {
                     28:                return check(real_calloc(size), size);
                     29:        }
1.8       paf        30: 
1.23    ! paf        31: private: // implementation defined
1.18      paf        32: 
1.20      paf        33:     void *real_malloc(size_t size);
                     34:     void *real_calloc(size_t size);
1.17      paf        35: 
1.23    ! paf        36: private: 
1.17      paf        37: 
1.23    ! paf        38:        // checks whether mem allocated OK. throws exception otherwise
        !            39:        void *check(void *ptr, size_t size) {
        !            40:                if(ptr)
        !            41:                        return ptr;
        !            42: 
        !            43:                fail(size);
        !            44: 
        !            45:                // never reached
        !            46:                return 0;
        !            47:        }
        !            48:        // raises proper exception
        !            49:        void fail(size_t size) const;
        !            50: 
        !            51: protected: // exception handling
1.17      paf        52: 
1.23    ! paf        53:        // exception replacement mechanism is 'protected' from direct usage
        !            54:        // Local_exception object enforces paired set/restore
        !            55:        Exception *set_exception(Exception *e){
        !            56:                Exception *r=fexception;
        !            57:                fexception=e;
        !            58:                return r;
        !            59:        }
        !            60:        void restore_exception(Exception *e) {
        !            61:                fexception=e;
        !            62:        }
        !            63: 
        !            64: private:
        !            65: 
        !            66:        // current request's exception object
        !            67:        Exception *fexception;
1.17      paf        68: 
1.8       paf        69: private: //disabled
                     70: 
1.18      paf        71:        // Pool(const Pool&) {}
1.16      paf        72:        Pool& operator = (const Pool&) { return *this; }
1.21      paf        73: };
                     74: 
                     75: class Pooled {
1.23    ! paf        76:        // the pool i'm allocated on
        !            77:        Pool& fpool;
1.21      paf        78: public:
1.23    ! paf        79:        
1.21      paf        80:        static void *operator new(size_t size, Pool& apool) { 
                     81:                return apool.malloc(size);
                     82:        }
                     83: 
1.23    ! paf        84:        Pooled(Pool& apool) : fpool(apool) {
        !            85:        }
        !            86: 
1.22      paf        87:        Pool& pool() const { return fpool; }
1.21      paf        88: 
1.23    ! paf        89:        void *malloc(size_t size) const { return fpool.malloc(size); }
        !            90:        void *calloc(size_t size) const { return fpool.calloc(size); }
        !            91:        Exception& exception() const { return fpool.exception(); }
        !            92: };
        !            93: #define NEW new(pool())
        !            94: 
        !            95: class Local_exception {
        !            96:        Pool pool;
        !            97:        Exception *saved_exception;
        !            98: public:
        !            99:        Local_exception(Pool& apool, Exception& exception) : 
        !           100:                pool(apool),
        !           101:                saved_exception(apool.set_exception(&exception)) {
        !           102:        }
        !           103:        ~Local_exception() { 
        !           104:                pool.restore_exception(saved_exception); 
        !           105:        }
1.1       paf       106: };
1.23    ! paf       107: 
        !           108: #define TRY if(setjmp((exception()).mark)==0){
        !           109: #define THROW exception()._throw
        !           110: #define CATCH(e) }else{ Exception& e=exception();
        !           111: #define END_CATCH }
        !           112: // usage:
        !           113: //   TRY { ...; if(?) RAISE(?); ...; } CATCH { catch-code EXCEPTION.comment() }
1.1       paf       114: 
                    115: #endif

E-mail: