Strategy

  • P-trie in code, top-down parsing
  • Message storage allocated from pool
  • Bottom-up packaging

Example

struct BASE_MSG {
    enum MSG_TYPE type;
    size_t size;
};

struct PARENT_MSG {
    struct BASE_MSG base;
    enum PARENT_MSG_TYPE type;
    int pdata1;
};

struct CHILD_MSG {
    struct PARENT_MSG parent;
    int cdata1;
    int cdata2;
};

Pro

  • Easy to initialise CHILD_MSG cm = { { { MSG_TYPE_PARENT, // contains PARENT_MSG sizeof(CHILD_MSG) }, // BASE_MSG PARENT_MSG_TYPE_CHILD, // contains CHILD_MSG parent_data1 }, //PARENT_MSG child_data1, child_data2 }; // CHILD_MSG

Con

  • Member access looks a bit messy
  • Bottom-up access is counter-intuitive cm.parent.pdata1 = parent_data1; cm.parent.pdata2 = parent_data2;

  • Can only be used for fixed-size message hierarchies

Notes

  • Either use global type for all messages (used in BASE_MSG and inherited)
  • Or hierarchical type member (present in each sub-message)
  • Global size for passing around safely
  • Or hierarchical types