/// <summary> /// Adds the reference to the AddressSpace. /// </summary> /// <param name="sourceIndex">Index of the source element that must be registered before this method is called.</param> /// <param name="referenceTypeName">Name of the reference type.</param> /// <param name="inverse">if set to <c>true</c> it is inverse reference.</param> /// <param name="targetIndex">Index of the target.</param> internal void AddReference(int sourceIndex, XmlQualifiedName referenceTypeName, bool inverse, int targetIndex) { if (referenceTypeName == null || referenceTypeName.IsEmpty || String.IsNullOrEmpty(referenceTypeName.Name)) { Assert(false, sourceIndex, "Reference type name cannot be null or empty"); } string name = referenceTypeName.Name; if (!inverse) { foreach (AddressSpace.ReferencesTableRow rowInRefTable in m_AddressSpace.ReferencesTable) { if ((rowInRefTable.TargetNodeIndex == targetIndex) && (rowInRefTable.SourceNodeIndex == sourceIndex) && (rowInRefTable.Name == name)) { return; } } } else { foreach (AddressSpace.ReferencesTableRow rowInRefTable in m_AddressSpace.ReferencesTable) { if ((rowInRefTable.TargetNodeIndex == sourceIndex) && (rowInRefTable.SourceNodeIndex == targetIndex) && (rowInRefTable.Name == name)) { return; } } } AddressSpace.ReferencesTableRow _newRow = m_AddressSpace.ReferencesTable.NewReferencesTableRow(); _newRow.ReferenceTypeIndex = TryGetAndAddIfNeeded(referenceTypeName.ToString()); if (inverse) { _newRow.SourceNodeIndex = targetIndex; _newRow.TargetNodeIndex = sourceIndex; } else { _newRow.SourceNodeIndex = sourceIndex; _newRow.TargetNodeIndex = targetIndex; } _newRow.Name = name; m_AddressSpace.ReferencesTable.AddReferencesTableRow(_newRow); }
private AddressSpaceElement(AddressSpace.ReferencesTableRow reference, AddressSpace.NodesTableRow node, AddressSpaceCompiler parent) { m_ReferenceRow = reference; m_NodeRow = node; m_parent = parent; }