#include "upb/def.h" #include "upb/msg.h" #ifndef UPB_MSGFACTORY_H_ #define UPB_MSGFACTORY_H_ /** upb_msgfactory ************************************************************/ struct upb_msgfactory; typedef struct upb_msgfactory upb_msgfactory; #ifdef __cplusplus extern "C" { #endif /* A upb_msgfactory contains a cache of upb_msglayout, upb_handlers, and * upb_visitorplan objects. These are the objects necessary to represent, * populate, and and visit upb_msg objects. * * These caches are all populated by upb_msgdef, and lazily created on demand. */ /* Creates and destroys a msgfactory, respectively. The messages for this * msgfactory must come from |symtab| (which should outlive the msgfactory). */ upb_msgfactory *upb_msgfactory_new(const upb_symtab *symtab); void upb_msgfactory_free(upb_msgfactory *f); const upb_symtab *upb_msgfactory_symtab(const upb_msgfactory *f); /* The functions to get cached objects, lazily creating them on demand. These * all require: * * - m is in upb_msgfactory_symtab(f) * - upb_msgdef_mapentry(m) == false (since map messages can't have layouts). * * The returned objects will live for as long as the msgfactory does. * * TODO(haberman): consider making this thread-safe and take a const * upb_msgfactory. */ const upb_msglayout *upb_msgfactory_getlayout(upb_msgfactory *f, const upb_msgdef *m); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* UPB_MSGFACTORY_H_ */