bool CNodeLiveWriterRef::IsValid() const { if (m_nodeId == XMLCPB_INVALID_ID) return false; CNodeLiveWriter* pNode = m_Writer.GetNodeLive( m_nodeId ); return (pNode->IsValid() && pNode->GetSafeCheckID() == m_safecheckID); }
CNodeLiveWriter* CNodeLiveWriterRef::GetNode() const { if (m_nodeId == XMLCPB_INVALID_ID) return NULL; CNodeLiveWriter* pNode = m_Writer.GetNodeLive( m_nodeId ); if (!pNode->IsValid() || pNode->GetSafeCheckID() != m_safecheckID) { assert( false ); return NULL; } return pNode; }
void CNodeLiveWriterRef::CopyFrom( const CNodeLiveWriterRef &other ) { m_nodeId = other.m_nodeId; m_pNode_Debug = other.m_pNode_Debug; m_safecheckID = other.m_safecheckID; if (m_nodeId != XMLCPB_INVALID_ID) { CNodeLiveWriter* pNode = m_Writer.GetNodeLive( m_nodeId ); if (!pNode->IsValid() || pNode->GetSafeCheckID() != m_safecheckID) { assert( false ); m_nodeId = XMLCPB_INVALID_ID; m_pNode_Debug = NULL; } } }
CNodeLiveWriterRef::CNodeLiveWriterRef( CWriter &Writer, NodeLiveID nodeId ) : m_Writer(Writer) { m_nodeId = nodeId; m_pNode_Debug = NULL; if (m_nodeId == XMLCPB_INVALID_ID) return; CNodeLiveWriter* pNode = m_Writer.GetNodeLive( m_nodeId ); if (!pNode->IsValid()) { assert( false ); return; } m_pNode_Debug = pNode; m_safecheckID = pNode->GetSafeCheckID(); }
void CWriter::LogStatistics() { CryLog("-----------Binary SaveGame Writer statistics--------------"); //// live nodes info { int nodesCreated = 0; int children = 0; int attrs = 0; for (int i=0; i<m_liveNodes.size(); ++i) { CNodeLiveWriter* pNode = m_liveNodes[i]; if (pNode) { assert( !pNode->IsValid() ); nodesCreated++; children += pNode->m_children.capacity(); attrs += pNode->m_attrs.capacity(); } } CryLog("live nodes. created: %d/%d children: %d attrs: %d", nodesCreated, MAX_NUM_LIVE_NODES, children, attrs ); } CryLog( "stringtables. Tags: %d/%d (%d kb) AttrNames: %d/%d (%d kb) stringsData: %d/%d (%d kb) total memory string tables: %d kb", m_tableTags.GetNumStrings(), MAX_NUM_TAGS, m_tableTags.GetDataSize()/1024, m_tableAttrNames.GetNumStrings(), MAX_NUM_NAMES, m_tableAttrNames.GetDataSize()/1024, m_tableStrData.GetNumStrings(), MAX_NUM_STRDATA, m_tableStrData.GetDataSize()/1024, ( m_tableTags.GetDataSize() + m_tableAttrNames.GetDataSize() + m_tableStrData.GetDataSize() )/1024 ); CryLog("Nodes. total: %d maxNumChildrenPerNode: %d total children: %d maxAttrsPerNode:%d total attrs: %d AttrSets: %d (%d kb)", CNodeLiveWriter::m_stats.m_totalNodesCreated, CNodeLiveWriter::m_stats.m_maxNumChildren, CNodeLiveWriter::m_stats.m_totalChildren, CNodeLiveWriter::m_stats.m_maxNumAttrs, CNodeLiveWriter::m_stats.m_totalAttrs, m_tableAttrSets.GetNumSets(), m_tableAttrSets.GetDataSize()/1024 ); { uint32 totalSize = m_mainBuffer.GetDataSize() + m_tableAttrNames.GetDataSize() + m_tableStrData.GetDataSize() + m_tableTags.GetDataSize() + sizeof( SFileHeader ) + m_tableAttrSets.GetDataSize(); CryLog("size: total: %d (%d kb) nodes basic info: %d attr: %d tagsStringTable: %d attrStringTable: %d dataStringTable: %d attrSets: %d", totalSize, totalSize/1024, CNodeLiveWriter::m_stats.m_totalSizeNodeData, CNodeLiveWriter::m_stats.m_totalSizeAttrData, m_tableTags.GetDataSize(), m_tableAttrNames.GetDataSize(), m_tableStrData.GetDataSize(), m_tableAttrSets.GetDataSize() ); } CryLog("-------------------"); }
CNodeLiveWriter* CWriter::CreateAndAddLiveNode( const char* pName ) { assert( m_firstFreeLiveNode<m_liveNodes.size() ); // create and place in vector NodeLiveID ID = m_firstFreeLiveNode; StringID stringID = m_tableTags.GetStringID( pName ); CNodeLiveWriter* pNode = m_liveNodes[ID]; if (!pNode) { pNode = new CNodeLiveWriter( *this, ID, stringID, m_safecheckIDCounter ); m_liveNodes[ID] = pNode; } else pNode->Reuse( stringID, m_safecheckIDCounter ); m_safecheckIDCounter++; // find the now first free live node bool found = false; for (int i=m_firstFreeLiveNode+1; i<m_liveNodes.size(); ++i) { CNodeLiveWriter* pNodeIter = m_liveNodes[i]; if (pNodeIter==NULL || !pNodeIter->IsValid()) { found = true; m_firstFreeLiveNode = i; break; } } assert( found ); return pNode; }