#ifndef MARSHALL_H #define MARSHALL_H #include #include class SmokeType; class Marshall { public: /** * FromVALUE is used for virtual function return values and regular * method arguments. * * ToVALUE is used for method return-values and virtual function * arguments. */ typedef void (*HandlerFn)(Marshall *); enum Action { FromVALUE, ToVALUE }; virtual SmokeType type() = 0; virtual Action action() = 0; virtual Smoke::StackItem &item() = 0; virtual VALUE * var() = 0; virtual void unsupported() = 0; virtual Smoke *smoke() = 0; /** * For return-values, next() does nothing. * For FromRV, next() calls the method and returns. * For ToRV, next() calls the virtual function and returns. * * Required to reset Marshall object to the state it was * before being called when it returns. */ virtual void next() = 0; /** * For FromSV, cleanup() returns false when the handler should free * any allocated memory after next(). * * For ToSV, cleanup() returns true when the handler should delete * the pointer passed to it. */ virtual bool cleanup() = 0; virtual ~Marshall() {} }; #endif