@@ -21,7 +21,7 @@ public abstract class nanoReferenceTableBase<T> : InanoTable
2121 /// <summary>
2222 /// Lookup table for finding item ID by item value.
2323 /// </summary>
24- private readonly Dictionary < T , ushort > _idsByItemsDictionary ;
24+ private Dictionary < T , ushort > _idsByItemsDictionary ;
2525
2626 /// <summary>
2727 /// Assembly tables context - contains all tables used for building target assembly.
@@ -31,10 +31,12 @@ public abstract class nanoReferenceTableBase<T> : InanoTable
3131 /// <summary>
3232 /// Lookup table for finding item ID by item value.
3333 /// </summary>
34- protected readonly IEnumerable < T > _items ;
34+ protected IEnumerable < T > _items ;
3535
3636 public IEnumerable < T > Items => _items ;
3737
38+ private readonly IEqualityComparer < T > _comparer ;
39+
3840 /// <summary>
3941 /// Creates new instance of <see cref="nanoReferenceTableBase{T}"/> object.
4042 /// </summary>
@@ -55,47 +57,26 @@ protected nanoReferenceTableBase(
5557
5658 _context = context ;
5759
60+ _comparer = comparer ;
61+
5862 _items = nanoTableItems ;
5963 }
6064
6165 /// <inheritdoc/>
6266 public void Write (
6367 nanoBinaryWriter writer )
64- {
65- if ( _context . UsedElements != null )
66- {
67- foreach ( var item in _idsByItemsDictionary
68- . Where ( item => _context . UsedElements . Contains ( ( ( IMetadataTokenProvider ) item . Key ) . MetadataToken ) )
69- . OrderBy ( item => item . Value )
70- . Select ( item => item . Key ) )
71- {
72- WriteSingleItem ( writer , item ) ;
73- }
74- }
75- else
76- {
77- foreach ( var item in _idsByItemsDictionary
78- . OrderBy ( item => item . Value )
79- . Select ( item => item . Key ) )
80- {
81- WriteSingleItem ( writer , item ) ;
82- }
83- }
84- }
85-
86- public void ForEachItems ( Action < uint , T > action )
8768 {
8869 foreach ( var item in _idsByItemsDictionary
89- . OrderBy ( item => item . Value ) )
70+ . OrderBy ( item => item . Value )
71+ . Select ( item => item . Key ) )
9072 {
91- action ( item . Value , item . Key ) ;
73+ WriteSingleItem ( writer , item ) ;
9274 }
9375 }
9476
95- public void ForEachItemInUse ( Action < uint , T > action )
77+ public void ForEachItems ( Action < uint , T > action )
9678 {
9779 foreach ( var item in _idsByItemsDictionary
98- . Where ( item => _context . UsedElements . Contains ( ( ( IMetadataTokenProvider ) item . Key ) . MetadataToken ) )
9980 . OrderBy ( item => item . Value ) )
10081 {
10182 action ( item . Value , item . Key ) ;
@@ -114,16 +95,6 @@ public void AllocateStrings()
11495 AllocateSingleItemStrings ( item ) ;
11596 }
11697 }
117- public void AllocateStringsInUse ( )
118- {
119- foreach ( var item in _idsByItemsDictionary
120- . Where ( item => _context . UsedElements . Contains ( ( ( IMetadataTokenProvider ) item . Key ) . MetadataToken ) )
121- . OrderBy ( item => item . Value )
122- . Select ( item => item . Key ) )
123- {
124- AllocateSingleItemStrings ( item ) ;
125- }
126- }
12798
12899 /// <summary>
129100 /// Writes string reference ID related to passed string value into output stream.
@@ -179,28 +150,25 @@ protected abstract void WriteSingleItem(
179150 nanoBinaryWriter writer ,
180151 T item ) ;
181152
182- public IEnumerable < T > GetUsedItems ( )
153+ /// <summary>
154+ /// Remove unused items from table.
155+ /// </summary>
156+ public void RemoveUnusedItems ( HashSet < MetadataToken > set )
183157 {
158+ // build a collection of the current items that are present in the used items set
184159 List < T > usedItems = new List < T > ( ) ;
185160
186- if ( _context . UsedElements != null )
187- {
188-
189- foreach ( var item in _idsByItemsDictionary
190- . Where ( item => _context . UsedElements . Contains ( ( ( IMetadataTokenProvider ) item . Key ) . MetadataToken ) ) )
191- {
192- usedItems . Add ( item . Key ) ;
193- }
194- }
195- else
161+ foreach ( var item in _idsByItemsDictionary
162+ . Where ( item => set . Contains ( ( ( IMetadataTokenProvider ) item . Key ) . MetadataToken ) ) )
196163 {
197- foreach ( var item in _idsByItemsDictionary )
198- {
199- usedItems . Add ( item . Key ) ;
200- }
164+ usedItems . Add ( item . Key ) ;
201165 }
202166
203- return usedItems ;
167+ // re-create the items dictionary with the used items only
168+ _idsByItemsDictionary = usedItems
169+ . Select ( ( reference , index ) => new { reference , index } )
170+ . ToDictionary ( item => item . reference , item => ( ushort ) item . index ,
171+ _comparer ) ;
204172 }
205173 }
206174}
0 commit comments