====== OrderContainer ====== **//Inherited from//** NULL **//Inherited by//** NULL **//Friend class//** NULL **//Description//** OrderContainer是一种顺序对象的容器,它一般用来为主从关系对象中的主对象(Master Object)管理从对象,主从关系对象是XT数据框架约定的一种特定关系,在该约定中,对于每一个从对象最多属于一个主对象(也可以为空),比如,一个单元最多属于一个几何实体。为了保证在主对象中遍历从对象的顺序一定(如果顺序不一定,由于计算机的截断误差等将无法保证涉及该主从对象的算法结果保持一致),从对象必须保证一定的顺序关系(Order),它通过存储对象的前后相邻对象来保证这一顺序关系,而OrderContainer会存储首尾从对象。这样的数据结构设计虽然使用了多余的空间用来保存相邻对象以及主对象的引用,但主对象也不需要用单独的数组等数据结构来保存子对象的引用,能够充分利用内存池的特点,总体上内存的使用更加合理;同时,顺序访问和随机访问(通过对象管理器的接口)的性能都可以得到最大程度的优化,对主从关系对象的修改(比如删除、添加)也更加简洁、方便。\\ 主从关系对象的管理主要包含主从关系的关联(attach)和解除(detach),由于从对象的顺序关系也要保证一致性,在记录数据操作时,从对象的相邻关系也会存取到IO中,便于在undo、redo或者rollback时恢复目标状态;在保存为独立的数据文件时,为了节省空间,从对象保存时并不保存相邻对象的信息,但需要按照顺序保存到IO中,这样在从IO中按顺序读取时就能还原之前的顺序状态。\\ XT从文件中读取对象时使用ID地址(将一个地址分为两个int,第一个int设置为-1,第二个int设置为对象ID,这个地址被称为ID地址)处理关联对象,因为在程序中关联对象(包括主对象以及相邻对象)以对象指针的形式存在于内存中,但保存到文件中时一般安装ID保存,这样读取时需要从ID转换为对象指针,但是读取对象的时候并不能保证关联对象都已经构建出来,因此此时会将关联ID保存到对应的对象指针中,在所有对象都构建完成时通过调用对象管理器的updateCache来更新这些关联对象的指针使得他们指向实际对象的地址(而不再时ID地址)。 **//Members//** * const XItem * [[ordercontainer#m_pfront|m_pFront]] * const XItem * [[ordercontainer#m_pback|m_pBack]] * ulong [[ordercontainer#m_ulcount|m_ulCount]] **//Private interface//** * const XItem * [[ordercontainer#front|front]]() const * const XItem * [[ordercontainer#back|back]]() const * ulong [[ordercontainer#count|count]]() const * [[ordercontainer#ordercontainer1|OrderContainer]]() * void [[ordercontainer#attach|attach]](XItem * master, OrderItem * oi, XManager * oiMgr) * void [[ordercontainer#detach|detach]](XItem * master, OrderItem * oi, XManager * oiMgr) * void [[ordercontainer#attach|attach]](XItem * master, NOrderItem * oi, XManager * oiMgr) * void [[ordercontainer#detach|detach]](XItem * master, NOrderItem * oi, XManager * oiMgr) * void [[ordercontainer#updatemasterlink|updateMasterLink]](const OrderItem * oi, const XItem * master) * void [[ordercontainer#updatemasterlink|updateMasterLink]](const NOrderItem * oi, const XItem * master) * void [[ordercontainer#serialize|serialize]](XBinaryIO * io, bool bSave) * void [[ordercontainer#updatefrontbackpointer|updateFrontBackPointer]](XManager * oiMgr) * void [[ordercontainer#reset|reset]]() ---- {{anchor:m_pfront}} **const XItem * m_pFront** 第一个从对象 {{anchor:m_pback}} **const XItem * m_pBack** 最后一个从对象 {{anchor:m_ulcount}} **ulong m_ulCount** 从对象个数 ---- {{anchor:front}} **const XItem * front() const** *function: 获取第一个从对象 *parameters: NULL *return value: 第一个从对象指针 {{anchor:back}} **const XItem * back() const** *function: 获取最后一个对象 *parameters: NULL *return value: 最后一个对象指针 {{anchor:count}} **ulong count() const** *function: 获取从对象个数 *parameters: NULL *return value: 从对象个数 {{anchor:ordercontainer1}} **OrderContainer()** *function: 构造函数 *parameters: NULL *return value: 无 {{anchor:attach}} **void attach(XItem * master, OrderItem * oi, XManager * oiMgr)** *function: 关联对象的主从关系,更新从对象的相邻对象的顺序信息。 *parameters: - [i]XItem * master: 主对象 - [i] OrderItem * oi: 从对象 - [i] XManager * oiMgr: 从对象管理容器 *return value: 无 {{anchor:detach}} **void detach(XItem * master, OrderItem * oi, XManager * oiMgr)** *function: 解除对象的主从关系,更新从对象的相邻对象的顺序信息 *parameters: - [i]XItem * master: 主对象 - [i] OrderItem * oi: 从对象 - [i] XManager * oiMgr: 从对象管理容器 *return value: 无 {{anchor:attach}} **void attach(XItem * master, NOrderItem * oi, XManager * oiMgr)** *function: 关联对象的主从关系,更新从对象的相邻对象的顺序信息。 *parameters: - [i]XItem * master: 主对象 - [i] NOrderItem * oi: 从对象 - [i] XManager * oiMgr: 从对象管理容器 *return value: 无 {{anchor:detach}} **void detach(XItem * master, NOrderItem * oi, XManager * oiMgr)** *function: 解除对象的主从关系,更新从对象的相邻对象的顺序信息 *parameters: - [i]XItem * master: 主对象 - [i] NOrderItem * oi: 从对象 - [i] XManager * oiMgr: 从对象管理容器 *return value: 无 {{anchor:updatemasterlink}} **void updateMasterLink(const OrderItem * oi, const XItem * master)** *function: 更新主对象链接,并通过从对象的相邻对象信息更新主对象的首尾从对象信息,一般用于读取或导入文件时已经创建全部从对象的场合,这时从对象只有主对象的ID信息。 *parameters: - [i]const OrderItem * oi: 从对象指针 - [i] const XItem * master: 主对象指针 *return value: 无 {{anchor:updatemasterlink}} **void updateMasterLink(const NOrderItem * oi, const XItem * master)** *function: 更新主对象链接,并通过从对象的相邻对象信息更新主对象的首尾从对象信息,一般用于读取或导入文件时已经创建全部从对象的场合,这时从对象只有主对象的ID信息。 *parameters: - [i]const NOrderItem * oi: 从对象指针 - [i] const XItem * master: 主对象指针 *return value: 无 {{anchor:serialize}} **void serialize(XBinaryIO * io, bool bSave)** *function: 序列化到二进制文件中或从二进制文件中读取内容构建对象 *parameters: - [i]XBinaryIO * io: 二进制文件句柄 - [i] bool bSave: 如保存到二进制文件中为true,否则为false *return value: 无 {{anchor:updatefrontbackpointer}} **void updateFrontBackPointer(XManager * oiMgr)** *function: 更新首尾从对象指针,一般用于读取或导入文件时已经创建全部从对象的场合,这时主对象的首尾从对象指针可能处于ID地址的状态 *parameters: - [i]XManager * oiMgr: 从对象管理器 *return value: 无 {{anchor:reset}} **void reset()** *function: 重置容器,首尾为空,个数清零 *parameters: NULL *return value: 无