예제 #1
0
        /// <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);
        }
예제 #2
0
 private AddressSpaceElement(AddressSpace.ReferencesTableRow reference, AddressSpace.NodesTableRow node, AddressSpaceCompiler parent)
 {
     m_ReferenceRow = reference;
     m_NodeRow      = node;
     m_parent       = parent;
 }